You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

3694 lines
186 KiB

!function(window) {
function ActionItemsResolver() {
function isArDrillthroughLink(link) {
return null === link || void 0 === link ? !1 : link.match("javascript") && link.match(".goToReport");
}
function getElementData(element, attributeName) {
var data = element.attr(attributeName);
return null === data || void 0 === data || 0 === data.length ? null : decodeURI(data);
}
function resolveBookmarkInfo(data) {
function extractByKey(array, key, separator) {
for (var i = 0; i < array.length; i++) {
var elem = array[i], preffix = elem.substring(0, key.length);
if (preffix.toUpperCase() === key.toUpperCase()) return elem.substring(key.length + separator.length, elem.length);
}
return null;
}
if (null === data || void 0 === data) return null;
var bookmarkInfo = data.split(","), pageNumberValue = extractByKey(bookmarkInfo, "PageNumber", "=");
if (null === pageNumberValue) return null;
pageNumberValue = parseInt(pageNumberValue, 10);
var targetValue = extractByKey(bookmarkInfo, "Target", "=");
return null === targetValue ? null : {
PageNumber: pageNumberValue,
Target: targetValue
};
}
function resolveToggleInfo(data) {
var parsedData;
try {
parsedData = $.parseJSON(data);
} catch (ex) {
return null;
}
return null === parsedData || void 0 === parsedData ? null : parsedData;
}
function resolvePageReportElementAction(element) {
var dataValue = htmlDecode(getElementData(element, "data")), hrefValue = htmlDecode(getElementData(element, "href"));
if (null === dataValue && null === hrefValue) return null;
var bookmarkInfo = resolveBookmarkInfo(dataValue);
if (null === bookmarkInfo && (bookmarkInfo = resolveBookmarkInfo(hrefValue)), null !== bookmarkInfo) return {
actionType: ActionType.bookmark,
reportType: ReportType.pageReport,
element: element,
pageNumber: bookmarkInfo.PageNumber,
target: bookmarkInfo.Target
};
if (element.is("[class$=toggle]")) {
var toggleInfo = resolveToggleInfo(dataValue);
if (null !== toggleInfo) return {
actionType: ActionType.toggle,
reportType: ReportType.pageReport,
element: element,
toggleInfo: toggleInfo
};
}
var drillthroughInfo = null !== dataValue ? dataValue : null !== hrefValue ? hrefValue : null;
if (element.is("[class$=drillthrough]") || isArDrillthroughLink(drillthroughInfo)) return {
actionType: ActionType.drillthrough,
reportType: ReportType.pageReport,
element: element,
drillthroughLink: drillthroughInfo
};
var hyperlinkUrl = null !== dataValue ? dataValue : null !== hrefValue ? hrefValue : null;
return null !== hyperlinkUrl ? {
actionType: ActionType.hyperlink,
reportType: ReportType.pageReport,
element: element,
url: hyperlinkUrl
} : null;
}
function htmlDecode(value) {
return value ? $("<div />").html(value).text() : null;
}
function resolveFromPageReportContent(content) {
return $(content).find("a").map(function(index, item) {
return resolvePageReportElementAction($(item));
}).filter(function(item) {
return null !== item;
}).get().concat($(content).find("map > area").map(function(index, item) {
return resolvePageReportElementAction($(item));
}).filter(function(item) {
return null !== item;
}).get()).concat($(content).find("span").map(function(index, item) {
return resolvePageReportElementAction($(item));
}).filter(function(item) {
return null !== item;
}).get());
}
function resolveFromSectionReportContent(content) {
return $(content).find("a").map(function(index, item) {
var element = $(item), url = getElementData(element, "href");
if (null === url) return !0;
var sectionBookmarkLabel = /^toc?:\/\/(.*)/i.exec(url);
return null !== sectionBookmarkLabel ? {
actionType: ActionType.bookmark,
reportType: ReportType.sectionReport,
element: element,
label: sectionBookmarkLabel[1]
} : {
actionType: ActionType.hyperlink,
reportType: ReportType.sectionReport,
element: element,
url: url
};
}).filter(function(item) {
return null !== item;
}).get();
}
function resolve(content, reportType) {
switch (reportType) {
case ReportType.pageReport:
return resolveFromPageReportContent(content);
case ReportType.sectionReport:
return resolveFromSectionReportContent(content);
default:
return [];
}
}
var resolver = {
resolve: resolve
};
return resolver;
}
function parseParameterValue(value, type) {
if (null === value) return null;
if (type == ServiceParameterType.DateTime) {
var millis = (+value - ticksOffsetFromUnixEpoch) / ticksInMillisecond, millisUtc = millis + new Date(millis).getTimezoneOffset() * millisecondsInMinute;
return new Date(millisUtc);
}
return value;
}
function ar_convertServiceParameters(parameters) {
function convertValues(values, type) {
return (values || []).map(function(v) {
return {
label: v.Label,
value: parseParameterValue(v.Value, type)
};
});
}
function resolveEditor(p) {
return p.MultiLine && p.ParameterType == ServiceParameterType.String ? ParameterEditorType.MultiLine : p.AvailableValues && p.AvailableValues.length > 0 ? p.MultiValue ? ParameterEditorType.MultiValue : ParameterEditorType.SelectOneFromMany : ParameterEditorType.SingleValue;
}
var ServiceParameterState = {
Ok: 0,
ExpectValue: 1,
HasOutstandingDependencies: 2,
ValidationFailed: 3,
DynamicValuesUnavailable: 4
};
return parameters.map(function(p) {
return {
name: p.Name,
value: parseParameterValue(p.Value, p.ParameterType),
values: convertValues(p.Values, p.ParameterType),
availableValues: convertValues(p.AvailableValues, p.ParameterType),
prompt: p.Prompt || p.Name,
nullable: !!p.Nullable,
multiline: !!p.MultiLine,
multivalue: !!p.MultiValue,
allowEmpty: !!p.AllowEmpty,
dateOnly: !!p.DateOnly,
type: function(value) {
switch (value) {
case ServiceParameterType.DateTime:
return ParameterType.DateTime;
case ServiceParameterType.Bool:
return ParameterType.Bool;
case ServiceParameterType.Int:
return ParameterType.Int;
case ServiceParameterType.Float:
return ParameterType.Float;
default:
return ParameterType.String;
}
}(p.ParameterType),
state: function(value) {
switch (value) {
case ServiceParameterState.ExpectValue:
return ParameterState.ExpectValue;
case ServiceParameterState.HasOutstandingDependencies:
return ParameterState.HasOutstandingDependencies;
case ServiceParameterState.ValidationFailed:
return ParameterState.ValidationFailed;
case ServiceParameterState.DynamicValuesUnavailable:
return ParameterState.DynamicValuesUnavailable;
default:
return ParameterState.Ok;
}
}(p.State),
error: p.ExtendedErrorInfo || "",
editor: resolveEditor(p),
dependantParameters: (p.DependantParameters || []).map(function(dependant) {
return dependant.Name;
})
};
});
}
function ar_convertClientParameters(parameters) {
return parameters.map(ar_convertClientParameter);
}
function ar_convertClientParameter(p) {
function serialize(value) {
if (value && value.getMonth) {
var millisLocal = value.getTime() - value.getTimezoneOffset() * millisecondsInMinute;
return millisLocal * ticksInMillisecond + ticksOffsetFromUnixEpoch;
}
return value;
}
function convertValues(values) {
return (values || []).map(function(v) {
return {
Label: v.label || "",
Value: serialize(v.hasOwnProperty("value") ? v.value : v)
};
});
}
return p.multivalue ? {
MultiValue: !0,
Name: p.name,
Values: convertValues(p.values)
} : {
Name: p.name,
Value: serialize(p.value)
};
}
function ArReportService(options, resourceManager) {
function isUndefined(value) {
return void 0 === value || null === value;
}
function open(reportId, parameters) {
return $base.post("OpenReport", {
version: 2,
culture: "en_US",
reportPath: reportId,
acceptedFormats: [ formats.Html ],
lifeTime: 600
}).then(function(d) {
if (isUndefined(d.Token)) return $base.invalidResponse(d);
var reportInfo = {
token: d.Token,
parameters: ar_convertServiceParameters(d.ParameterCollection || []),
reportType: getReportType(reportId),
autoRun: d.AutoRun
};
if (parameters && parameters.length) {
var def = $.Deferred();
return parameters = mergeParameters(reportInfo.parameters, parameters), validateParameters(reportInfo.token, parameters).done(function(params) {
def.resolve($.extend(reportInfo, {
parameters: params
}));
}).fail(function() {
def.resolve(reportInfo);
}), def.promise();
}
return reportInfo;
});
}
function openDrillthroughReport(token, reportId) {
return $base.post("OpenDrillthroughReport", {
token: token,
reportPath: reportId,
lifeTime: 3600
}).then(function(d) {
return isUndefined(d.Token) ? $base.invalidResponse(d) : {
token: d.Token,
parameters: ar_convertServiceParameters(d.ParameterCollection || []),
reportType: getReportType(reportId),
autoRun: d.AutoRun
};
});
}
function ping(reportToken) {
return $base.post("GetStatus", {
token: reportToken
}).then(function(d) {
var state = d.LoadState;
if (isUndefined(state) || isUndefined(d.AvailablePages)) return $base.promise(!1);
switch (state) {
case loadStates.Error:
case loadStates.Cancelled:
case loadStates.Cancelling:
return $base.promise(!1);
}
return $base.promise(!0);
});
}
function getReportType(reportId) {
if (null === reportId || void 0 === reportId) return ReportType.unknown;
var reportNameExtension = reportId.split(".").pop();
switch (reportNameExtension.toLowerCase()) {
case "rdl":
case "rdlx":
return ReportType.pageReport;
case "rpx":
return ReportType.sectionReport;
default:
return ReportType.unknown;
}
}
function close(reportToken, async) {
return $base.post("CloseReport", {
token: reportToken
}, !1, async).then(function() {
return !0;
});
}
function validateParameters(reportToken, parameters) {
return $base.post("SetParameters", {
token: reportToken,
parametersSetAtClient: ar_convertClientParameters(parameters)
}, !0).then(function(d) {
var failedParams = ar_convertServiceParameters(d.ParameterCollection || []);
return parameters.map(function(p) {
var f = failedParams.filter(function(fp) {
return fp.name == p.name;
});
return 1 == f.length ? f[0] : (p.state = ParameterState.Ok, p.error = "", p);
});
});
}
function validateParameter(reportToken, parameter) {
return $base.post("ValidateParameter", {
token: reportToken,
surrogate: ar_convertClientParameter(parameter)
}).then(function(d) {
return ar_convertServiceParameters(d.ParameterCollection || []);
});
}
function areValidParameters(parameters) {
return parameters.every(function(p) {
return p.state == ParameterState.Ok;
});
}
function run(reportToken, parameters) {
return parameters && parameters.length > 0 ? validateParameters(reportToken, parameters).then(function(params) {
return areValidParameters(params) ? runImpl(reportToken) : $base.errorPromise(SR("error.InvalidParameters"));
}) : runImpl(reportToken);
}
function runImpl(reportToken) {
return $base.post("RunReport", {
token: reportToken
}).then(function() {
return pollStatus(reportToken);
}).then(function() {
return getDocumentUrl(reportToken);
});
}
function pollStatus(reportToken, returnPagesCount) {
return $base.delay(getStatus.bind(service, reportToken), pollingTimeout).then(function(status) {
return returnPagesCount ? status.pageCount : status.pageCount > 0 || pollStatus(reportToken);
});
}
function getStatus(reportToken) {
return $base.post("GetStatus", {
token: reportToken
}).then(function(d) {
var state = d.LoadState;
if (isUndefined(state) || isUndefined(d.AvailablePages)) return $base.errorPromise(SR("error.InvalidResponse"));
switch (state) {
case loadStates.Error:
return $base.errorPromise(SR("error.RequestFailed"));
case loadStates.Cancelled:
case loadStates.Cancelling:
return $base.errorPromise(SR("error.RequestCancelled"));
}
return {
state: state,
pageCount: d.AvailablePages
};
});
}
function getPageCount(doctoken) {
function getPageCountImpl() {
getStatus(reportToken).done(function(status) {
status.state == loadStates.Completed ? def.resolve(status.pageCount) : (def.notify(status.pageCount),
setTimeout(getPageCountImpl, pollingTimeout));
}).fail(function(problem) {
def.reject(problem);
});
}
var reportToken = resolveReportToken(doctoken);
if (!reportToken) return $base.invalidArg("doctoken", doctoken);
var def = $.Deferred();
return getPageCountImpl(), def.promise();
}
function getPage(doctoken, index) {
if (!resolveReportToken(doctoken)) return $base.invalidArg("doctoken", doctoken);
var urlTemplate = "{0}&Page={1}", pageUrl = urlTemplate.format(doctoken, index + 1);
return $base.get(pageUrl);
}
function getDocumentUrl(reportToken) {
return $base.post("GetRenderedReportLink", {
token: reportToken
}).then(function(d) {
var link = d.ReportLink;
if (isUndefined(link) || isUndefined(link.Uri)) return $base.invalidResponse(d);
var url = link.Uri;
return url || resolveReportToken(url) ? url + "&WebViewerControlClientId=html5viewer&HtmlViewer=true" : $base.invalidResponse(d);
});
}
function getToc(doctoken) {
var reportToken = resolveReportToken(doctoken);
return reportToken ? loadBookmarks(reportToken, -1).then(function(bookmarks) {
return {
name: "$root",
kids: bookmarks
};
}) : $base.invalidArg("doctoken", doctoken);
}
function getBookmarks(token, parent, fromChild, count) {
return $base.post("GetBookmarks", {
token: token,
parentId: parent,
fromChild: fromChild,
count: count
}).then(function(d) {
var bookmarks = (d.Bookmarks || []).map(function(b) {
var id = b.ID || 0, childCount = b.ChildrenCount || 0, location = b.Location || {
X: 0,
Y: 0
}, kids = [];
return childCount > 0 && (kids = function() {
return loadBookmarks(token, id);
}), {
name: b.Name || "",
page: b.Page || 0,
location: {
left: location.X,
top: location.Y
},
isLeaf: 0 === childCount,
kids: kids
};
});
return bookmarks.childCount = d.ChildrenCount || 0, bookmarks;
});
}
function loadBookmarks(token, parent) {
return loadBookmarksImpl(token, parent, 0).then(function(bookmarks) {
return delete bookmarks.childCount, bookmarks;
});
}
function toggle(token, toggleInfo) {
return $base.post("ProcessOnClick", {
token: token,
data: toggleInfo
}).then(function() {
return pollStatus(token, !0);
}).then(function(pagesCount) {
return getDocumentUrl(token).then(function(url) {
var info = {
url: url,
pagesCount: pagesCount
};
return info;
});
});
}
function loadBookmarksImpl(token, parent, fromChild) {
return getBookmarks(token, parent, fromChild, 100).then(function(kids) {
var loadCount = fromChild + kids.length;
return loadCount >= kids.childCount || loadCount >= maxBookmarksCount ? kids : loadBookmarksImpl(token, parent, loadCount).then(function(next) {
return kids.concat(next);
});
});
}
function resolveReportToken(url) {
return getQueryParameter(url, "token");
}
function getExportUri(doctoken, exportType, settings) {
var reportToken = resolveReportToken(doctoken);
return reportToken ? $base.post("GetExportedReportLink", {
token: reportToken,
format: exportType,
exportingParameters: settings,
pageRange: null
}).then(function(d) {
var link = d.ReportLink;
if (isUndefined(link) || isUndefined(link.Uri)) return $base.invalidResponse(d);
var url = link.Uri;
return url || resolveReportToken(url) ? url : $base.invalidResponse(d);
}) : $base.invalidArg("doctoken", doctoken);
}
function exportImpl(doctoken, exportType, settings) {
function translateSettings(ss) {
var newSettings = {};
return Object.keys(ss || {}).forEach(function(key) {
var val = ss[key];
switch (key) {
case "saveAsDialog":
val && (newSettings.SaveAsDialog = "true");
break;
case "printing":
val && (exportType == ExportType.Pdf ? newSettings.PrintOnOpen = !0 : exportType == ExportType.Html && (newSettings.WebViewer = !0,
newSettings.Printing = !0));
break;
default:
newSettings[key] = val;
}
}), newSettings;
}
return getPageCount(doctoken).then(function(pc) {
if (0 >= pc) throw new Error("document cannot be exported");
return getExportUri(doctoken, exportType, translateSettings(settings));
});
}
function search(token, searchOptions) {
var maxSearchResults = searchOptions.maxSearchResults || options.maxSearchResults || defaultMaxSearchResults, reportToken = resolveReportToken(token);
return reportToken ? $base.post("Search", {
token: reportToken,
options: {
Text: searchOptions.text,
MatchCase: searchOptions.matchCase,
WholeWord: searchOptions.wholePhrase,
SearchBackward: !1
},
startFrom: searchOptions.from ? {
ItemIndex: searchOptions.from.idx,
TextLen: 1,
PageIndex: searchOptions.from.page
} : {
PageIndex: -1
},
numberOfResults: maxSearchResults
}).then(function(d) {
return {
hasMore: d.SearchResults.length == maxSearchResults,
matches: d.SearchResults.map(function(sr) {
return {
idx: sr.ItemIndex,
text: sr.DisplayText,
page: sr.PageIndex,
location: {
left: sr.ItemArea.X,
top: sr.ItemArea.Y
}
};
})
};
}) : $base.invalidArg("token", token);
}
function drillthrough(token, link) {
var drillInfo = parseDrillthroughLink(link);
return drillInfo && drillInfo.reportName ? openDrillthrough(token, drillInfo.reportName, drillInfo.parameters) : $base.errorPromise(SR("error.InvalidDrillthroughLink").format(link));
}
function openDrillthrough(token, reportPath, parameters) {
return openDrillthroughReport(token, reportPath).then(function(r) {
function run() {
return runImpl(r.token).then(function(documentToken) {
return {
reportToken: r.token,
parameters: params,
documentToken: documentToken
};
});
}
function findAndUpdateValue(parameter, clientParams) {
var cp = clientParams.filter(function(x) {
return x.name == parameter.name;
});
return updateValue(parameter, cp[0]);
}
function resolveDependencies(dependencies) {
return $.Deferred(function(deferred) {
if (dependencies.length > 0) {
var dependecy = dependencies.pop();
validateParameter(r.token, dependecy).then(function(updated) {
return params = params.map(function(p) {
var f = updated.filter(function(u) {
return u.name == p.name;
});
return 1 == f.length ? findAndUpdateValue(f[0], parameters) : p;
}), resolveDependencies(dependencies);
}).done(deferred.resolve).fail(deferred.reject);
} else deferred.resolve();
}).promise();
}
function resolveDependantParameters() {
return $.Deferred(function(deferred) {
var dependantParameters = params.filter(function(p) {
return p.state == ParameterState.HasOutstandingDependencies;
});
if (dependantParameters.length > 0) {
var dependant = dependantParameters[0], dependencies = params.filter(function(p) {
return p.dependantParameters && -1 != p.dependantParameters.indexOf(dependant.name);
});
dependencies.length > 0 ? resolveDependencies(dependencies).then(resolveDependantParameters).done(deferred.resolve).fail(deferred.reject) : deferred.reject();
} else deferred.resolve();
}).promise();
}
var params = mergeParameters(r.parameters, parameters);
return params && params.length > 0 ? resolveDependantParameters().then(function() {
return validateParameters(r.token, params);
}).then(function(p) {
return areValidParameters(p) && r.autoRun ? run() : {
reportToken: r.token,
parameters: params
};
}) : run();
});
}
function updateValue(parameter, clientParameter) {
function convertValue(value, type) {
if (type == ParameterType.DateTime) {
if ("" === value) return null;
if (!Date.isDate(value)) {
var d = new Date();
return d.setTime(Date.parse(value)), isNaN(d) && (d = parseParameterValue(value, ServiceParameterType.DateTime)),
d;
}
return value;
}
return value;
}
return void 0 === clientParameter || null === clientParameter ? parameter : (parameter.multivalue ? clientParameter.values ? parameter.values = clientParameter.values : (parameter.values.length > 0 && (parameter.values = []),
parameter.values.push(convertValue(clientParameter.value, parameter.type))) : parameter.value = convertValue(clientParameter.value, parameter.type),
parameter);
}
function mergeParameters(reportParams, clientParams) {
var names = [], merged = reportParams.map(function(p) {
names.push(p.name);
var cp = clientParams.filter(function(clientParameter) {
return p.name == clientParameter.name;
});
return 0 === cp.length ? p : updateValue(p, cp[0]);
});
return merged.push.apply(merged, clientParams.filter(function(p) {
return -1 == names.indexOf(p.name);
}).map(function(p) {
return void 0 === p.promptUser && (p.promptUser = !1), p;
})), merged;
}
function parseDrillthroughLink(link) {
function GetViewModel(id) {
return reportName = id, {
goToReport: function(reportName, pp) {
xreportName = reportName;
for (var i in pp) params.push({
name: i,
value: pp[i]
});
}
};
}
var xreportName = "", params = [];
try {
var re = new RegExp("&quot;", "g");
link = link.replace(re, '"'), eval(link);
} catch (e) {
return null;
}
return {
reportName: xreportName,
parameters: params
};
}
if (!options.url) throw new Error("options has no valid url");
var defaultMaxSearchResults = 50, pagesPollingTimeout = 1e3, pollingTimeout = options.pollingTimeout || pagesPollingTimeout, serviceUrl = options.url;
serviceUrl.endsWith("/") || (serviceUrl += "/");
var SR = resourceManager && $.isFunction(resourceManager.get) ? resourceManager.get : identity, formats = {
Rdf: 0,
Ddf: 1,
Xaml: 2,
Image: 3,
Pdf: 4,
Html: 5,
Word: 6,
Xls: 7,
Xml: 8
}, loadStates = {
NotStarted: 0,
InProgress: 1,
Completed: 2,
Cancelling: 3,
Cancelled: 4,
Error: 5
}, service = {
open: open,
close: close,
toggle: toggle,
run: run,
validateParameters: validateParameters,
validateParameter: validateParameter,
validateParameterSupported: function() {
return !0;
},
getPageCount: getPageCount,
getPage: getPage,
getToc: getToc,
"export": exportImpl,
search: search,
drillthrough: drillthrough,
ping: ping
}, $base = ReportServiceBase(service, serviceUrl), maxBookmarksCount = 1e5;
return service;
}
function ars_convertClientParameters(parameters) {
function convertValue(value) {
return Date.isDate(value) ? Date.format(value, "MM/dd/yyyy HH:mm:ss") : value;
}
var paramDomain = {
specifiedValues: 0,
selectAll: 1,
acceptingDynamicValues: 2
};
return (parameters || []).map(function(p) {
if (p.multivalue) {
var values = p.values.map(function(pv) {
return convertValue(pv.hasOwnProperty("value") ? pv.value : pv);
}).filter(function(v) {
return null !== v && void 0 !== v;
});
return 1 == values.length && values[0] == ParameterSpecialValue.SelectAll ? {
Name: p.name,
Domain: paramDomain.selectAll,
Values: []
} : {
Name: p.name,
Domain: paramDomain.specifiedValues,
Values: values
};
}
return {
Name: p.name,
Domain: paramDomain.specifiedValues,
Values: [ convertValue(p.value) ].filter(function(v) {
return null !== v && void 0 !== v;
})
};
});
}
function ars_parseParametersXml(xml) {
function convertDataType(value) {
var map = {
string: ParameterType.String,
"boolean": ParameterType.Bool,
bool: ParameterType.Bool,
datetime: ParameterType.DateTime,
integer: ParameterType.Int,
"int": ParameterType.Int,
"float": ParameterType.Float
};
return map[(value || "").toLowerCase()] || ParameterType.String;
}
function convertState(value) {
var map = {
hasvalidvalue: ParameterState.Ok,
missingvalidvalue: ParameterState.ExpectValue,
hasoutstandingdependencies: ParameterState.HasOutstandingDependencies,
dynamicvaluesunavailable: ParameterState.DynamicValuesUnavailable
};
return map[(value || "").toLowerCase()] || ParameterState.Ok;
}
function parseValue(value, type) {
if (null === value) return null;
switch (type) {
case ParameterType.Bool:
return Boolean.parse(value);
case ParameterType.Int:
case ParameterType.Float:
return "" === value ? null : +value;
case ParameterType.DateTime:
if ("" === value) return null;
if (!Date.isDate(value)) {
var d = new Date();
return d.setTime(Date.parse(value)), d;
}
return value;
}
return value;
}
function parseValuesElement(e, parameter) {
return $(e).children().map(function() {
var $this = $(this), stringValue = $this.text(), attrs = $this.attrs(), isSpecial = Boolean.parse(attrs.isspecial);
return isSpecial ? {
label: attrs.label || stringValue,
value: function() {
switch (stringValue.toLowerCase()) {
case "blank":
case "empty":
return parameter.type == ParameterType.String ? "" : null;
case "null":
return null;
case "unspecified":
return parameter.nullable ? null : void 0;
case "selectall":
return ParameterSpecialValue.SelectAll;
default:
return stringValue;
}
}()
} : {
label: attrs.label || stringValue,
value: parseValue(stringValue, parameter.type)
};
}).get();
}
function resolveEditor(p) {
return p.multiline && p.type == ParameterType.String ? ParameterEditorType.MultiLine : p.multivalue ? ParameterEditorType.MultiValue : p.definesValidValues && p.availableValues.length > 0 ? ParameterEditorType.SelectOneFromMany : ParameterEditorType.SingleValue;
}
function isDateOnlyDateDomain(dateDomain) {
return "Day" == dateDomain || "Month" == dateDomain || "MonthFixedYear" == dateDomain || "Year" == dateDomain;
}
return $(xml).find("Parameter").map(function() {
var $this = $(this), attrs = $this.attrs(), multivalue = Boolean.parse(attrs.multivalue), parameter = {
name: attrs.name || "",
type: convertDataType(attrs.datatype),
hidden: Boolean.parse(attrs.hidden),
multivalue: multivalue,
multiline: Boolean.parse(attrs.multiline || "false"),
allowEmpty: Boolean.parse(attrs.allowblank),
dateOnly: isDateOnlyDateDomain(attrs.datedomain),
nullable: Boolean.parse(attrs.nullable) && !multivalue,
prompt: attrs.prompt || attrs.name || "",
state: convertState(attrs.state),
promptUser: Boolean.parse(attrs.promptuser),
definesValidValues: Boolean.parse(attrs.definesvalidvalues),
selectAllEnabled: Boolean.parse(attrs.selectallenabled),
dateDomain: attrs.datedomain || ""
};
return $.each(this.childNodes, function() {
switch (this.nodeName.toLowerCase()) {
case "values":
parameter.values = parseValuesElement(this, parameter);
break;
case "validvalues":
parameter.availableValues = parseValuesElement(this, parameter);
}
}), parameter.state == ParameterState.Ok && parameter.values && 1 == parameter.values.length && "Unspecified" == parameter.values[0].label && (parameter.state = ParameterState.ExpectValue),
parameter.values = parameter.values || [], parameter.value = parameter.values.length ? parameter.values[0].value : null,
parameter.editor = resolveEditor(parameter), parameter.error = "", parameter;
}).get();
}
function ArsReportService(options, resourceManager) {
function documentBase(html) {
var doc = $("<div/>");
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(/&amp;/g, "&"), url = isAbsoluteUri(url) ? url : resourceHandler + url,
"background-image:url({0})".format(url);
}), style.text(text);
}
doc.find("img").each(function() {
var $this = $(this), src = $this.attr("src");
isBase64(src) || isAbsoluteUri(src) || (src += "&MobileGet=1", $this.attr("src", resourceHandler + src));
});
var tocUrl = doc.find("meta[name=tocUrl]").attr("content"), documentId = doc.find("meta[name=DocumentId]").attr("content");
return {
html: doc,
tocUrl: tocUrl,
documentId: documentId
};
}
function pageDocument(token, html) {
function getPage(index) {
var page = html.clone();
return page.children("div").children("div.page").not(function(i) {
return i == index;
}).remove(), page.html();
}
function exportType(extension) {
switch (extension) {
case "Xls":
return "Excel";
default:
return extension;
}
}
var $base = documentBase(html);
html = $base.html, html.find("div.page").children().filter(function() {
return "absolute" === $(this).css("position");
}).css("position", "relative").css("left", "").css("top", "");
var pages = html.find("div.page").length;
return $.extend($base, {
reportToken: token,
pages: pages,
getPage: getPage,
exportType: exportType
});
}
function sectionDocument(token, html) {
function getPage(index) {
var page = html.clone();
return page.children("div").not(function(i) {
return i == index;
}).remove(), page.html();
}
function exportType(extension) {
switch (extension) {
case "Xls":
return "Excel";
case "Word":
return "Rtf";
default:
return extension;
}
}
var $base = documentBase(html);
html = $base.html;
var pages = html.children("div").length;
return $.extend($base, {
reportToken: token,
pages: pages,
getPage: getPage,
exportType: exportType
});
}
function post(method, data) {
return data.token = securityToken, $base.post(method, data);
}
function open(reportId, parameters) {
var idrev = (reportId || "").split("."), version = null;
return 2 == idrev.length && (reportId = idrev[0], version = parseInt(idrev[1])),
post("Select", {}).then(function(list) {
var f = list.filter(function(d) {
return d.Id == reportId || d.Name.toLowerCase() == reportId.toLowerCase();
});
if (0 === f.length) return $base.errorPromise(SR("error.ReportNotFound").format(reportId));
var desc = f[0];
return version && (desc.Version = version), {
token: {
description: desc
},
parameters: [],
hasParameters: !!desc.IsParametrized,
reportType: getReportType(desc.ReportType),
autoRun: !0
};
}).then(function(report) {
return report.hasParameters || parameters && 0 !== parameters.length ? resolveParameters(report.token, parameters).then(function(resolvedParameters) {
return $.extend(report, {
parameters: resolvedParameters
});
}) : report;
});
}
function getReportType(arsReportType) {
return 1 === arsReportType || 3 === arsReportType ? ReportType.pageReport : 2 === arsReportType || 4 === arsReportType ? ReportType.sectionReport : ReportType.unknown;
}
function run(reportToken, parameters) {
var description = reportToken.description, renderOptions = {
ReportId: description.Id,
Name: description.Name,
ReportType: description.ReportType,
Extension: "Html",
ExtensionSettings: mapSettings({
Target: "Screen",
RenderMode: "Paginated",
NeedExportSupport: !0,
TocStream: !0
}),
ReportParameters: ars_convertClientParameters(parameters)
};
return runTask("RenderReport", description, renderOptions).then(loadResource).then(function(html) {
var document;
return document = description.ReportType == reportTypes.SectionReport || description.ReportType == reportTypes.CodeBasedReport ? sectionDocument(reportToken, html) : pageDocument(reportToken, html),
state.togglesHistory = new TogglesHistory(), state.documentId = document.documentId,
document;
});
}
function resolveParameters(reportToken, parameters) {
var description = reportToken.description, renderOptions = {
ReportId: description.Id,
Name: description.Name,
ReportType: description.ReportType,
Extension: "Html",
ReportParameters: ars_convertClientParameters(parameters)
};
return runTask("ResolveParameters", description, renderOptions).then(loadResource).then(function(resource) {
return ars_parseParametersXml(resource);
});
}
function mapSettings(settings) {
return Object.keys(settings || {}).map(function(key) {
return {
Key: key,
Value: null === settings[key] ? null : settings[key].toString()
};
});
}
function exportImpl(token, exportType, settings) {
function translateSettings(ss) {
var newSettings = {};
return Object.keys(ss || {}).forEach(function(key) {
var val = ss[key];
switch (key) {
case "printing":
val && (exportType == ExportType.Pdf ? newSettings.PrintOnOpen = !0 : exportType == ExportType.Html && (newSettings = $.extend(newSettings, {
WebViewer: !0,
MhtOutput: !1,
RenderTocTree: !1,
OutputTOC: !1,
Interactivity: !1,
RenderMode: "Paginated",
Pagination: !0,
StyleStream: !1,
IncludePageMargins: !1,
Printing: !0
})));
break;
default:
newSettings[key] = val;
}
}), newSettings;
}
if (!token) return $base.errorPromise(SR("error.InvalidReportToken"));
var description = token.reportToken.description, exportOptions = {
DocumentId: token.documentId ? token.documentId : state.documentId,
Extension: token.exportType(exportType),
ToggleHistory: state.togglesHistory.getSet(),
ExtensionSettings: mapSettings(translateSettings(settings))
};
return runTask("ExportDocument", description, exportOptions).then(function(url) {
return isAbsoluteUri(url) || (url = resourceHandler + url), url;
});
}
function runTask(method, description, taskOptions) {
return post(method, {
description: description,
options: taskOptions
}).then(getResourceId);
}
function validateParameters(reportToken, parameters) {
return resolveParameters(reportToken, parameters);
}
function getPageCount(document) {
return document ? $base.promise(document.pages || 1) : $base.errorPromise(SR("error.InvalidDocumentToken"));
}
function getPage(document, index) {
return document ? (index >= document.pages && (index = 0), $base.promise(document.getPage(index))) : $base.errorPromise(SR("error.InvalidDocumentToken"));
}
function getToc(document) {
if (!document) return $base.errorPromise(SR("error.InvalidDocumentToken"));
var tocUrl = document.tocUrl;
return tocUrl ? (tocUrl += "&MobileGet=1", getResource(tocUrl, !0).then(function(toc) {
return toc;
}).fail(function() {
return emptyToc();
})) : emptyToc();
}
function emptyToc() {
return $base.promise({
name: "$root",
kids: []
});
}
function getResourceId(requestResult) {
var requestInfo = requestResult.Info;
switch (requestInfo.State) {
case requestStates.Unavailable:
case requestStates.Rejected:
var err = (requestInfo.Exception || {}).Message || "";
return $base.errorPromise(SR("error.RequestRejected") + " " + err);
case requestStates.Cancelled:
return $base.errorPromise(SR("error.RequestCancelled"));
case requestStates.Pending:
case requestStates.Running:
return $base.delay(function() {
return post("GetRequestStatus", {
requestId: requestInfo.RequestId
});
}, pollingTimeout).then(getResourceId);
default:
return encodeURI(requestInfo.PrimaryUrl + "&MobileGet=1");
}
}
function loadResource(url) {
return getResource(url).then(function(data, textStatus, xhr) {
if (206 == xhr.status) {
var xml = $(data), requestId = xml.find("RequestId").text();
return requestId ? getResourceId({
Info: {
State: requestStates.Running,
RequestId: requestId
}
}).then(loadResource) : $base.errorPromise(SR("error.InvalidRequestId"));
}
return data;
});
}
function getResource(url, json) {
return url += "&NoWrapper=1", isAbsoluteUri(url) || (url = resourceHandler + url),
json ? $base.getJson(url) : $base.get(url);
}
function toggle(token, toggleInfo) {
state.togglesHistory.toggle(toggleInfo.Data);
var description = token.description, renderOptions = {
DocumentId: state.documentId,
Name: description.Name,
ReportType: description.ReportType,
ToggleHistory: state.togglesHistory.getSet(),
Extension: "Html",
ExtensionSettings: mapSettings({
RenderMode: "Paginated",
NeedExportSupport: !0,
TocStream: !0,
IncludePageMargins: !0
})
};
return runTask("ExportDocument", description, renderOptions).then(loadResource).then(function(html) {
return description.ReportType == reportTypes.SectionReport || description.ReportType == reportTypes.CodeBasedReport ? {
url: sectionDocument(token, html)
} : {
url: pageDocument(token, html)
};
});
}
function drillthrough(token, link) {
var drillInfo = parseDrillthroughLink(link);
return drillInfo && drillInfo.reportName ? openDrillthrough(token, drillInfo.reportName, drillInfo.params) : $base.errorPromise(SR("error.InvalidDrillthroughLink").format(link));
}
function parseDrillthroughLink(link) {
function parseParameters(str) {
var result = [], parameters = splitEscaped(str, ";");
return parameters.forEach(function(parameter) {
var keyValue = splitEscaped(parameter, "=");
if (keyValue.length > 1) {
var key = keyValue[0], value = keyValue[1];
if (key) {
var values = splitEscaped(value, ",");
result.push(values.length > 1 ? {
name: key,
values: values.map(function(v) {
return {
value: v
};
}),
multivalue: !0
} : {
name: key,
value: values[0]
});
}
}
}), result;
}
var queryStart = link.indexOf("?");
if (-1 == queryStart) return {
reportName: "",
params: []
};
var reportName = "", params = [], query = link.slice(queryStart + 1);
return query.split("&").forEach(function(queryItem) {
var parts = queryItem.split(/=(.*)/);
parts.length < 2 || ("ReportId" == parts[0] ? reportName = decodeURIComponent(parts[1]) : "Parameters" == parts[0] && (params = parseParameters(decodeURIComponent(parts[1]))));
}), {
reportName: reportName,
params: params
};
}
function openDrillthrough(token, reportName, parameters) {
return service.open(reportName, parameters).then(function(report) {
var parametersValid = report.parameters.every(function(p) {
return p.state == ParameterState.Ok;
});
return parametersValid ? service.run(report.token, report.parameters).then(function(documentToken) {
return {
reportToken: report.token,
parameters: report.parameters,
documentToken: documentToken
};
}) : {
reportToken: report.token,
parameters: report.parameters
};
});
}
var state = {
togglesHistory: null,
documentId: null
};
if (!options.url) throw new Error("options has no valid url");
var reportTypes = {
SemanticReport: 1,
SectionReport: 2,
PageReport: 3,
CodeBasedReport: 4
}, requestStates = {
Pending: 0,
Running: 1,
Unavailable: 2,
Accomplished: 3,
Cancelled: 4,
Rejected: 5
}, SR = resourceManager && $.isFunction(resourceManager.get) ? resourceManager.get : identity, defaultPollingTimeout = 1e3, pollingTimeout = options.pollingTimeout || defaultPollingTimeout, serviceUrl = options.url, securityToken = options.securityToken, resourceHandler = options.resourceHandler || "";
serviceUrl.endsWith("/") || (serviceUrl += "/");
var service = {
open: open,
close: function() {
return state = {
togglesHistory: null,
documentId: null
}, $base.promise(!0);
},
run: run,
validateParameters: validateParameters,
validateParameter: function() {
return $base.errorPromise(SR("error.NotSupported"));
},
validateParameterSupported: function() {
return !1;
},
getPageCount: getPageCount,
getPage: getPage,
getToc: getToc,
"export": exportImpl,
drillthrough: drillthrough,
toggle: toggle,
ping: function() {
return $base.promise(!1);
}
}, $base = ReportServiceBase(service, serviceUrl);
return service;
}
function ClientSideSearchService() {
function search(document, searchOptions) {
function fillResults(items, regex, numberOfMatches) {
for (var fromIndex = currentPage == options.FromPage + 1 && options.FromElement > 0 ? options.FromElement + 1 : 0, i = fromIndex; i < items.length; i++) {
var element = items[i], elementText = element.text();
if (elementText.match(regex) && (result.matches.push({
idx: i,
text: elementText,
page: currentPage - 1
}), result.matches.length === numberOfMatches)) break;
}
return numberOfMatches != ALL_RESULTS && result.matches.length >= numberOfMatches;
}
function searchOnCurrentPage(regex) {
var hasMorePages = document.state() === DocumentState.completed && document.pageCount() >= currentPage + 1;
fillResults(cachedItems, regex, options.NumberOfResults) || !hasMorePages ? (result.hasMore = hasMorePages,
d.resolve(result)) : document.state() === DocumentState.progress && document.pageCount() <= currentPage + 1 ? setTimeout(searchOnCurrentPage, 100) : getPageItems(document, currentPage).done(function(items) {
cachedItems = items, currentPage++, searchOnCurrentPage(regex);
});
}
var d = $.Deferred(), result = {
hasMore: !0,
matches: []
};
if (null === searchOptions || void 0 === searchOptions) return d.resolve({
hasMore: !1,
matches: []
});
var options = ensureOptions(searchOptions);
return 0 === options.FromPage && 0 === options.FromElement && (cachedItems = [],
currentPage = 0), searchOnCurrentPage(createRegex(searchOptions)), d.promise();
}
function getPageItems(document, pageIndex) {
return document.getPage(pageIndex).then(resolveTextElements);
}
function ensureOptions(searchOptions) {
var startFromPage = searchOptions && searchOptions.from && searchOptions.from.page || 0, startFromIndex = searchOptions && searchOptions.from && searchOptions.from.idx || 0, numberOfResults = searchOptions.maxSearchResults, maxResultCount = !numberOfResults || 0 > numberOfResults ? ALL_RESULTS : numberOfResults;
return {
FromPage: startFromPage,
FromElement: startFromIndex,
NumberOfResults: maxResultCount
};
}
function resolveTextElements(page) {
var topLevelSelector = "div, p, td, li, span", pageObject = page instanceof jQuery ? page : $("<div/>").html(page);
return jQuery.map(pageObject.find(topLevelSelector), function(topLevelElement) {
return $($(topLevelElement).clone().find(topLevelSelector).remove().end());
});
}
function createRegex(searchOptions) {
for (var escapeChars = "\\|[]()+*.{}$^?", pattern = "", i = 0; i < searchOptions.text.length; i++) {
var ch = searchOptions.text[i];
escapeChars.indexOf(ch) >= 0 && (pattern += "\\"), pattern += ch;
}
searchOptions.wholePhrase && (pattern = "\\b" + pattern, pattern += "\\b");
var flags = "m";
return searchOptions.matchCase || (flags += "i"), new RegExp(pattern, flags);
}
var service = {
search: search
}, ALL_RESULTS = "ALL", cachedItems = [], currentPage = 0;
return service;
}
function noop() {}
function identity(v) {
return v;
}
function isAbsoluteUri(uri) {
return /^https?:\/\//i.test(uri);
}
function isBase64(uri) {
var r = new RegExp("^data:\\w+/\\w+;base64,", "i");
return r.test(uri);
}
function getQueryParameter(url, name) {
if (!url || "string" != typeof url) return null;
if (!name || "string" != typeof name) return null;
var uri = parseUri(url);
if (!uri.query) return null;
var f = Object.keys(uri.queryKey).filter(function(key) {
return key.toLowerCase() == name;
});
return 1 === f.length ? uri.queryKey[f[0]] : null;
}
function splitEscaped(str, delimiter) {
if (null === str || void 0 === str) return [];
if (!delimiter) return [ str ];
if ("\\" == delimiter) throw new Error("\\ delimiter is not supported");
if (delimiter.length > 1) throw new Error("delimiter should be single character");
for (var res = [], part = "", escaped = !1, i = 0; i < str.length; ) {
var current = str.charAt(i);
escaped ? (part += current, escaped = !1) : "\\" == current ? escaped = !0 : current == delimiter ? (res.push(part),
part = "") : part += current, i++;
}
return res.push(part), res;
}
function getDpi() {
var e = document.body.appendChild(document.createElement("DIV"));
e.style.width = "1in", e.style.padding = "0";
var dpi = e.offsetWidth;
return e.parentNode.removeChild(e), dpi;
}
function resolveErrorMessage(args) {
var xhr = args[0];
if (3 == args.length && xhr.status) {
if (xhr.responseJSON && xhr.responseJSON.Message) return xhr.responseJSON.Message;
if (xhr.responseText) {
var m = /<title>([^<]*)<\/title>/.exec(xhr.responseText);
if (m) return m[1];
}
return xhr.statusText;
}
return xhr.statusText ? xhr.statusText : xhr;
}
function DocumentModel(reportService, token, reportType) {
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) {
_pageCount(count), _state(DocumentState.completed);
}).fail(setErrorState).fail(failHandler);
}
function setErrorState() {
_state(DocumentState.error);
}
function failHandler() {
var error = resolveErrorMessage(arguments);
$(doc).trigger("error", error);
}
function getPage(index) {
return !token || 0 > index || index >= _pageCount() ? $.Deferred().resolve("").promise() : reportService.getPage(token, index).fail(failHandler);
}
function exportImpl(exportType, settings) {
if (!token || _pageCount() <= 0) throw new Error("document is not ready for export");
return reportService["export"](token, exportType, settings).fail(failHandler);
}
var nullToc = {
kids: []
}, emptyToc = {
kids: []
}, _pageCount = ko.observable(0), _state = ko.observable(DocumentState.init), _toc = ko.observable(nullToc), _reportType = reportType, _actionItemsResolver = new ActionItemsResolver(), _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()), 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,
search: _search,
resolveActionItems: _resolveActionItems
};
return reportService && token && load(), doc;
}
function DocumentViewModel(viewer) {
var _pageContent = ko.promise(function() {
return this.document().getPage(this.pageIndex());
}, viewer), _inProgress = ko.computed(function() {
return viewer.report().busy();
});
return {
get pageContent() {
return _pageContent;
},
get location() {
return viewer.location;
},
get inProgress() {
return _inProgress;
}
};
}
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;
},
dismissErrors: function() {
_showExtendedErrorInfo(!1), viewer.clearErrors();
}
};
}
function InteractivityProcessor(services) {
function processActionItem(actionItem) {
function pageBookmarkCustomHandler(item) {
onPageProcessed.push(function(content) {
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);
}
}), viewer.pageIndex(item.pageNumber - 1);
}
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 = services.onPageProcessed;
return {
processActionItem: processActionItem
};
}
function ParameterPaneViewModel(services, viewer) {
function runReport() {
refreshAfterValidation = !1, viewer.report().run();
}
function refreshReport() {
validating ? refreshAfterValidation = !0 : runReport();
}
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();
}), 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;
return 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);
});
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]);
});
}), {
visible: parameterPaneVisible,
isValid: areAllParametersValid,
refreshReport: {
exec: refreshReport,
enabled: areAllParametersValid
},
refreshReportAndClose: {
exec: function() {
viewer.sidebarState(SidebarState.Hidden), refreshReport();
},
enabled: areAllParametersValid
},
parameters: parameterViewModels
};
}
function ParameterViewModel(services, param, parameterChanged, parameterUpdateIsValid) {
function equals(v1, v2) {
return param.type === ParameterType.DateTime ? v1 - v2 === 0 : v1 === v2;
}
function updateParameter(p) {
function createOptionViewModel(availableValue) {
var option = ParameterOptionViewModel(availableValue);
return option.selected.subscribe(function() {
onSelectedChanged(option);
}), option;
}
if (_value(p.value), _isValueNull(param.nullable && null === p.value), _enabled(p.state != ParameterState.HasOutstandingDependencies && p.state != ParameterState.Communicating),
_editor(p.editor), _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 error ? error : getResourceString("error.HasOutstandingDependencies");
}
return [ errorText, error ].filter(identity).join(": ");
}(p.state, p.error)), "" !== _errorText() || param.nullable || null !== _value() || _errorText(getResourceString("error.ExpectValue")),
p.availableValues) {
var optionModels = p.availableValues.map(function(av) {
var selected = param.multivalue ? p.values.some(function(v) {
return equals(v.value, av.value);
}) : equals(av.value, p.value);
return createOptionViewModel({
value: av.value,
label: av.label,
selected: selected
});
});
if (param.nullable && !param.multivalue) {
var nullLabel = getResourceString("null");
optionModels.push(createOptionViewModel({
value: null,
label: nullLabel,
selected: _isValueNull()
}));
}
if (param.selectAllEnabled) {
var label = getResourceString("selectAll");
optionModels.splice(0, 0, createOptionViewModel({
value: ParameterSpecialValue.SelectAll,
label: label,
selected: p.value === ParameterSpecialValue.SelectAll
}));
}
_values(p.values), _options(optionModels);
}
}
function isValidDate(d) {
return Date.isDate(d);
}
function convertToTyped(value, type) {
if (null === value) return null;
switch (type) {
case ParameterType.Bool:
return "true" == value.toLowerCase();
case ParameterType.Int:
if (value = parseInt(value, 10), isNaN(value)) throw new Error(getResourceString("error.ExpectNumericValue"));
break;
case ParameterType.Float:
if (value = parseFloat(value.replace(",", ".")), isNaN(value)) throw new Error(getResourceString("error.ExpectNumericValue"));
break;
case ParameterType.DateTime:
if (value = /^[\d]{4}$/.test(value) ? new Date(parseInt(value), 0, 1) : new Date(/^[\d]{4}-[\d]{2}(-[\d]{2})?((T| )[\d]{2}:[\d]{2}(:[\d]{2})?)?$/.test(value) ? value.replace(/-/g, "/").replace(/T/g, " ") : value),
!isValidDate(value)) throw new Error(getResourceString("error.ExpectDateValue"));
break;
default:
value = value.toString();
}
return value;
}
function updateValue(newValue) {
_value(newValue), _isValueNull(param.nullable && null === newValue), parameterChanged({
name: param.name,
value: newValue
});
}
function updateValues(newValues) {
_values(newValues), parameterChanged({
multivalue: !0,
name: param.name,
values: _values(),
value: null
});
}
function writeValue(newValue) {
try {
updateValue(convertToTyped(newValue, param.type));
} catch (e) {
_value(null), _isValueNull(!0), _errorText(e.message);
}
}
function onSelectedChanged(option) {
option.selected() && (option.value == ParameterSpecialValue.SelectAll ? _options().filter(function(o) {
return o != option;
}).forEach(function(o) {
o.selected(!1);
}) : param.selectAllEnabled && _options().filter(function(o) {
return o.value == ParameterSpecialValue.SelectAll;
}).forEach(function(o) {
o.selected(!1);
}));
}
var _value = ko.observable(null), _isValueNull = ko.observable(!1), _enabled = ko.observable(!1), _errorText = ko.observable(""), _options = ko.observable([]), _values = ko.observable([]), _editor = ko.observable(ParameterEditorType.SingleValue), getResourceString = services.resourceManager && services.resourceManager.get || identity;
_errorText.subscribe(function(v) {
parameterUpdateIsValid(0 === v.length);
});
var _dateTimePickerSuported, _isValueNullProperty = ko.computed({
read: _isValueNull,
write: function(v) {
v ? updateValue(null) : _isValueNull(!1);
}
}), _valueProperty = ko.computed({
read: _value,
write: updateValue
}), _stringValueProperty = ko.computed({
read: function() {
function toDateString(dt) {
return param.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() ? "" : param.type === ParameterType.DateTime ? toDateString(_value()) : _value().toString();
},
write: writeValue
}), _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 param.dateOnly ? dateString : dateString + dateTimeDelimiter + pad(dt.getHours()) + ":" + pad(dt.getMinutes()) + ":" + pad(dt.getSeconds());
}
return null === _value() || void 0 === _value() || param.type !== ParameterType.DateTime ? "" : toDateString(_value());
},
write: writeValue
}), _displayValueProperty = ko.computed({
read: function() {
return param.nullable ? null === _value() ? getResourceString("null") : _stringValueProperty() : null === _value() || void 0 === _value() ? getResourceString("enterValue") : _stringValueProperty();
}
});
return updateParameter(param), {
get prompt() {
return param.prompt;
},
get nullable() {
return param.nullable;
},
get type() {
return param.type;
},
get name() {
return param.name;
},
get editor() {
return _editor;
},
get dateOnly() {
return param.dateOnly;
},
get enabled() {
return _enabled;
},
get isValueNull() {
return _isValueNullProperty;
},
get errorText() {
return _errorText;
},
get value() {
return _valueProperty;
},
get stringValue() {
return _stringValueProperty;
},
get datePickerValue() {
return _datePickerValueProperty;
},
get displayValue() {
return _displayValueProperty;
},
get options() {
return _options;
},
clearOptions: function() {
_options().forEach(function(o) {
o.selected(!1);
}), updateValues([]);
},
$update: updateParameter,
$updateValuesFromModel: function(ok) {
if (param.multivalue && ok) {
var values = _options().filter(function(v) {
return v.selected();
}).map(function(v) {
return {
value: v.value,
label: v.label
};
});
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;
}
};
}
function PrintingService() {
function printPdf(documentModel) {
return documentModel["export"](ExportType.Pdf, {
printing: !0
}).done(function(uri) {
var $iframe = $("#" + printingFrameId);
0 === $iframe.length && ($iframe = $("<iframe/>"), $iframe.attr("id", printingFrameId),
$iframe.css({
width: "1px",
height: "1px",
display: "none",
position: "fixed",
left: "0",
right: "0"
}), $("body").append($iframe)), $iframe.attr("src", uri);
});
}
var printingFrameId = "gc-viewer-print-frame";
return {
print: function(documentModel) {
return printPdf(documentModel);
}
};
}
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) {
function dispose(async) {
if (_reportToken) {
var token = _reportToken;
_reportToken = null, _reportType = ReportType.unknown, _params([]), _state(ReportModelState.closed),
reportService.close(token, async);
}
}
function open() {
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),
_params(rpt.parameters || []), keepAlive(), _state(ReportModelState.open), rpt.autoRun && _allParametersValid() && run();
}).fail(failHandler).always(function() {
_autoRun() || _busy(!1), _allParametersValid() || _busy(!1);
}));
}
function keepAlive() {
_reportToken && reportService.ping(_reportToken).done(function(shouldContinue) {
shouldContinue && setTimeout(function() {
keepAlive();
}, pingTimeout);
});
}
function failHandler() {
var error = resolveErrorMessage(arguments);
_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() {
_busy(!1);
}), ko.waitFor(docModel.state, function(state) {
return state == DocumentState.completed;
}, function() {
_busy(!1);
}));
}
function run() {
if (!_reportToken) throw new Error("Report is not opened!");
if (!_allParametersValid()) throw new Error("Invalid parameters!");
return _busy(!0), reportService.run(_reportToken, _params()).then(function(d) {
_state(ReportModelState.documentReady);
var dm = DocumentModel(reportService, d, _reportType);
subscribeFirstPageLoaded(dm), $report.trigger("documentReady", dm);
}).fail(failHandler);
}
function validateParameter(parameter) {
if (reportService.validateParameterSupported()) return reportService.validateParameter(_reportToken, parameter).then(function(updated) {
var newParameters = _params().map(function(p) {
var f = updated.filter(function(u) {
return u.name == p.name;
});
return 1 == f.length ? f[0] : p;
});
_params(newParameters);
}).fail(raiseError);
var parameters = _params().map(function(p) {
return p.name == parameter.name ? parameter : p;
});
return reportService.validateParameters(_reportToken, parameters).then(function(newParameters) {
_params(newParameters);
}).fail(raiseError);
}
function drillthrough(drillthroughLink) {
return _busy(!0), reportService.drillthrough(_reportToken, drillthroughLink).then(function(result) {
var child = ReportModel(reportService, {
token: result.reportToken,
parameters: result.parameters,
docToken: result.documentToken,
reportType: ReportType.pageReport
}, !0);
child.keepAlive();
var dm = result.documentToken ? DocumentModel(reportService, result.documentToken, ReportType.pageReport) : null;
return child.subscribeFirstPageLoaded(dm), {
report: child,
document: dm
};
}).fail(raiseError).always(function() {
_busy(!1);
});
}
function toggle(toggleInfo) {
return _busy(!0), reportService.toggle(_reportToken, toggleInfo).then(function(info) {
return _state(ReportModelState.documentReady), $report.trigger("documentReady", DocumentModel(reportService, info.url, _reportType)),
info;
}).fail(raiseError).always(function() {
_busy(!1);
});
}
if (!reportService) throw new ReferenceError("ReportService is required here!");
reportInfo = reportInfo || {};
var pingTimeout = 6e4, _busy = ko.observable(void 0 === busy ? !1 : busy), _state = ko.observable(ReportModelState.noReport), _autoRun = ko.observable(!1), _reportToken = null, _params = ko.observable([]), _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 = ReportType.unknown, report = {
get state() {
return _state;
},
get busy() {
return _busy;
},
get parameters() {
return _params;
},
get hasPromptParameters() {
return _hasPromptParams;
},
get allParametersValid() {
return _allParametersValid;
},
validateParameter: validateParameter,
subscribeFirstPageLoaded: subscribeFirstPageLoaded,
open: open,
run: run,
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), _state(reportInfo.docToken ? ReportModelState.documentReady : ReportModelState.open)),
report;
}
function ReportServiceBase(service, serviceUrl) {
function isUndefined(value) {
return void 0 === value || null === value;
}
function post(methodName, data, skipError, async) {
var url = serviceUrl + methodName;
return (void 0 === async || null === async) && (async = !0), $.ajax({
type: "POST",
url: url,
data: JSON.stringify(data),
contentType: "application/json",
dataType: "json",
async: 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 get(url) {
return $.get(url).then(function(data, status, xhr) {
return $.Deferred(function(d) {
d.resolve(data, status, xhr);
});
}, failCallback);
}
function getJson(url) {
return $.getJSON(url).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 : 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: post,
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 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", "validateParameters", "validateParameter", "getPageCount", "getPage", "getToc", "export", "search", "drillthrough", "toggle", "ping" ].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...",
pdfDocument: "PDF Document",
wordDocument: "Word Document",
imageFile: "Image File",
mhtDocument: "MHTML Web Archives",
excelWorkbook: "Excel Workbook",
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",
back: "Back",
refreshReport: "View report",
search: "Search",
matchCase: "Match case",
wholePhrase: "Whole phrase",
more: "More...",
noResults: "No results",
clear: "Clear",
findLabel: "Find:",
"errorPane.Details": "Show details",
"errorPane.HideDetails": "Hide details",
"errorPane.DismissAll": "Dismiss all",
"errorPane.ErrorPaneTitle": "An error(s) occured",
"error.ExpectValue": "Value expected",
"error.ValidationFailed": "Validation failed",
"error.HasOutstandingDependencies": "Has outstanding dependencies.",
"error.ExpectNumericValue": "Not a numeric value",
"error.ExpectDateValue": "Invalid date value",
"error.NotSupported": "Operation is not supported.",
"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 rejected.",
"error.RequestCancelled": "Your request 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"
};
var manager;
return manager = {
get: function(key) {
if (!key) return "";
var value = "";
return resources.hasOwnProperty(key) && (value = resources[key]), value || embedded[key] || "";
},
update: function(uri) {
return "string" == typeof uri && uri ? $.get(uri).then(function(text) {
return "string" != typeof text ? !1 : (resources = convertPropertiesToJson(text),
$(manager).trigger("updated"), !0);
}) : $.Deferred(function(d) {
d.reject("Invalid uri.");
}).promise();
}
};
}
function SearchPaneViewModel(viewer, maxSearchResults) {
function _clear() {
_searchString(""), _matchCase(!1), _wholePhrase(!1), _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 _navigate(searchResult) {
viewer.pageIndex(searchResult.page), viewer.location(searchResult.location || {
left: 0,
top: 0
});
}
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;
}), _reset = function() {
_isReady(!1), _searchResults([]), _hasMore(!1);
};
viewer.document.subscribe(function() {
_clear();
});
var searchVisible = ko.computed({
read: function() {
return viewer.sidebarState() === SidebarState.Search;
},
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;
},
search: {
exec: _search,
enabled: _searchEnabled
},
keyPressHandler: function(data, event) {
return 13 == event.keyCode && _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 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 @include "reportView"\n</div>',
templates.desktop = '<div class="ar-viewer desktop" style="width: 100%; height: 100%" data-bind="resizeViewerBody: {}">\n <!-- toolbar -->\n <div class="btn-toolbar toolbar toolbar-top">\n <div class="btn-group btn-group-sm"> \n <button class="btn btn-default" data-bind="command: toolbar.sidebar" title="%sidebar%">\n <span class="glyphicon glyphicon-list-alt" />\n </button> \n <button class="btn btn-default" data-bind="command: toolbar.search" title="%search%">\n <span class="glyphicon glyphicon-search" />\n </button>\n </div>\n\n <div class="btn-group btn-group-sm">\n <button class="btn btn-default" data-bind="command: toolbar.firstPage" title="%firstPage%">\n <span class="glyphicon glyphicon-step-backward" />\n </button>\n <button class="btn btn-default" data-bind="command: toolbar.prevPage" title="%prevPage%">\n <span class="glyphicon icon-large glyphicon-chevron-left" />\n </button>\n <div class="navbar-left input-group-sm">\n <input class="form-control" type="text" data-bind="valueEdit: toolbar.pageNumber, enable: toolbar.pageNumberEnabled" />\n </div>\n <button class="btn btn-default" data-bind=" command: toolbar.nextPage" title="%nextPage%">\n <span class="glyphicon icon-large glyphicon-chevron-right" />\n </button>\n <button class="btn btn-default" data-bind="command: toolbar.lastPage" title="%lastPage%">\n <span class="glyphicon icon-large glyphicon-step-forward" />\n </button>\n </div>\n\n <div class="btn-group btn-group-sm">\n <button id="backToParent" class="btn btn-default" data-bind="command: toolbar.backToParent" title="%backToParent%">\n <span class="glyphicon glyphicon-share-alt mirror-by-x" />\n </button>\n </div>\n \n <div class="btn-group btn-group-sm">\n <button class="btn btn-default" data-bind="command: toolbar.print" title="%print%">\n <span class="glyphicon glyphicon-print" />\n </button>\n </div>\n\n <div class="btn-group btn-group-sm" data-bind="visible: toolbar.exportsAreAvailable">\n <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" data-bind="enable: toolbar.canExport">\n %saveas%<span class="caret"></span>\n </button>\n <ul class="dropdown-menu" role="menu">\n <li><a href="#" data-bind="command: toolbar.exportTo(\'Pdf\'), visible: toolbar.exportToAvailable(\'Pdf\')">%pdfDocument%</a></li>\n <li><a href="#" data-bind="command: toolbar.exportTo(\'Word\'), visible: toolbar.exportToAvailable(\'Word\')">%wordDocument%</a></li>\n <li><a href="#" data-bind="command: toolbar.exportTo(\'Image\'), visible: toolbar.exportToAvailable(\'Image\')">%imageFile%</a></li>\n <li><a href="#" data-bind="command: toolbar.exportTo(\'Html\'), visible: toolbar.exportToAvailable(\'Html\')">%mhtDocument%</a></li>\n <li><a href="#" data-bind="command: toolbar.exportTo(\'Xls\'), visible: toolbar.exportToAvailable(\'Xls\')">%excelWorkbook%</a></li>\n </ul>\n </div>\n </div>\n\n <div class="viewer-body" style="width: 100%">\n <!-- sidebar -->\n <div class="sidebar" data-bind="visible: sidebarState() != \'Hidden\'">\n <ul class="nav nav-tabs">\n <li data-bind="visible: hasToc, css: { \'active\': sidebarState() === \'TOC\' }"><a href="#gc-viewer-tab-toc" data-toggle="tab" data-bind=" click: 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 <li data-bind="css: { \'active\': sidebarState() === \'Search\' }" ><a href="#gc-viewer-tab-search" data-toggle="tab" data-bind=" click: function () { setSidebarState(\'Search\') }">%search%</a></li>\n </ul>\n <div class="tab-content" style="width: 100%" data-bind="activeTab: sidebarState">\n <div id="gc-viewer-tab-toc" class="tab-pane toc-container" data-tab-name="TOC" data-bind="visible: hasToc">\n @include "tocPane"\n </div>\n <div id="gc-viewer-tab-params" class="tab-pane" data-tab-name="Parameters" data-bind="visible: hasParameters">\n @include "parametersPane"\n </div>\n <div id="gc-viewer-tab-search" class="tab-pane" data-tab-name="Search">\n @include "searchPane"\n </div>\n </div>\n </div>\n @include "reportView"\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 <div data-bind="visible: !showErrorInfo()">\n \n <button id="gcv-details" type="button" class="btn btn-sm btn-danger pull-right"\n data-bind="click: function () { showErrorInfo(true); }" >\n <span>%errorPane.Details%</span>\n </button>\n \n <span class="glyphicon glyphicon-warning-sign"></span>\n <span id="gcv-lasterror" data-bind="text: lastError"></span>\n <span class="badge" data-bind="text: errors().length > 1 ? errors().length : \'\'"></span>\n\n <button id="placeholder" type="button" class="btn btn-sm" style="visibility: hidden;">&nbsp;</button>\n </div>\n \n <!-- Extended error info -->\n <div id="gcv-exterrinfo" data-bind="visible: showErrorInfo" style="overflow-y: auto; max-height: 200pt;">\n <button id="gcv-hidedetails" type="button" class="btn btn-sm btn-danger pull-right" data-bind="click: function () { showErrorInfo(false); }" >\n <span>%errorPane.HideDetails%</span>\n </button>\n \n <span class="glyphicon glyphicon-warning-sign"></span>\n <span>%errorPane.ErrorPaneTitle%</span>\n \n <ul data-bind="foreach: errors">\n <li data-bind="text: $data"></li>\n </ul>\n\n <div style="text-align: right">\n <button id="gcv-dismissall" type="button" class="btn btn-default btn-sm" data-bind="click: dismissErrors">\n <span>%errorPane.DismissAll%</span>\n </button>\n </div>\n \n </div>\n</div>',
templates.mobile = '<div class="ar-viewer mobile" style="width: 100%; height: 100%; position: relative" data-bind="resizeViewerBody: {}">\n \n <!-- top toolbar -->\n <div class="btn-toolbar toolbar toolbar-top" style="width: 100%;">\n <div class="btn-group">\n <button class="btn btn-default" data-bind="command: toolbar.toc" title="%toc%">\n <span class="glyphicon glyphicon-align-justify" />\n </button>\n <button class="btn btn-default" data-bind="command: toolbar.params" title="%params%" >\n <span class="glyphicon glyphicon-cog" />\n </button>\n <button class="btn btn-default" data-bind="command: toolbar.search" title="%search%">\n <span class="glyphicon glyphicon-search" />\n </button>\n </div>\n\n <div class="btn-group" data-bind="visible: toolbar.exportsAreAvailable">\n <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" data-bind="enable: toolbar.canExport" title="%saveas%">\n <span class="glyphicon glyphicon-export" />\n </button>\n <ul class="dropdown-menu" role="menu">\n <li><a href="#" data-bind="command: toolbar.exportTo(\'Pdf\'), visible: toolbar.exportToAvailable(\'Pdf\')">%pdfDocument%</a></li>\n <li><a href="#" data-bind="command: toolbar.exportTo(\'Word\'), visible: toolbar.exportToAvailable(\'Word\')">%wordDocument%</a></li>\n <li><a href="#" data-bind="command: toolbar.exportTo(\'Image\'), visible: toolbar.exportToAvailable(\'Image\')">%imageFile%</a></li>\n <li><a href="#" data-bind="command: toolbar.exportTo(\'Html\'), visible: toolbar.exportToAvailable(\'Html\')">%mhtDocument%</a></li>\n <li><a href="#" data-bind="command: toolbar.exportTo(\'Xls\'), visible: toolbar.exportToAvailable(\'Xls\')">%excelWorkbook%</a></li>\n </ul>\n </div>\n </div>\n \n <div class="viewer-body" style="width: 100%;">\n @include "reportView"\n </div>\n \n <div class="panelsSite">\n @include "mtocPane"\n @include "msearchPane"\n @include "mparametersPane"\n </div>\n\n <!-- bottom toolbar -->\n <div class="btn-toolbar toolbar toolbar-bottom" style="width: 100%;">\n <div class="btn-group">\n <button class="btn btn-default" data-bind="command: toolbar.prevPage" title="%prevPage%">\n <span class="glyphicon glyphicon-circle-arrow-left" />\n </button>\n <button class="btn btn-default" data-bind="command: toolbar.nextPage" title="%nextPage%">\n <span class="glyphicon glyphicon-circle-arrow-right" />\n </button>\n </div>\n \n <div class="btn-group">\n <div class="navbar-left">\n <input class="form-control" type="text" data-bind="valueEdit: toolbar.pageNumber, enable: toolbar.pageNumberEnabled" />\n </div>\n </div>\n \n <div class="btn-group">\n <button class="btn btn-default" data-bind="command: toolbar.backToParent" title="%backToParent%">\n <span class="glyphicon glyphicon-share-alt mirror-by-x" />\n </button>\n </div>\n </div>\n</div>\n',
templates.mparameternullswitch = '<!-- ko if: nullable --> \n<div style="margin-top: 5pt">\n <label>%null-label%</label>\n <div class="make-switch" style="vertical-align: middle" data-bind="bootstrapSwitch: isValueNull"\n data-on-label="%yes%" data-off-label="%no%">\n <input type="checkbox">\n </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">\n <div class="panel-heading" style="text-align: center">\n <button type="button" class="close">&times;</button>\n <h2 class="panel-title">Parameters</h2>\n </div>\n <div class="panel-body">\n <div class="params-pane" data-bind="foreach: parametersPane.parameters">\n <h5 data-bind="text: prompt" />\n\n <div class="param-value truncatedString well well-sm"\n data-bind="css: { \'has-error\': errorText().length > 0 }, attr: {pname: name},\n showEditor: { template: \'parameter-editor-template\', placeholder: $($element).closest(\'.ar-viewer\').find(\'#paramEditorHere\'), enable: enabled, visible: enabled && $parent.visible, onClose: function (v) { $updateValuesFromModel(v); } }">\n <i class="glyphicon glyphicon-play pull-right" data-bind="visible: enabled"></i>\n <span data-bind="text: nullable && value() == null ? \'%null%\' : stringValue"></span>&nbsp;\n </div>\n \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>\n\n <button id="refresh-button" class="btn btn-block btn-default btn-primary" data-bind="command: parametersPane.refreshReportAndClose">\n %refreshReport%\n </button>\n </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 <div class="panel panel-default overlay" style="z-index: 11;">\n <div class="panel-heading" style="text-align: center; vertical-align: middle">\n <button type="button" class="btn close-onclick btn-default btn-sm pull-left">\n <i class="glyphicon glyphicon-arrow-left" />\n </button>\n <button type="button" class="close">&times;</button>\n <span class="panel-title" data-bind="text: prompt"></span>\n </div>\n <div class="panel-body">\n <!-- ko if: editor() == \'SingleValue\' -->\n <!-- ko if: type == \'bool\' --> \n <ul class="list-group">\n <li class="list-group-item close-onclick" data-bind="click: function () { value(true); }">%true%\n <i class="glyphicon glyphicon-ok pull-right" data-bind="visible: value"></i>\n </li>\n <li class="list-group-item close-onclick" data-bind="click: function () { value(false); }">%false%\n <i class="glyphicon glyphicon-ok pull-right" data-bind="visible: value() === false"></i>\n </li>\n <!-- ko if: nullable -->\n <li class="list-group-item close-onclick" data-bind="click: function () { isValueNull(true); }">%null%\n <i class="glyphicon glyphicon-ok pull-right" data-bind="visible: isValueNull"></i>\n </li>\n <!-- /ko -->\n </ul>\n <!-- /ko -->\n\n <!-- ko if: (type == \'datetime\' && dateOnly == true) -->\n <input type="date" class="form-control" data-date-format="yyyy-mm-dd" data-bind="value: datePickerValue, attr: { pname: name }" />\n <!-- /ko -->\n <!-- ko if: (type == \'datetime\' && dateOnly == false) -->\n <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 <!-- /ko -->\n\n <!-- ko if: !(type == \'datetime\' || type == \'bool\') -->\n <input type="text" class="form-control" data-bind="value: stringValue, attr: { pname: name }" />\n <!-- /ko -->\n\n <!-- ko if: type != \'bool\' && nullable --> \n @include "mparameterNullSwitch"\n <!-- /ko -->\n\n <!-- /ko -->\n \n <!-- ko if: editor() == \'SelectOneFromMany\' -->\n <ul class="list-group" data-bind="foreach: options">\n <li class="list-group-item close-onclick" data-bind="click: function () { $parent.value(value); }">\n <span data-bind="text: label"></span>\n <i class="glyphicon glyphicon-ok pull-right" data-bind="visible: selected"></i>\n </li>\n </ul>\n <!-- /ko -->\n \n <!-- ko if: editor() == \'MultiValue\' -->\n <ul class="list-group">\n <!-- ko foreach: options --> \n <li class="list-group-item" data-bind="click: function() { selected(!selected()); }">\n <span data-bind="text: label"></span>\n <i class="glyphicon glyphicon-ok pull-right" data-bind="visible: selected"></i>\n </li>\n <!-- /ko -->\n \n <!-- TODO should be \'nullable\' but this does not work yet as server tells parameter is not nullable RdlxReportParameter.Nullable impl -->\n <!-- ko if: true --> \n <li class="list-group-item" data-bind="click: function () { clearOptions(); }">\n %clearAllOptions%\n </li>\n <!-- /ko -->\n </ul>\n\n <!-- /ko -->\n \n <!-- ko if: editor() == \'MultiLine\' -->\n <textarea rows="5" class="form-control" data-bind="value: stringValue, enable: enabled, attr: { pname: name }" />\n @include "mparameterNullSwitch"\n <!-- /ko -->\n \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\n </div>\n </div>\n</script>',
templates.msearchpane = '<!-- template for search result item -->\n<div class="panel panel-default overlay" data-bind="showPanel: searchPane.visible">\n <div class="panel-heading" style="text-align: center">\n <button type="button" class="close">&times;</button>\n <h2 class="panel-title">%search%</h2>\n </div>\n <div class="panel-body" data-bind="with: searchPane">\n <div class="form-horizontal">\n <input type="text" class="form-control" data-bind="value: searchString" />\n <div class="form-group" style="margin: 4pt 4pt 0 4pt">\n <label for="matchCase" class="control-label" style="vertical-align: middle">%matchCase%</label>\n <div class="make-switch pull-right" data-bind="bootstrapSwitch: matchCase"\n data-on-label="%on%" data-off-label="%off%">\n <input type="checkbox" id="matchCase"/>\n </div>\n </div>\n <div class="form-group" style="margin: 4pt 4pt 0 4pt">\n <label for="whole" class="control-label" style="vertical-align: middle">%wholePhrase%</label>\n <div class="make-switch pull-right" data-bind="bootstrapSwitch: wholePhrase"\n data-on-label="%on%" data-off-label="%off%">\n <input type="checkbox" id="whole"/>\n </div>\n </div>\n <button class="btn btn-default btn-primary btn-block" data-bind="command: search" style="margin-top: 5pt">%search%</button>\n <!-- ko if: isReady -->\n <!-- ko if: found -->\n <ul class="list-group toc" data-bind="foreach: searchResults" style="margin-top: 5pt">\n <li class="list-group-item">\n <div data-bind="click: $parent.navigateAndClose" class="truncatedString">\n <i class="glyphicon glyphicon-chevron-right pull-right"></i>\n <a data-bind="text: text" href="#"/>\n </div>\n </li>\n </ul>\n <button class="btn" data-bind="click: more, visible: hasMore">%more%</button>\n <!-- /ko-->\n <!-- ko ifnot: found -->\n <span>%noResults%</span>\n <!-- /ko-->\n <!-- /ko -->\n </div>\n </div>\n</div>',
templates.mtocpane = '<div class="panel panel-default overlay" data-bind="showPanel: tocPane.visible">\n <div class="panel-heading">\n <div class="btn-toolbar" style="text-align: center">\n <button type="button" class="close" data-bind="click: function() { tocPane.reset(); tocPane.visible(false); }">&times;</button>\n <a class="btn btn-default pull-left" title="%back%" data-bind="command: tocPane.back, visible: tocPane.back.enabled()">\n <i class="glyphicon glyphicon-arrow-left" />\n </a>\n <span class="panel-title">%tocfull%</span>\n </div>\n </div>\n <div class="panel-body" data-bind="with: tocPane.selectedNode">\n <ul class="list-group toc" data-bind="foreach: kids">\n <li class="list-group-item">\n <div class="truncatedString" style="min-height: 1.2em" data-bind="click: function () { $root.tocPane.navigateAndClose($data); }">\n <i class="glyphicon glyphicon-chevron-right pull-right"\n data-bind="visible: !isLeaf, click: function(data, e) { e.stopImmediatePropagation(); $root.tocPane.select($data); }"></i>\n <a data-bind="text: name" />\n </div>\n </li>\n </ul>\n </div>\n</div>\n',
templates.parameterspane = '<!-- parameters pane for desktop layout -->\n<div class="panel-body" style="min-width: 120px">\n\n <div data-bind="foreach: parametersPane.parameters">\n <div style="margin-bottom: 10px;">\n <label data-bind="text: prompt, tooltip: name"></label>\n\n <div class="param-value" data-bind="css: { \'has-error\': errorText().length > 0 }, attr: { pname: name }">\n <!-- ko if: editor() == \'SingleValue\' -->\n <!-- ko if: type == \'bool\' -->\n <label class="radio-inline">\n <input type="radio" value="true" data-bind="checked: stringValue, enable: enabled" />%true%</label>\n <label class="radio-inline">\n <input type="radio" value="false" data-bind="checked: stringValue, enable: enabled" />%false%</label>\n <label class="radio-inline" data-bind="visible: nullable">\n <input type="radio" value="null" data-bind="click: function() { isValueNull(true); }, checked: isValueNull() ? \'null\' : stringValue(), enable: enabled" />%null%</label>\n <!-- /ko -->\n <!-- ko if: (type == \'datetime\' && dateOnly == true) -->\n <input type="date" class="form-control" data-date-format="yyyy-mm-dd" data-bind="value: datePickerValue, enable: enabled" />\n <!-- /ko -->\n <!-- ko if: (type == \'datetime\' && dateOnly == false) -->\n <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 <!-- /ko -->\n <!-- ko if: !(type == \'datetime\' || type == \'bool\') -->\n <input type="text" class="form-control" data-bind="value: stringValue, enable: enabled" />\n <!-- /ko -->\n <!-- /ko -->\n\n <!-- ko if: editor() == \'MultiLine\' -->\n <textarea rows="5" class="form-control" data-bind="value: stringValue, enable: enabled" />\n <!-- /ko -->\n\n <!-- ko if: editor() == \'SelectOneFromMany\' -->\n <div class="dropdown">\n <a data-toggle="dropdown" class="dropdown-toggle form-control btn btn-default" style="text-align: left">\n <i class="glyphicon glyphicon-chevron-down pull-right"></i>\n <div class="truncatedString" data-bind="text: displayValue"></div>\n </a>\n <ul class="dropdown-menu dropdown-menu-uniform-size" data-bind="foreach: options">\n <li data-bind="click: function() { $parent.value(value); }">\n <a tabindex="-1">\n <i class="glyphicon glyphicon-ok pull-right" data-bind="visible: selected"></i>\n <div class="truncatedString" data-bind="text: label"></div>\n </a>\n </li>\n </ul>\n </div>\n <!-- /ko -->\n\n <!-- ko if: editor() == \'MultiValue\' -->\n <div class="dropdown" data-bind="dropdownForm: { onApply: function(v) { $updateValuesFromModel(v); }, onShown: function() { $($element).find(\'a:first span\').text(\'\'); } }">\n <a data-toggle="dropdown" class="dropdown-toggle form-control btn btn-default" style="text-align: left">\n <i class="glyphicon glyphicon-chevron-down pull-right"></i>\n <div class="truncatedString" data-bind="text: displayValue"></div>\n </a>\n <ul class="dropdown-menu dropdown-menu-uniform-size dropdown-menu-form">\n <!-- ko foreach: options -->\n <li data-bind="click: function() { selected(!selected()); }">\n <a tabindex="-1">\n <i class="glyphicon glyphicon-ok pull-right" data-bind="visible: selected"></i>\n <div class="truncatedString" data-bind="text: label"></div>\n </a>\n </li>\n <!-- /ko -->\n <li data-bind="click: function() { clearOptions(); }">\n <a tabindex="-1">\n <div class="truncatedString">%clearAllOptions%</div>\n </a>\n </li>\n </ul>\n </div>\n <!-- /ko -->\n\n <span data-bind="visible: nullable && !(editor() == \'SingleValue\' && type == \'bool\') && editor() != \'SelectOneFromMany\'">\n <input type="checkbox" data-bind="checked: isValueNull, enable: enabled">\n <label>%null%</label>\n </span>\n </div>\n\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>\n </div>\n\n <div>\n <button id="refresh-button" class="btn btn-block btn-default btn-primary" data-bind="command: parametersPane.refreshReport">\n %refreshReport%\n </button>\n </div>\n</div>\n',
templates.reportview = '<div style="height: 100%; overflow: hidden; position: relative;" data-bind="spin: document.inProgress">\n \n @include "errorPanel"\n\n <div class="document-view" style="width: 100%; height: 100%; padding: 5pt; overflow: auto; position: absolute;"\n data-bind="htmlPage: { page: document.pageContent, onupdate: processPage }, scrollPosition: document.location">\n </div>\n</div>\n',
templates.searchpane = '<div class="panel-body" data-bind="with: searchPane">\n <div>\n <label class="control-label">%findLabel%</label>\n </div>\n <div>\n <input type="text" class="form-control" data-bind="value: searchString, valueUpdate:\'afterkeydown\', event: { keypress: keyPressHandler }"/>\n </div>\n <div style="margin-top: 5pt">\n <input type="checkbox" data-bind="checked: matchCase" />\n <label class="control-label">%matchCase%</label>\n </div>\n <div>\n <input type="checkbox" data-bind="checked: wholePhrase" />\n <label class="control-label">%wholePhrase%</label>\n </div>\n <div style="float: right">\n <button class="btn btn-primary" data-bind="command: clear" style="margin: 1pt">%clear%</button>\n <button class="btn btn-primary" data-bind="command: search" style="margin: 1pt">%search%</button>\n </div>\n <div style="clear: both">\n <!-- ko if: isReady -->\n <!-- ko if: found -->\n <div data-bind="foreach: searchResults" style="margin-top: 5pt; border: 1pt solid black;">\n <div class="truncatedString" data-bind="click: $parent.navigate" style="margin: 3pt;">\n <a data-bind="text: text" href="#" />\n </div>\n </div>\n <button class="btn" data-bind="click: more, visible: hasMore">%more%</button>\n <!-- /ko-->\n <!-- ko ifnot: found -->\n <div style="margin: 5pt; padding: 5pt; border: 1pt solid black;">\n %noResults%\n </div>\n <!-- /ko-->\n <!-- /ko -->\n </div>\n</div>\n',
templates.tocpane = '<div data-bind="template: { name: \'toc-template\', data: tocPane.root }">\n</div>\n<script id="toc-node-template" type="text/html">\n <li class="toc-node collapsed"\n data-bind="css: { leaf: $data.isLeaf != false, branch: $data.isLeaf == false }, treeNode: { template: \'toc-template\', node: $data }">\n <a class="toggle" href="#" data-bind="visible: $data.isLeaf == false"></a>\n <a class="link" href="#" data-bind="text: name, click: function() { $root.tocPane.navigate($data); return false; }"></a>\n </li>\n</script>\n<script id="toc-template" type="text/html">\n <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) {
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(), viewer.pageIndex(node.page);
var dpi = getDpi(), location = node.location || {
left: 0,
top: 0
};
viewer.location({
left: location.left * dpi,
top: location.top * dpi
});
}
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);
}
});
return _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) {
var elementIndex = togglesSet.indexOf(toggleId);
elementIndex > -1 ? togglesSet.splice(elementIndex, 1) : togglesSet.push(toggleId);
}, this.getSet = function() {
var result = togglesSet.slice();
return result;
};
}
function ToolbarViewModel(services, viewer) {
function pageCount() {
return viewer.document().pageCount();
}
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);
}), _availableExports = ko.computed(function() {
return viewer.availableExports().length > 0;
});
return {
pageNumber: _pageNumber,
pageNumberEnabled: ko.computed(function() {
return pageCount() > 0;
}),
firstPage: {
exec: function() {
viewer.pageIndex(0);
},
enabled: ko.computed(function() {
return pageCount() > 0 && 0 !== viewer.pageIndex();
})
},
lastPage: {
exec: function() {
viewer.pageIndex(pageCount() - 1);
},
enabled: ko.computed(function() {
return pageCount() > 0 && viewer.pageIndex() !== pageCount() - 1;
})
},
prevPage: {
exec: function() {
viewer.pageIndex(viewer.pageIndex() - 1);
},
enabled: ko.computed(function() {
return pageCount() > 0 && viewer.pageIndex() - 1 >= 0;
})
},
nextPage: {
exec: function() {
viewer.pageIndex(viewer.pageIndex() + 1);
},
enabled: ko.computed(function() {
return pageCount() > 0 && 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
},
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());
},
enabled: ko.computed(function() {
return _isDocReady() && services.printingService;
})
},
exportTo: function(exportType) {
return {
exec: function() {
viewer.document()["export"](exportType, {
saveAsDialog: !0
}).done(function(uri) {
if (uri) {
var newWin = null;
try {
newWin = window.open(uri);
} catch (e) {}
newWin || (window.location = uri);
}
}).fail(viewer.handleError);
},
enabled: _isDocReady
};
},
exportToAvailable: function(exportType) {
return viewer.availableExports().indexOf(exportType) >= 0;
},
get exportsAreAvailable() {
return _availableExports;
},
get canExport() {
return _isDocReady;
}
};
}
function ViewerImpl(services, options, viewModels) {
function createReportModel() {
viewerModel.report && documentReadySubscribe && (documentReadySubscribe.dispose(),
documentReadySubscribe = null), viewerModel.report = ReportModel(reportService, options.report),
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 && createReportModel(), options.availableExports && viewerModel.availableExports(options.availableExports),
options.localeUri ? optionMap.localeUri(options.localeUri) : 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 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()).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 || {}, settings.saveAsDialog = !!saveAsDialog, viewerModel.document()["export"](exportType, settings).done(callback || noop).fail(viewerModel.handleError);
}
function goToPage(number, offset, callback) {
if (isNaN(number) || 0 >= number || 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.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() {
var $e = viewerElement();
ko.cleanNode($e[0]), $e.html(""), viewerModel.clearReports(!1);
}
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");
}
}, 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)),
options.reportService;
},
localeUri: function() {
if (arguments.length > 0) {
var uri = arguments[0];
if ("string" != typeof uri || !uri) throw new Error("Invalid locale URI.");
resourceManager.update(uri).done(function() {
options.localeUri = uri, updateTemplate();
}).fail(function(error) {
console.log("Unable to load locale from '{0}'. Error: {1}".format(uri, error));
});
}
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;
}
};
return 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 errorHandler(e, error) {
viewer.handleError(error);
}
function setReport(value) {
if (!value) throw new ReferenceError("value");
_report() && ($(_report()).unbind("error", errorHandler), $(_report()).unbind("documentReady", onDocumentReady)),
viewer.document = nullDocument, _report(value), $(value).on("error", errorHandler),
$(value).on("documentReady", onDocumentReady), ko.waitFor(value.state, function(st) {
return st == ReportModelState.open;
}, function() {
value.hasPromptParameters() ? value.autoRun() && value.allParametersValid() || _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;
}
if (!reportService) throw new ReferenceError("reportService is required here!");
var nullDocument = DocumentModel(), _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 ]), _drillthroughStack = [], _backToParentEnabled = ko.observable(!1), _errors = ko.observable([]), 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), viewer.clearErrors(), setReport(value), value.state() === ReportModelState.noReport && value.open();
},
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))), _pageIndex(0), _location({
left: 0,
top: 0
});
},
get availableExports() {
return _availableExports;
},
set availableExports(value) {
_availableExports(value || []);
},
drillthrough: function(drillthroughLink) {
viewer.report().drillthrough(drillthroughLink).done(function(result) {
_drillthroughStack.push({
Report: viewer.report(),
Document: viewer.document()
}), _backToParentEnabled(_drillthroughStack.length > 0), setReport(result.report),
result.document && (viewer.document = result.document);
});
},
toggle: function(toggleData) {
var savedPageIndex = _pageIndex();
return viewer.report().toggle(toggleData).then(function(info) {
savedPageIndex >= info.pagesCount && (savedPageIndex = info.pagesCount - 1), _pageIndex(savedPageIndex);
});
},
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),
viewer.document = drill.Document);
},
get backToParentEnabled() {
return _backToParentEnabled;
},
get errors() {
return _errors;
},
handleError: function(error) {
if (error) {
var errorObject = {
message: String(error)
};
if (options && options.error && options.error.apply && options.error(errorObject)) return;
_errors(_errors().concat([ String(error) ]));
}
},
clearReports: function(async) {
clearDrillthroughStack(async);
var oldReport = _report();
oldReport && oldReport.dispose(async);
},
clearErrors: function() {
_errors([]);
}
};
return viewer.report = ReportModel(reportService), viewer;
}
function ViewerViewModel(services, options, viewer) {
var _document = DocumentViewModel(viewer), _tocPane = TocPaneViewModel(viewer), _parametersPane = ParameterPaneViewModel(services, viewer), _searchPane = SearchPaneViewModel(viewer, options.maxSearchResults), _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;
}), _onPageProcessed = [], _interactivityProcessor = InteractivityProcessor({
viewer: viewer,
tocPane: _tocPane,
onPageProcessed: _onPageProcessed,
get action() {
return options.action;
}
});
return {
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;
},
processPage: function(element) {
for ($.each(viewer.document().resolveActionItems(element), function(index, item) {
_interactivityProcessor.processActionItem(item);
}); _onPageProcessed.length > 0; ) {
var handler = _onPageProcessed.pop();
$.isFunction(handler) && handler(element);
}
},
setSidebarState: function(state) {
viewer.sidebarState(state);
}
};
}
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 createViewer(options) {
var baseUri = options.baseUri || ".", resourceManager = ResourceManager(), reportService = ReportServiceSelector(options.reportService, resourceManager), templates = Templates(baseUri, resourceManager), printingService = PrintingService(), services = {
reportService: reportService,
templates: templates,
resourceManager: resourceManager,
printingService: printingService
}, 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("&nbsp;").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() {
changeStatus($(this));
}), $switchRight.on("click", function() {
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, left > percent ? 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();
}), 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(t, e) {
"object" == typeof exports ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : t.Spinner = e();
}(this, function() {
"use strict";
function o(t, e) {
var o, i = document.createElement(t || "div");
for (o in e) i[o] = e[o];
return i;
}
function n(t) {
for (var e = 1, i = arguments.length; i > e; e++) t.appendChild(arguments[e]);
return t;
}
function s(t, o, n, s) {
var a = [ "opacity", o, ~~(100 * t), n, s ].join("-"), f = .01 + n / s * 100, l = Math.max(1 - (1 - t) / o * (100 - f), t), d = i.substring(0, i.indexOf("Animation")).toLowerCase(), u = d && "-" + d + "-" || "";
return e[a] || (r.insertRule("@" + u + "keyframes " + a + "{0%{opacity:" + l + "}" + f + "%{opacity:" + t + "}" + (f + .01) + "%{opacity:1}" + (f + o) % 100 + "%{opacity:" + t + "}100%{opacity:" + l + "}}", r.cssRules.length),
e[a] = 1), a;
}
function a(e, i) {
var n, r, o = e.style;
if (void 0 !== o[i]) return i;
for (i = i.charAt(0).toUpperCase() + i.slice(1), r = 0; r < t.length; r++) if (n = t[r] + i,
void 0 !== o[n]) return n;
}
function f(t, e) {
for (var i in e) t.style[a(t, i) || i] = e[i];
return t;
}
function l(t) {
for (var e = 1; e < arguments.length; e++) {
var i = arguments[e];
for (var o in i) void 0 === t[o] && (t[o] = i[o]);
}
return t;
}
function d(t) {
for (var e = {
x: t.offsetLeft,
y: t.offsetTop
}; t = t.offsetParent; ) e.x += t.offsetLeft, e.y += t.offsetTop;
return e;
}
function p(t) {
return "undefined" == typeof this ? new p(t) : void (this.opts = l(t || {}, p.defaults, u));
}
function c() {
function t(t, e) {
return o("<" + t + ' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">', e);
}
r.addRule(".spin-vml", "behavior:url(#default#VML)"), p.prototype.lines = function(e, i) {
function s() {
return f(t("group", {
coordsize: r + " " + r,
coordorigin: -o + " " + -o
}), {
width: r,
height: r
});
}
function u(e, r, a) {
n(l, n(f(s(), {
rotation: 360 / i.lines * e + "deg",
left: ~~r
}), n(f(t("roundrect", {
arcsize: i.corners
}), {
width: o,
height: i.width,
left: i.radius,
top: -i.width >> 1,
filter: a
}), t("fill", {
color: i.color,
opacity: i.opacity
}), t("stroke", {
opacity: 0
}))));
}
var d, o = i.length + i.width, r = 2 * o, a = 2 * -(i.width + i.length) + "px", l = f(s(), {
position: "absolute",
top: a,
left: a
});
if (i.shadow) for (d = 1; d <= i.lines; d++) u(d, -2, "progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)");
for (d = 1; d <= i.lines; d++) u(d);
return n(e, l);
}, p.prototype.opacity = function(t, e, i, o) {
var n = t.firstChild;
o = o.shadow && o.lines || 0, n && e + o < n.childNodes.length && (n = n.childNodes[e + o],
n = n && n.firstChild, n = n && n.firstChild, n && (n.opacity = i));
};
}
var i, t = [ "webkit", "Moz", "ms", "O" ], e = {}, r = function() {
var t = o("style", {
type: "text/css"
});
return n(document.getElementsByTagName("head")[0], t), t.sheet || t.styleSheet;
}(), u = {
lines: 12,
length: 7,
width: 5,
radius: 10,
rotate: 0,
corners: 1,
color: "#000",
direction: 1,
speed: 1,
trail: 100,
opacity: .25,
fps: 20,
zIndex: 2e9,
className: "spinner",
top: "auto",
left: "auto",
position: "relative"
};
p.defaults = {}, l(p.prototype, {
spin: function(t) {
this.stop();
var a, l, e = this, n = e.opts, r = e.el = f(o(0, {
className: n.className
}), {
position: n.position,
width: 0,
zIndex: n.zIndex
}), s = n.radius + n.length + n.width;
if (t && (t.insertBefore(r, t.firstChild || null), l = d(t), a = d(r), f(r, {
left: ("auto" == n.left ? l.x - a.x + (t.offsetWidth >> 1) : parseInt(n.left, 10) + s) + "px",
top: ("auto" == n.top ? l.y - a.y + (t.offsetHeight >> 1) : parseInt(n.top, 10) + s) + "px"
})), r.setAttribute("role", "progressbar"), e.lines(r, e.opts), !i) {
var c, u = 0, p = (n.lines - 1) * (1 - n.direction) / 2, h = n.fps, m = h / n.speed, y = (1 - n.opacity) / (m * n.trail / 100), g = m / n.lines;
!function v() {
u++;
for (var t = 0; t < n.lines; t++) c = Math.max(1 - (u + (n.lines - t) * g) % m * y, n.opacity),
e.opacity(r, t * n.direction + p, c, n);
e.timeout = e.el && setTimeout(v, ~~(1e3 / h));
}();
}
return e;
},
stop: function() {
var t = this.el;
return t && (clearTimeout(this.timeout), t.parentNode && t.parentNode.removeChild(t),
this.el = void 0), this;
},
lines: function(t, e) {
function d(t, i) {
return f(o(), {
position: "absolute",
width: e.length + e.width + "px",
height: e.width + "px",
background: t,
boxShadow: i,
transformOrigin: "left",
transform: "rotate(" + ~~(360 / e.lines * r + e.rotate) + "deg) translate(" + e.radius + "px,0)",
borderRadius: (e.corners * e.width >> 1) + "px"
});
}
for (var l, r = 0, a = (e.lines - 1) * (1 - e.direction) / 2; r < e.lines; r++) l = f(o(), {
position: "absolute",
top: 1 + ~(e.width / 2) + "px",
transform: e.hwaccel ? "translate3d(0,0,0)" : "",
opacity: e.opacity,
animation: i && s(e.opacity, e.trail, a + r * e.direction, e.lines) + " " + 1 / e.speed + "s linear infinite"
}), e.shadow && n(l, f(d("#000", "0 0 4px #000"), {
top: "2px"
})), n(t, n(l, d(e.color, "0 0 1px rgba(0,0,0,.1)")));
return t;
},
opacity: function(t, e, i) {
e < t.childNodes.length && (t.childNodes[e].style.opacity = i);
}
});
var h = f(o("group"), {
behavior: "url(#default#VML)"
});
return !a(h, "transform") && h.adj ? c() : i = a(h, "animation"), p;
});
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 -1 !== this.indexOf(str, this.length - str.length);
}), 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(-1 * l);
};
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]; -1 !== (ax = this.indexOf(what)); ) this.splice(ax, 1);
return this;
});
}();
var DocumentState = {
init: "init",
progress: "progress",
completed: "completed",
error: "error"
}, ParameterType = {
String: "string",
DateTime: "datetime",
Bool: "bool",
Int: "int",
Float: "float"
}, ParameterState = {
Ok: "Ok",
ExpectValue: "ExpectValue",
HasOutstandingDependencies: "HasOutstandingDependencies",
ValidationFailed: "ValidationFailed",
DynamicValuesUnavailable: "DynamicValuesUnavailable"
}, ParameterEditorType = {
SelectOneFromMany: "SelectOneFromMany",
MultiValue: "MultiValue",
MultiLine: "MultiLine",
SingleValue: "SingleValue"
}, ParameterSpecialValue = {
SelectAll: {
toString: function() {
return "(SELECT ALL)";
}
}
}, ExportType = {
Pdf: "Pdf",
Word: "Word",
Image: "Image",
Html: "Html",
Xls: "Xls"
}, ActionType = {
hyperlink: 0,
bookmark: 1,
drillthrough: 2,
toggle: 3
}, SidebarState = {
Hidden: "Hidden",
Search: "Search",
Parameters: "Parameters",
TOC: "TOC"
};
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() {
$(element).spin(visible() ? "load" : !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) {
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();
ko.bindingHandlers.enable.update(element, function() {
return cmd.hasOwnProperty("enabled") ? cmd.enabled : !0;
}, allBindings, viewModel, bindingContext);
}
}, 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();
ko.bindingHandlers.html.update(element, function() {
return settings.page;
}, allBindings, viewModel, bindingContext), settings.onupdate && settings.onupdate.apply && settings.onupdate(element);
}
}, 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),
$(elem).on("click", ".dropdown-menu", function(e) {
$(this).hasClass("dropdown-menu-form") && 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.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;
}, "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
};
!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"
};
}(jQuery), 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*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
}
}, window.GrapeCity = {
ActiveReports: {
Viewer: createViewer
}
};
}(window);