UNPKG

@progress/kendo-ui

Version:

This package is part of the [Kendo UI for jQuery](http://www.telerik.com/kendo-ui) suite.

2,229 lines 74.5 kB
require("./kendo.core-kmRaf_Lg.js");
require("./kendo.icons.js");
require("./kendo.draganddrop.js");
require("./kendo.mobile.scroller.js");
require("./kendo.dropdownlist.js");
require("./kendo.numerictextbox.js");
require("./kendo.textbox.js");
require("./kendo.combobox.js");
require("./kendo.binder.js");
require("./kendo.upload.js");
require("./kendo.form.js");
require("./kendo.window.js");
require("./kendo.drawing.js");
require("./kendo.toolbar.js");
require("./kendo.pager.js");
require("./kendo.colorpicker.js");
require("./kendo.dialog.js");
let _progress_kendo_pdfviewer_common = require("@progress/kendo-pdfviewer-common");
require("pdfjs-dist/build/pdf.worker.mjs");
//#region ../src/pdfviewer/processors/dpl-processor.js
(function($, undefined) {
	var kendo = window.kendo, extend = $.extend;
	extend(kendo, { pdfviewer: { dpl: { processor: kendo.Class.extend({
		init: function(options, viewer) {
			var that = this;
			that.options = options;
			that.read = options.read;
			that.upload = options.upload;
			that.download = options.download;
			that.viewer = viewer;
		},
		fetchDocument: function() {
			var that = this, deferred = $.Deferred(), errorMessages = that.viewer.options.messages.errorMessages;
			if (!that.read) return deferred.resolve();
			$.ajax({
				type: that.read.type,
				url: that.read.url,
				dataType: that.read.dataType,
				success: function(data) {
					if (typeof data != "string") data = kendo.stringify(data);
					deferred.resolve(JSON.parse(data));
				},
				error: function(xhr) {
					that.viewer._triggerError({
						error: xhr.responseText,
						message: errorMessages.parseError
					});
				}
			});
			return deferred;
		},
		fetchPageData: function(number) {
			var that = this;
			var deferred = $.Deferred();
			var page = that.viewer.document.pages[number - 1];
			var data = {};
			data[that.read.pageField] = number;
			if (!page.geometries.length) $.ajax({
				type: that.read.type,
				url: that.read.url,
				data,
				success: function(data) {
					deferred.resolve(JSON.parse(data));
				},
				error: function(xhr) {
					that.viewer._triggerError({
						error: xhr.responseText,
						message: that.viewer.options.messages.errorMessages.parseError
					});
				}
			});
			else deferred.resolve(page);
			return deferred;
		},
		downloadFile: function(fileName) {
			window.location = this.download.url + "?file=" + fileName;
		},
		fromJSON: function(json) {
			var viewer = this.viewer;
			viewer._clearPages();
			viewer.document = json;
			viewer.document.total = viewer.document.pages.length;
			viewer._renderPages();
			viewer.resize(true);
			viewer.activatePage(1);
		}
	}) } } });
})(window.kendo.jQuery);
//#endregion
//#region ../src/pdfviewer/pdfjs.js
function isLoaded() {
	if (!window.pdfjsLib) {
		console?.error(`PDF.JS library is required. Make sure that it is properly loaded <script src="https://unpkg.com/pdfjs-dist@5.6.205/build/pdf.mjs" type="module"><\/script>`);
		return false;
	}
	if (!window.pdfjsLib?.GlobalWorkerOptions?.workerSrc && !window.pdfjsWorker) {
		console?.error(`The pdf.worker.mjs script is not loaded. The PDF.JS library will not work correctly.
    Either load the script:
    
    <script src="https://unpkg.com/pdfjs-dist@5.6.205/build/pdf.worker.mjs" type="module"><\/script>
    
    Or set it to the GlobalWorkerOptions.workerSrc property:
    
    <script type="module">
        pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://unpkg.com/pdfjs-dist@5.6.205/build/pdf.worker.mjs';
    <\/script>`);
		return false;
	}
	return true;
}
kendo.pdfviewer.pdfjs = { lib: window.pdfjsLib };
//#endregion
//#region ../src/pdfviewer/upload.js
(function($, undefined) {
	var Class = kendo.Class, extend = $.extend, parseJSON = JSON.parse, progress = kendo.ui.progress, Class = kendo.Class, OPEN = "open";
	var UploadHelper = Class.extend({
		init: function(viewer) {
			this.viewer = viewer;
			this.errorMessages = this.viewer.options.messages.errorMessages;
			this.upload = this.viewer.processor && this.viewer.processor.upload;
		},
		_initUpload: function(uploadElement, extendUploadOptions) {
			var uploadOptions = extend({
				select: this._onSelect.bind(this),
				success: this._onSuccess.bind(this),
				error: this._onError.bind(this),
				complete: this._onComplete.bind(this),
				showFileList: false,
				multiple: false,
				validation: { allowedExtensions: [".pdf"] }
			}, extendUploadOptions || {});
			if (this.upload) extend(uploadOptions, { async: {
				saveUrl: this.upload.url,
				autoUpload: true,
				saveField: this.upload.saveField
			} });
			return (uploadElement || $("<input name=\"files\" accept=\".pdf\" type=\"file\" />")).kendoUpload(uploadOptions).getKendoUpload();
		},
		_onComplete: function() {
			progress(this.viewer.pageContainer, false);
		},
		_onSuccess: function(e) {
			var json = parseJSON(e.response);
			if ($.isPlainObject(json)) this.viewer.processor.fromJSON(json);
			else this.viewer._triggerError({
				error: json,
				message: this.errorMessages.parseError
			});
		},
		_onError: function(e) {
			this.viewer._triggerError({
				error: e.XMLHttpRequest.responseText,
				message: this.errorMessages.notSupported
			});
		},
		_onSelect: function(e) {
			var that = this;
			var fileToUpload = e.files[0];
			progress(that.viewer.pageContainer, true);
			if (that.viewer.trigger(OPEN, { file: fileToUpload }) || that.upload) return;
			else if (fileToUpload.extension.toLowerCase() !== ".pdf") {
				that.viewer._triggerError({
					error: fileToUpload,
					message: that.errorMessages.notSupported
				});
				return;
			}
			var reader = new FileReader();
			reader.onload = function(e) {
				var document = e.target.result;
				const loadParams = that.viewer._isDPLProcessor() ? document : { data: document };
				that.viewer.fromFile(loadParams);
			};
			reader.onerror = function() {
				that.viewer._triggerError({
					error: fileToUpload,
					message: that.errorMessages.parseError
				});
			};
			reader.readAsArrayBuffer(fileToUpload.rawFile);
		}
	});
	extend(kendo.pdfviewer, { UploadHelper });
})(window.kendo.jQuery);
//#endregion
//#region ../src/pdfviewer/page.js
(function($, undefined) {
	var extend = $.extend, noop = $.noop, drawing = kendo.drawing, Group = drawing.Group, Surface = drawing.Surface, RENDER = "render", Class = kendo.Class, UploadHelper = kendo.pdfviewer.UploadHelper;
	var geometryTypes = {
		Path: "path",
		MultiPath: "multipath",
		Rect: "rect",
		Image: "image",
		Text: "text"
	};
	var BLANK_PAGE_TEMPLATE = (dropzoneId) => `<div class="k-page k-blank-page">
        <div id="${dropzoneId}" class="k-external-dropzone">
            <div class="k-dropzone-inner">
                <span class="k-dropzone-icon k-icon k-svg-icon k-icon-xxxl k-svg-i-upload">
                    <svg aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
                        <path d="M32 384v96h448v-96H32zm192-64h64V192h96L256 32 128 192h96v128z"></path>
                    </svg>
                </span>
                <span class="k-dropzone-hint">Drag and drop files here to upload</span>
            </div>
        </div>
        <input name="files" accept=".pdf" type="file" ref-pdfviewer-blank-page-upload>
    </div>`;
	var Page = Class.extend({
		init: function(options, viewer) {
			this.viewer = viewer;
			this.processor = options.processor;
			this.options = options;
			this.pageNumber = options.number;
			this.element = $("<div class='k-page' />");
			this.element.attr(kendo.attr("number"), this.pageNumber);
			this._updatePageSize(options);
			this.width = options.width;
			this.height = options.height;
		},
		resize: function(ratio) {
			var pageElement = this.element;
			this._updatePageSize({
				width: Math.min(pageElement.width() * ratio, this.width),
				height: Math.min(pageElement.height() * ratio, this.height)
			});
		},
		_updatePageSize: function(size) {
			if (typeof CSSStyleSheet !== "undefined" && typeof CSSStyleSheet.prototype.replaceSync === "function") {
				if (!this._pageStyleId) {
					this._pageStyleId = kendo.guid();
					this.element[0].setAttribute(kendo.attr("page-id"), this._pageStyleId);
					this._sheet = new CSSStyleSheet();
					document.adoptedStyleSheets = [...document.adoptedStyleSheets || [], this._sheet];
				}
				if (this._sheet) this._sheet.replaceSync("[" + kendo.attr("page-id") + "=\"" + this._pageStyleId + "\"] { width: " + size.width + "px; height: " + size.height + "px; }");
			} else this.element.width(size.width).height(size.height);
		},
		destroy: function() {
			if (this._sheet) {
				document.adoptedStyleSheets = Array.from(document.adoptedStyleSheets || []).filter((s) => s !== this._sheet);
				this._sheet = null;
			}
			kendo.destroy(this.element);
		},
		render: noop
	});
	var BlankPage = Page.extend({
		init: function(options, viewer) {
			this.viewer = viewer;
			this.options = options;
			this._externalDropZoneId = `${viewer.element.attr("id")}-external-dropzone`;
			this.element = $(BLANK_PAGE_TEMPLATE(this._externalDropZoneId));
			this._uploadHelper = new UploadHelper(viewer);
		},
		_initUpload: function() {
			this._upload = this._uploadHelper._initUpload(this.element.find("input[ref-pdfviewer-blank-page-upload]"), {
				dropZone: `#${this._externalDropZoneId}`,
				showFileList: false,
				async: {
					autoUpload: false,
					saveUrl: "save"
				}
			});
		},
		resize: noop,
		_updatePageSize: noop,
		destroy: function() {
			if (this._upload) this._upload.destroy();
			kendo.destroy(this.element);
		},
		render: noop
	});
	var DPLPage = Page.extend({
		draw: function() {
			var that = this, geometries = that.options.geometries;
			that.group = new Group();
			that.surface.draw(that.group);
			that._drawGeometries(geometries);
			that.viewer.trigger(RENDER, { page: this });
			kendo.ui.progress(that.element, false);
		},
		load: function() {
			var that = this;
			if (that.loaded || !that.processor) return;
			that.processor.fetchPageData(that.pageNumber).then(function(data) {
				that.options = data;
				that._initSurface();
				that.draw();
			});
			that.loaded = true;
		},
		_initSurface: function() {
			var size = {
				width: this.element.width(),
				height: this.element.height()
			};
			var surfaceOptions = extend({
				width: this.width,
				height: this.height
			}, this.viewer.options.view);
			this.surface = new Surface(this.element, surfaceOptions);
			this._updatePageSize(size);
		},
		_drawGeometries: function(geometries) {
			var that = this, kGeometry;
			if (!geometries) return;
			for (var i = 0; i <= geometries.length; i++) {
				var geometry = geometries[i];
				if (!geometry) continue;
				switch (geometry.type) {
					case geometryTypes.Path:
					case geometryTypes.MultiPath:
						kGeometry = that._drawPath(geometry);
						break;
					case geometryTypes.Rect:
						kGeometry = that._drawRect(geometry);
						break;
					case geometryTypes.Image:
						kGeometry = that._drawImage(geometry);
						break;
					case geometryTypes.Text:
						kGeometry = that._drawText(geometry);
						break;
					default:
						kGeometry = null;
						break;
				}
				if (kGeometry) that.group.append(kGeometry);
			}
		},
		_drawRect: function(geometry) {
			var rectGeo = new kendo.geometry.Rect(geometry.point, geometry.size);
			return new drawing.Rect(rectGeo, {
				transform: this._getMatrix(geometry.transform),
				fill: geometry.fillOptions,
				stroke: geometry.strokeOptions
			});
		},
		_drawImage: function(geometry) {
			var imageRect = new kendo.geometry.Rect(geometry.point, geometry.size);
			return new drawing.Image(geometry.src, imageRect, { transform: this._getMatrix(geometry.transform) });
		},
		_drawText: function(geometry) {
			var options = {
				transform: this._getMatrix(geometry.transform),
				stroke: geometry.strokeOptions,
				fill: geometry.fillOptions,
				font: geometry.font
			};
			return new kendo.drawing.Text(geometry.content, geometry.point, options);
		},
		_drawPath: function(geometry) {
			var options = {
				transform: this._getMatrix(geometry.transform),
				stroke: geometry.strokeOptions,
				fill: geometry.fillOptions
			};
			var path = new drawing.MultiPath(options);
			for (var i = 0; i < geometry.paths.length; i++) {
				var subPath = geometry.paths[i];
				if (!subPath.segments) return;
				path.moveTo.apply(path, subPath.point);
				for (var j = 0; j < subPath.segments.length; j++) {
					var segment = subPath.segments[j];
					(segment.points.length === 1 ? path.lineTo : path.curveTo).apply(path, segment.points);
				}
				if (subPath.closed) path.close();
			}
			return path;
		},
		_getMatrix: function(transform) {
			return new kendo.geometry.Matrix(...transform);
		}
	});
	extend(kendo.pdfviewer.dpl, {
		geometryTypes,
		Page: DPLPage
	});
	extend(kendo.pdfviewer, { BlankPage });
})(window.kendo.jQuery);
//#endregion
//#region ../src/pdfviewer/annotations/annotation-manager.js
const deleteAnnotation = (widget) => {
	widget.deleteAnnotation();
};
const setHighlightTextColor = (widget, color) => {
	widget.setHighlightColor(color);
};
const setFreeTextFontColor = (widget, color) => {
	widget.setFreeTextColor(color);
};
const setFreeTextFontSize = (widget, fontSize) => {
	widget.setFreeTextFontSize(fontSize);
};
const setAnnotationEditorMode = (widget, args) => {
	if (widget.interactionMode !== args.mode) widget.setInteractionMode({ mode: args.mode });
	widget.setAnnotationEditorMode(args);
};
const resetAnnotationEditorMode = (widget) => {
	widget.resetAnnotationEditorMode();
};
const setInteractionMode = (widget, mode) => {
	widget.setInteractionMode({ mode });
};
//#endregion
//#region ../src/pdfviewer/annotations/annotation-toolbar.js
const $$1 = jQuery;
const AnnotationEditorType = {
	DISABLE: -1,
	NONE: 0,
	FREETEXT: 3,
	HIGHLIGHT: 9
};
var AnnotationToolbar = class {
	constructor(viewer) {
		this.viewer = viewer;
		this.widget = viewer.pdfViewerCommon;
		this.init();
	}
	init() {
		const annotationsToolbar = this.element = $$1("<div></div>");
		annotationsToolbar.insertAfter(this.viewer.toolbar.element);
		const toolbar = this.toolbar = new kendo.ui.ToolBar(annotationsToolbar, {
			fillMode: "flat",
			tools: [
				{
					name: "highlight",
					command: "highlight",
					icon: "highlight",
					type: "button",
					togglable: true,
					showText: "overflow",
					group: "annotations",
					fillMode: "flat"
				},
				{ type: "separator" },
				{
					name: "freeText",
					command: "freeText",
					icon: "free-text",
					type: "button",
					togglable: true,
					showText: "overflow",
					group: "annotations",
					fillMode: "flat"
				},
				{ type: "spacer" },
				{
					name: "close",
					command: "close",
					icon: "x",
					type: "button",
					showText: "overflow",
					fillMode: "flat"
				}
			],
			parentMessages: {
				highlight: "Highlight",
				freeText: "Free text",
				close: "Close"
			}
		});
		toolbar.bind("click", this.onToolbarClick.bind(this));
		toolbar.bind("toggle", this.onToolbarClick.bind(this));
	}
	onToolbarClick(e) {
		const widget = this.widget;
		const command = $$1(e.target).data("command");
		const viewerToolbar = this.viewer.toolbar;
		switch (command) {
			case "close":
				this.destroy();
				viewerToolbar.element.find("[tabindex=0]").trigger("focus");
				break;
			case "highlight":
				setAnnotationEditorMode(widget, {
					interactionMode: _progress_kendo_pdfviewer_common.PdfViewerInteractionMode.TextSelection,
					mode: AnnotationEditorType.HIGHLIGHT
				});
				break;
			case "freeText":
				setAnnotationEditorMode(widget, {
					interactionMode: _progress_kendo_pdfviewer_common.PdfViewerInteractionMode.TextSelection,
					mode: AnnotationEditorType.FREETEXT
				});
				break;
		}
	}
	destroy() {
		if (this.toolbar) {
			this.viewer.toolbar.toggle("[title='Annotations']", false);
			this.toolbar.unbind("click");
			this.toolbar.unbind("toggle");
			this.toolbar.destroy();
			this.toolbar = null;
			this.element.remove();
			this.element = null;
			this.viewer.annotationsToolbar = null;
			resetAnnotationEditorMode(this.widget);
		}
	}
};
//#endregion
//#region ../src/pdfviewer/commands.js
(function($, undefined) {
	var kendo = window.kendo, extend = $.extend, progress = kendo.ui.progress, Class = kendo.Class, UploadHelper = kendo.pdfviewer.UploadHelper, ZOOMSTART = "zoomStart", ZOOMEND = "zoomEnd";
	var Command = Class.extend({ init: function(options) {
		this.options = options;
		this.viewer = options.viewer;
		this.errorMessages = this.viewer.options.messages.errorMessages;
	} });
	var OpenCommand = Command.extend({
		init: function(options) {
			Command.fn.init.call(this, options);
			this._uploadHelper = new UploadHelper(this.viewer);
		},
		exec: function() {
			this.viewer._upload = this.viewer._upload || this._uploadHelper._initUpload();
			this.viewer._upload.element.click();
		}
	});
	var PageChangeCommand = Command.extend({ exec: function() {
		var targetPage = this.options.value, viewer = this.viewer, current, total;
		if (isNaN(targetPage)) {
			current = viewer._pageNum;
			total = viewer.document.total || viewer.document.numPages;
			switch (targetPage) {
				case "first":
					targetPage = 1;
					break;
				case "prev":
					targetPage = current > 1 ? current - 1 : 1;
					break;
				case "next":
					targetPage = current < total ? current + 1 : total;
					break;
				case "last":
					targetPage = total;
					break;
			}
		} else targetPage = Number(targetPage);
		viewer.activatePage(targetPage, false);
	} });
	var DownloadCommand = Command.extend({ exec: function() {
		const that = this;
		if (!that.viewer.document) {
			that.viewer._triggerError({ message: that.errorMessages.notFound });
			return;
		}
		const fileName = that.viewer.document.info && that.viewer.document.info.title || that.viewer.options.messages.defaultFileName;
		if (that.viewer._isDPLProcessor()) that.viewer.processor.downloadFile(fileName);
		else that.viewer.pdfViewerCommon.downloadFile({ fileName });
	} });
	var ExportCommand = Command.extend({
		init: function(options) {
			options = $.extend(options, this.options);
			Command.fn.init.call(this, options);
		},
		exec: function() {
			var dialog = this.viewer._saveDialog || this._initDialog();
			dialog._updateModel({
				pagesCount: this.viewer.document && this.viewer.document.total || 1,
				page: this.viewer.options.page
			});
			dialog.open();
		},
		apply: function(viewModel) {
			var extension = viewModel.extension;
			if (extension === ".png") this.viewer.exportImage(viewModel);
			else if (extension === ".svg") this.viewer.exportSVG(viewModel);
		},
		_initDialog: function() {
			this.viewer._saveDialog = new kendo.pdfviewer.dialogs.ExportAsDialog({
				apply: this.apply.bind(this),
				pagesCount: this.viewer.document && this.viewer.document.total || 1,
				messages: this.viewer.options.messages
			});
			return this.viewer._saveDialog;
		}
	});
	var EnableSelectionCommand = Command.extend({ exec: function() {
		const viewer = this.viewer;
		viewer.toolbar.enable(viewer.toolbar.element.find("[data-command=AnnotationsCommand]"), true);
		setInteractionMode(viewer.pdfViewerCommon, _progress_kendo_pdfviewer_common.PdfViewerInteractionMode.TextSelection);
	} });
	var EnablePanCommand = Command.extend({ exec: function() {
		const viewer = this.viewer;
		viewer.toolbar.enable(viewer.toolbar.element.find("[data-command=AnnotationsCommand]"), false);
		if (viewer.annotationsToolbar) viewer.annotationsToolbar.destroy();
		resetAnnotationEditorMode(viewer.pdfViewerCommon);
		setInteractionMode(viewer.pdfViewerCommon, _progress_kendo_pdfviewer_common.PdfViewerInteractionMode.Pan);
	} });
	const OpenSearchCommand = Command.extend({
		init: function(options) {
			const that = this;
			that.viewer = options.viewer;
			if (!that.viewer.searchDialog) that.viewer.searchDialog = new kendo.pdfviewer.dialogs.SearchDialog({
				pageContainer: that.viewer.pageContainerWrapper,
				position: {
					top: that.viewer.pageContainer.offset().top,
					left: that.viewer.pageContainer.offset().left
				},
				messages: that.viewer.options.messages.dialogs.search,
				open: that._open.bind(that),
				next: that._next.bind(that),
				prev: that._prev.bind(that),
				close: that._close.bind(that)
			});
			Command.fn.init.call(that, options);
		},
		exec: function() {
			this.viewer.searchDialog.open();
		},
		_open: function() {
			const that = this;
			that.changeHandler = that._change.bind(that);
			that.viewer.searchDialog.searchModel.bind("change", that.changeHandler);
		},
		_close: function() {
			const that = this;
			that.viewer.pdfViewerCommon.clearSearch();
			that.viewer.toolbar.element.find("[tabindex=0]").trigger("focus");
			that.viewer.searchDialog.searchModel.unbind("change", that.changeHandler);
			that.matches = [];
			that.matchIndex = null;
			that._updateSearchModel();
		},
		_change: function(ev) {
			const that = this, text = that.viewer.searchDialog.searchModel["searchText"], matchCase = that.viewer.searchDialog.searchModel["matchCase"];
			if (ev.field === "searchText" || ev.field === "matchCase") {
				that.matches = that.viewer.pdfViewerCommon.searchText({
					text,
					matchCase
				});
				that.matchIndex = that.matches.length ? 1 : 0;
				that._updateSearchModel();
			}
		},
		_next: function() {
			const that = this;
			that.viewer.pdfViewerCommon.goToNextSearchMatch();
			that.matchIndex = that.matchIndex + 1 > that.matches.length ? 1 : that.matchIndex + 1;
			that._updateSearchModel();
		},
		_prev: function() {
			const that = this;
			that.viewer.pdfViewerCommon.goToPreviousSearchMatch();
			that.matchIndex = that.matchIndex - 1 < 1 ? that.matches.length : that.matchIndex - 1;
			that._updateSearchModel();
		},
		_updateSearchModel: function() {
			const that = this, model = that.viewer.searchDialog.searchModel;
			if (that.matches && that.matches.length) {
				model.set("matches", that.matches.length);
				model.set("matchIndex", that.matchIndex);
			} else {
				model.set("searchText", "");
				model.set("matches", 0);
				model.set("matchIndex", 0);
			}
		},
		_closeDialog: function() {
			this.viewer.searchDialog.close();
		}
	});
	var ZoomCommand = Command.extend({
		exec: function() {
			const that = this;
			const scale = that._calculateZoom();
			if (scale === undefined) return;
			let zoomLevel = scale.zoomLevel;
			if (that.viewer.zoomScale !== scale.zoomLevel) {
				that.viewer._preventRenderEvent = true;
				that.viewer._currentPage = that.viewer.pdfViewerCommon.getCurrentPageIndex() + 1;
				that.viewer.pdfViewerCommon.zoom({
					zoomLevel: scale.zoomLevel,
					zoomLevelType: scale.zoomLevelType
				});
				zoomLevel = that.viewer.pdfViewerCommon.options.zoomLevel;
				that._triggerZoomEnd(zoomLevel);
			}
			that.viewer.zoomScale = zoomLevel;
		},
		_calculateZoom: function() {
			var options = this.options, viewer = this.viewer, viewerOptions = viewer.options, scale = options.value || options.scale, scaleValue = scale, zoomLevelType = "", preventZoom;
			viewer._allowResize = false;
			viewer._autoFit = false;
			if (options.zoomIn) scaleValue = scale = viewer.zoomScale + viewerOptions.zoomRate;
			else if (options.zoomOut) scaleValue = scale = viewer.zoomScale - viewerOptions.zoomRate;
			else if (scale === "auto") {
				viewer._allowResize = true;
				scaleValue = viewer._autoZoomScale;
			} else if (typeof scale === "string" && !kendo.parseFloat(scale)) zoomLevelType = scale;
			else if (scale && scale.toString().match(/^[0-9]+%?$/)) {
				scale = parseInt(scale.replace("%", ""), 10) / 100;
				scaleValue = scale;
			} else preventZoom = isNaN(scale);
			if (!preventZoom) preventZoom = scale < viewerOptions.zoomMin || scale > viewerOptions.zoomMax;
			if (preventZoom || viewer.trigger(ZOOMSTART, { scale })) return;
			if (options.updateComboBox && viewer.toolbar) viewer._updateZoomComboBox(scale);
			return {
				zoomLevel: scaleValue,
				zoomLevelType
			};
		},
		_triggerZoomEnd: function(scale) {
			this.viewer.trigger(ZOOMEND, { scale });
		}
	});
	var PrintCommand = Command.extend({
		init: function(options) {
			Command.fn.init.call(this, options);
		},
		exec: function() {
			const that = this;
			if (!that.viewer.document) {
				that.viewer._triggerError({ message: this.errorMessages.notFound });
				return;
			}
			progress(that.viewer.pageContainerWrapper, true);
			setTimeout(() => {
				that.viewer.pdfViewerCommon.printFile();
			}, 100);
		}
	});
	const AnnotationsCommand = Command.extend({
		init: function(options) {
			Command.fn.init.call(this, options);
		},
		exec: function() {
			const viewer = this.viewer;
			if (viewer.annotationsToolbar) viewer.annotationsToolbar.destroy();
			else viewer.annotationsToolbar = new AnnotationToolbar(viewer);
		}
	});
	extend(kendo.pdfviewer, {
		OpenCommand,
		PageChangeCommand,
		DownloadCommand,
		EnableSelectionCommand,
		EnablePanCommand,
		ExportCommand,
		PrintCommand,
		OpenSearchCommand,
		ZoomCommand,
		AnnotationsCommand
	});
})(window.kendo.jQuery);
//#endregion
//#region ../src/pdfviewer/dialogs.js
(function($, undefined) {
	var kendo = window.kendo, encode = kendo.htmlEncode, extend = $.extend, Class = kendo.Class, Draggable = kendo.ui.Draggable, outerWidth = kendo._outerWidth, EXTENSIONS = {
		svg: ".svg",
		png: ".png"
	}, keys = kendo.keys;
	var ErrorDialog = Class.extend({
		init: function(options) {
			this.options = extend(options, { actions: [{ text: options.messages.dialogs.okText }] });
			this._dialog = $("<div />").kendoDialog(this.options).getKendoDialog();
		},
		open: function() {
			this._dialog.center().open();
		}
	});
	var ExportAsDialog = Class.extend({
		init: function(options) {
			this.options = extend(options, this.options, {
				fileFormats: [{
					description: options.messages.dialogs.exportAsDialog.png,
					extension: EXTENSIONS.png
				}, {
					description: options.messages.dialogs.exportAsDialog.svg,
					extension: EXTENSIONS.svg
				}],
				title: options.messages.dialogs.exportAsDialog.title,
				open: function() {
					this.center();
				}
			});
			this._initializeDialog();
			return this;
		},
		options: {
			extension: EXTENSIONS.png,
			autoFocus: true,
			resizable: false,
			modal: { preventScroll: true },
			width: "90%",
			maxWidth: 520,
			template: ({ messages, total }) => `<div class='k-edit-label'><label>${encode(messages.exportAsDialog.labels.fileName)}:</label></div><div class='k-edit-field'><span class='k-textbox k-input'><input class='k-input-inner' data-bind='value: name' /></span></div><div><div class='k-edit-label'><label>${encode(messages.exportAsDialog.labels.saveAsType)}:</label></div><div class='k-edit-field'><select data-role='dropdownlist' class='k-file-format' data-text-field='description' data-value-field='extension' data-bind='value: extension, source: fileFormats'></select></div></div><div class='k-edit-label'><label>${encode(messages.exportAsDialog.labels.page)}:</label></div><div class='k-edit-field'><input data-role='numerictextbox' data-format='n0' data-min='1' data-max='${encode(total)}' data-bind='value: page' /></div><div class='k-actions'><button class='k-button k-button-primary' data-bind='click: apply'><span class='k-button-text'>${encode(messages.save)}</span></button><button class='k-button' data-bind='click: close'><span class='k-button-text'>${encode(messages.cancel)}</span></button></div>`
		},
		_updateModel: function(options) {
			if (options.pagesCount) this.viewModel.set("pagesCount", options.pagesCount);
			if (options.page) this.viewModel.set("page", options.page);
		},
		_initializeDialog: function() {
			var that = this;
			var options = that.options;
			var dialogMessages = options.messages.dialogs;
			var dialog = $("<div class='k-pdf-viewer-window k-action-window k-popup-edit-form' />").append(kendo.template(options.template)({
				total: options.pagesCount,
				messages: dialogMessages
			})).kendoWindow(options).getKendoWindow();
			that.viewModel = kendo.observable({
				title: dialogMessages.exportAsDialog.title,
				name: dialogMessages.exportAsDialog.defaultFileName,
				extension: options.extension,
				fileFormats: options.fileFormats,
				pagesCount: options.pagesCount,
				page: 1,
				apply: that.apply.bind(this),
				close: function() {
					dialog.close();
				}
			});
			that._dialog = dialog;
			kendo.bind(dialog.element, that.viewModel);
			return dialog;
		},
		open: function() {
			this._dialog.center().open();
		},
		apply: function() {
			this._dialog.close();
			this.options.apply({
				fileName: this.viewModel.name + this.viewModel.extension,
				extension: this.viewModel.extension,
				page: this.viewModel.page
			});
		},
		destroy: function() {
			if (this._dialog) this._dialog.destroy();
		}
	});
	var SearchDialog = Class.extend({
		init: function(options) {
			var that = this;
			that.options = extend({}, options, that.options);
		},
		options: {
			resizable: false,
			template: ({ messages }) => `<div class="k-search-panel k-pos-sticky k-top-center"><button aria-label='${encode(messages.dragHandle)}' class='k-button k-button-flat k-icon-button k-search-dialog-draghandle'>${kendo.ui.icon({
				icon: "handle-drag",
				iconClass: "k-button-icon"
			})}</button><span class='k-textbox k-input'><input class='k-search-dialog-input k-input-inner' data-bind='value: boundValue, events: { keyup: onKeyup, input: onInput }' aria-label='${encode(messages.inputLabel)}' title='${encode(messages.inputLabel)}' /><span class='k-input-suffix'><button class='k-button k-button-flat k-icon-button k-match-case-button k-match-case-button' data-bind='css: {k-selected: matchCase}, click: matchCaseClick' aria-label='${encode(messages.matchCase)}' title='${encode(messages.matchCase)}'>${kendo.ui.icon({
				icon: "convert-lowercase",
				iconClass: "k-button-icon"
			})}</button></span></span><span class='k-search-matches'><span data-bind='text: matchIndex'></span> ${encode(messages.of)} <span data-bind='text: matches'></span></span><button class='k-button k-button-flat k-icon-button' data-bind='click: prev' aria-label='${encode(messages.previous)}' title='${encode(messages.previous)}'>${kendo.ui.icon({
				icon: "arrow-up",
				iconClass: "k-button-icon"
			})}</button><button class='k-button k-button-flat k-icon-button' data-bind='click: next' aria-label='${encode(messages.next)}' title='${encode(messages.next)}'>${kendo.ui.icon({
				icon: "arrow-down",
				iconClass: "k-button-icon"
			})}</button><button class='k-button k-button-flat k-icon-button' data-bind='click: close' aria-label='${encode(messages.close)}' title='${encode(messages.close)}'>${kendo.ui.icon({
				icon: "x",
				iconClass: "k-button-icon"
			})}</button></div>`
		},
		open: function() {
			var that = this;
			if (!that.dialog) that._initializeDialog();
			that.options.open();
			that._showSearchDialog();
		},
		close: function() {
			var that = this;
			that.options.close();
			that._hideSearchDialog();
		},
		_showSearchDialog: function() {
			var that = this;
			that.dialog.css("left", `${that.options.pageContainer.innerWidth() / 2 - outerWidth(that.dialog, true) / 2}px`);
			that.dialog.kendoStop().kendoAnimate({
				effects: {
					zoom: { direction: "in" },
					fade: { direction: "in" }
				},
				duration: 350,
				complete: function(ev) {
					that.dialog.find(".k-search-dialog-input").trigger("focus");
				}
			});
		},
		_hideSearchDialog: function() {
			this.dialog.kendoStop().kendoAnimate({
				effects: {
					zoom: {
						direction: "out",
						properties: { scale: .7 }
					},
					fade: { direction: "out" }
				},
				duration: 350,
				hide: true
			});
		},
		_initializeDialog: function() {
			var that = this;
			var dialogElm = $(kendo.template(that.options.template)({ messages: that.options.messages }));
			that.options.pageContainer.prepend(dialogElm);
			that.dialog = dialogElm;
			that._draggable = new Draggable(dialogElm, {
				filter: ".k-search-dialog-draghandle",
				axis: "x",
				dragstart: function(e) {
					var wnd = that.dialog;
					var containment = that.options.pageContainer;
					wnd.startPosition = { left: e.x.client - kendo.getOffset(wnd, "position").left };
					if (!containment) return null;
					containment._innerWidth = containment.innerWidth();
					if (parseInt(containment._innerWidth, 10) > containment[0].clientWidth) containment._innerWidth -= kendo.support.scrollbar();
					wnd.maxLeft = containment._innerWidth - outerWidth(wnd, true);
				},
				drag: function(e) {
					var wnd = that.dialog;
					var position = {};
					var left = e.x.client - wnd.startPosition.left;
					if (left && isNaN(left) && left.toString().indexOf("px") < 0) position.left = left;
					else position.left = Math.max(Math.min(parseInt(left, 10), parseInt(wnd.maxLeft, 10)), 0);
					wnd.css(position);
				}
			});
			that._draggable.userEvents.stopPropagation = false;
			that.searchModel = kendo.observable({
				boundValue: "",
				searchText: "",
				matchCase: false,
				matchIndex: 0,
				matches: 0,
				matchCaseClick: function() {
					this.set("matchCase", !this.matchCase);
				},
				next: that.options.next,
				prev: that.options.prev,
				close: function() {
					this.set("boundValue", "");
					that.close();
				},
				onKeyup: function(ev) {
					var key = ev.keyCode;
					var navigationFn = ev.shiftKey ? this.prev : this.next;
					if (key === keys.ENTER) {
						navigationFn();
						ev.preventDefault();
					} else if (key == keys.ESC) this.close();
				},
				onInput: function(ev) {
					this.set("searchText", ev.target.value);
				}
			});
			kendo.bind(dialogElm, that.searchModel);
		}
	});
	extend(kendo.pdfviewer, { dialogs: {
		ErrorDialog,
		ExportAsDialog,
		SearchDialog
	} });
})(window.kendo.jQuery);
//#endregion
//#region ../src/pdfviewer/annotations/annotation-popup.js
const $ = jQuery;
var AnnotationPopup = class {
	constructor(viewer, anchor, editor) {
		this.viewer = viewer;
		this.widget = viewer.pdfViewerCommon;
		this.anchor = anchor;
		this.editor = editor;
		this.popupOpenHandler = this.onPopupOpen.bind(this);
		this.init();
	}
	init() {
		const anchor = this.anchor;
		const annotationPopupToolbarElement = $(`<div data-uid="${kendo.guid()}"></div>`);
		this.popup = new kendo.ui.Popup($(`<div class="k-pdf-viewer-annotation-editor-toolbar"></div>`), { anchor });
		this.popup.element.html(annotationPopupToolbarElement);
		(this.popupToolbar = new kendo.ui.ToolBar(annotationPopupToolbarElement, {
			fillMode: "flat",
			tools: [{
				name: "palette",
				command: "palette",
				icon: "palette",
				type: "button",
				showText: "overflow",
				fillMode: "flat"
			}, {
				name: "remove",
				command: "remove",
				icon: "trash",
				type: "button",
				showText: "overflow",
				fillMode: "flat"
			}],
			parentMessages: {
				palette: "Palette",
				remove: "Remove"
			}
		})).bind("click", this.onAnnotationPopupToolbarClick.bind(this));
		this.popup.open();
	}
	initEditor() {}
	onAnnotationPopupToolbarClick(e) {
		const widget = this.widget;
		switch ($(e.target).data("command")) {
			case "palette":
				this.initEditor();
				break;
			case "remove":
				deleteAnnotation(widget);
				this.destroyPopup();
				break;
			default: break;
		}
	}
	onPopupOpen() {
		this.flatColorPicker._view._hueSlider.resize();
		this.flatColorPicker._view._opacitySlider.resize();
	}
	anchorExists() {
		return document.getElementById(this.anchor.id);
	}
	destroyPopup() {
		if (this.popup) {
			this.popup.destroy();
			this.popup = null;
		}
	}
	destroyEditor() {
		if (this.editorPopup) {
			this.editorPopup.destroy();
			this.editorPopup = null;
		}
	}
	destroy() {
		if (this.popupToolbar) {
			this.popupToolbar.unbind("click");
			this.popupToolbar.unbind("toggle");
			this.popupToolbar.destroy();
			this.popupToolbar = null;
		}
		this.destroyPopup();
	}
};
var HighlightAnnotationPopup = class extends AnnotationPopup {
	constructor(viewer, anchor, editor) {
		super(viewer, anchor, editor);
	}
	initEditor() {
		const anchor = this.anchor;
		if (!this.anchorExists()) {
			this.destroy();
			return;
		}
		this.destroyEditor();
		this.editorPopup = new kendo.ui.Popup($(`
            <div class="k-pdf-viewer-annotation-editor">
                <span class="k-column-menu-group-header">
                    <span class="k-column-menu-group-header-text">Color</span>
                </span>
                <div ref-annotation-editor-flat-color-picker></div>
            </div>
`), {
			anchor,
			activate: this.popupOpenHandler
		});
		this.initFlatColorPicker();
		this.editorPopup.open();
		this.destroy();
	}
	initFlatColorPicker() {
		this.flatColorPicker = new kendo.ui.FlatColorPicker(this.editorPopup.element.find("[ref-annotation-editor-flat-color-picker]"), {
			format: "rgb",
			opacity: true,
			change: (e) => setHighlightTextColor(this.widget, e.value)
		});
	}
	onPopupOpen() {
		const currentColor = this.editor.color;
		super.onPopupOpen();
		this.flatColorPicker.value(currentColor);
	}
};
var FreeTextAnnotationPopup = class extends AnnotationPopup {
	constructor(viewer, anchor, editor) {
		super(viewer, anchor, editor);
	}
	initEditor() {
		const anchor = this.anchor;
		if (!this.anchorExists()) {
			this.destroy();
			return;
		}
		this.destroyEditor();
		this.editorPopup = new kendo.ui.Popup($(`
            <div class="k-pdf-viewer-annotation-editor">
                <span class="k-column-menu-group-header">
                        <span class="k-column-menu-group-header-text">Text style</span>
                    </span>
                    <form ref-annotation-text-editor-popup-form></form>
                <span class="k-column-menu-group-header">
                    <span class="k-column-menu-group-header-text">Color</span>
                </span>
                <div ref-annotation-editor-flat-color-picker></div>
            </div>
`), {
			anchor,
			activate: this.popupOpenHandler
		});
		this.initFontSizeForm();
		this.initFlatColorPicker();
		this.editorPopup.open();
		this.destroy();
	}
	initFontSizeForm() {
		const currentFontSize = this.editor.propertiesToUpdate[0][1];
		const fontSizeList = [
			8,
			9,
			10,
			11,
			12,
			13,
			14,
			16,
			20,
			22,
			24,
			26,
			28,
			36,
			48,
			72
		];
		this.fontSizeForm = new kendo.ui.Form($("[ref-annotation-text-editor-popup-form]"), {
			buttonsTemplate: () => "",
			formData: { fontSize: currentFontSize },
			layout: "grid",
			grid: { cols: 3 },
			items: [{
				field: "fontSize",
				label: "Font size",
				editor: "DropDownList",
				colSpan: 1,
				editorOptions: {
					fillMode: "flat",
					dataSource: fontSizeList,
					change: (e) => {
						const value = parseFloat(e.sender.value());
						setFreeTextFontSize(this.widget, value);
						if (this.editor.editorDiv) this.editor.editorDiv.style.setProperty("font-size", "calc(" + value + "px * var(--scale-factor))", "important");
					}
				}
			}]
		});
		this.fontSizeForm.element.find(".k-form-buttons").remove();
	}
	initFlatColorPicker() {
		this.flatColorPicker = new kendo.ui.FlatColorPicker(this.editorPopup.element.find("[ref-annotation-editor-flat-color-picker]"), {
			format: "rgb",
			opacity: true,
			change: (e) => {
				setFreeTextFontColor(this.widget, e.value);
				if (this.editor.editorDiv) this.editor.editorDiv.style.setProperty("color", e.value, "important");
			}
		});
	}
	onPopupOpen() {
		const currentColor = this.editor.propertiesToUpdate[1][1];
		super.onPopupOpen();
		this.flatColorPicker.value(currentColor);
	}
};
//#endregion
//#region ../src/kendo.pdfviewer.js
const __meta__ = {
	id: "pdfviewer",
	name: "PDFViewer",
	category: "web",
	description: "PDFViewer to display pdfs in the browser",
	depends: [
		"core",
		"window",
		"dialog",
		"toolbar",
		"draganddrop",
		"upload",
		"combobox",
		"drawing",
		"binder",
		"dropdownlist",
		"numerictextbox",
		"textbox",
		"pager",
		"form",
		"colorpicker"
	]
};
(function($, undefined) {
	var NS = ".kendoPDFViewer", kendo = window.kendo, ui = kendo.ui, extend = $.extend, drawing = kendo.drawing, keys = $.extend({
		PLUS: 187,
		MINUS: 189,
		ZERO: 48,
		NUMPAD_ZERO: 96
	}, kendo.keys), Page, BlankPage = kendo.pdfviewer.BlankPage, Widget = ui.Widget, progress = kendo.ui.progress, SCROLL = "scroll", RENDER = "render", OPEN = "open", ERROR = "error", KEYDOWN = "keydown" + NS;
	"" + NS + NS;
	var UPDATE = "update", PAGE_CHANGE = "pagechange", ZOOMSTART = "zoomStart", ZOOMEND = "zoomEnd", KENDO_KEYDOWN = "kendoKeydown", ZOOMCOMMAND = "ZoomCommand", WHITECOLOR = "#ffffff", TABINDEX = "tabindex", CLICK = "click", CHANGE = "change", TOGGLE = "toggle", DISABLED = "k-disabled", PROCESSORS = {
		pdfjs: "pdfjs",
		dpl: "dpl"
	}, styles = {
		viewer: "k-pdf-viewer",
		scroller: "k-canvas k-pdf-viewer-canvas k-pos-relative k-overflow-auto",
		enableTextSelection: "k-enable-text-select",
		enablePanning: "k-enable-panning",
		highlightClass: "k-search-highlight",
		highlightMarkClass: "k-search-highlight-mark",
		charClass: "k-text-char"
	}, PREDEFINED_ZOOM_VALUES = {
		auto: "auto",
		actual: "ActualWidth",
		fitToWidth: "FitToWidth",
		fitToPage: "FitToPage"
	};
	var PDFViewer = Widget.extend({
		init: function(element, options) {
			var that = this;
			Widget.fn.init.call(that, element, kendo.deepExtend({}, this.options, options));
			that._processMessages();
			that._wrapper();
			if (that.options.toolbar) that._renderToolbar();
			that._initProcessor(options || {});
			that._renderPageContainer();
			if (that._isDPLProcessor()) that._loadDPLDocument();
			else that._loadPdfJSDocument();
			kendo.notify(that, kendo.ui);
			if (that._showWatermarkOverlay) that._showWatermarkOverlay(that.wrapper[0]);
			Widget.fn.endInit.call(that);
		},
		events: [
			RENDER,
			OPEN,
			ERROR,
			ZOOMSTART,
			ZOOMEND,
			KENDO_KEYDOWN
		],
		options: {
			name: "PDFViewer",
			view: { type: "canvas" },
			pdfjsProcessing: {
				file: null,
				renderForms: false,
				loadOnDemand: true
			},
			dplProcessing: {
				read: {
					url: null,
					type: "GET",
					dataType: "json",
					pageField: "pageNumber"
				},
				upload: {
					url: null,
					saveField: "file"
				},
				download: { url: null },
				loadOnDemand: false
			},
			toolbar: {
				items: [],
				contextMenu: false
			},
			width: 1e3,
			height: 1200,
			page: 1,
			defaultPageSize: {
				width: 794,
				height: 1123
			},
			scale: null,
			zoomMin: .5,
			zoomMax: 4,
			zoomRate: .25,
			messages: {
				defaultFileName: "Document",
				toolbar: {
					zoom: {
						zoomLevel: "zoom level",
						zoomOut: "Zoom Out",
						zoomIn: "Zoom In",
						actualWidth: "Actual Width",
						autoWidth: "Automatic Width",
						fitToWidth: "Fit to Width",
						fitToPage: "Fit to Page"
					},
					contextMenu: "Menu",
					open: "Open",
					exportAs: "Export",
					download: "Download",
					print: "Print",
					toggleSelection: "Enable Selection",
					togglePan: "Enable Panning",
					search: "Search",
					annotations: "Annotations"
				},
				errorMessages: {
					notSupported: "Only pdf files allowed.",
					parseError: "PDF file fails to process.",
					notFound: "File is not found.",
					popupBlocked: "Popup is blocked."
				},
				dialogs: {
					exportAsDialog: {
						title: "Export...",
						defaultFileName: "Document",
						pdf: "Portable Document Format (.pdf)",
						png: "Portable Network Graphics (.png)",
						svg: "Scalable Vector Graphics (.svg)",
						labels: {
							fileName: "File name",
							saveAsType: "Save as",
							page: "Page"
						}
					},
					okText: "OK",
					save: "Save",
					cancel: "Cancel",
					search: {
						inputLabel: "Search Text",
						matchCase: "Match Case",
						next: "Next Match",
						previous: "Previous Match",
						close: "Close",
						of: "of",
						dragHandle: "Drag search"
					}
				}
			}
		},
		defaultTools: {
			contextMenu: {
				type: "dropDownButton",
				name: "contextMenu",
				showText: "overflow",
				id: "pdfviewer-toolbar-context-menu",
				overflow: "never",
				icon: "menu",
				fillMode: "flat",
				menuButtons: [
					{
						id: "open",
						text: "Open",
						icon: "folder-open",
						attributes: { "data-command": "OpenCommand" }
					},
					{
						id: "download",
						text: "Download",
						icon: "download",
						attributes: { "data-command": "DownloadCommand" },
						enable: false
					},
					{
						id: "print",
						text: "Print",
						icon: "print",
						attributes: { "data-command": "PrintCommand" },
						enable: false
					}
				]
			},
			separator: { type: "separator" },
			pager: {
				type: "component",
				name: "pager",
				overflow: "never",
				component: "Pager",
				element: "<div></div>",
				componentOptions: {
					navigatable: true,
					_isToolbarItem: true
				}
			},
			spacer: { type: "spacer" },
			zoomInOut: {
				type: "buttonGroup",
				fillMode: "flat",
				buttons: [{
					type: "button",
					icon: "zoom-out",
					name: "zoomOut",
					command: "ZoomCommand",
					showText: "overflow",
					options: "{ \"zoomOut\": true, \"updateComboBox\": true }",
					fillMode: "flat"
				}, {
					type: "button",
					icon: "zoom-in",
					name: "zoomIn",
					command: "ZoomCommand",
					showText: "overflow",
					options: "{ \"zoomIn\": true, \"updateComboBox\": true }",
					fillMode: "flat"
				}]
			},
			zoom: {
				type: "component",
				name: "zoom",
				command: "ZoomCommand",
				overflow: "never",
				component: "ComboBox",
				data: [
					50,
					100,
					150,
					200,
					300,
					400
				],
				componentOptions: {
					enable: false,
					dataTextField: "text",
					dataValueField: "percent",
					valuePrimitive: true,
					clearOnEscape: false,
					commandOn: "change",
					fillMode: "flat"
				}
			},
			toggleSelection: {
				type: "buttonGroup",
				fillMode: "flat",
				buttons: [{
					togglable: true,
					command: "EnableSelectionCommand",
					icon: "pointer",
					showText: "overflow",
					name: "toggleSelection",
					group: "toggle-pan",
					fillMode: "flat"
				}, {
					togglable: true,
					command: "EnablePanCommand",
					icon: "hand",
					showText: "overflow",
					name: "togglePan",
					group: "toggle-pan",
					selected: true,
					fillMode: "flat"
				}]
			},
			spacer2: { type: "spacer" },
			search: {
				type: "button",
				command: "OpenSearchCommand",
				icon: "search",
				name: "search",
				showText: "overflow",
				enable: false,
				fillMode: "flat"
			},
			open: {
				type: "button",
				showText: "overflow",
				name: "open",
				icon: "folder-open",
				command: "OpenCommand",
				fillMode: "flat"
			},
			download: {
				type: "button",
				showText: "overflow",
				name: "download",
				icon: "download",
				command: "DownloadCommand",
				enable: false,
				fillMode: "flat"
			},
			print: {
				type: "button",
				showText: "overflow",
				name: "print",
				icon: "print",
				command: "PrintCommand",
				enable: false,
				fillMode: "flat"
			},
			annotations: {
				togglable: true,
				type: "button",
				showText: "overflow",
				name: "annotations",
				icon: "edit-annotations",
				command: "AnnotationsCommand",
				enable: false,
				fillMode: "flat"
			}
		},
		exportAsTool: { exportAs: {
			type: "button",
			showText: "overflow",
			name: "exportAs",
			icon: "image-export",
			command: "ExportCommand",
			fillMode: "flat"
		} },
		_processMessages: function() {
			var zoom = this.options.messages.toolbar.zoom;
			if ($.isPlainObject(zoom)) {
				this.options.messages.toolbar = $.extend({}, this.options.messages.toolbar, zoom);
				this.options.messages.toolbar.zoom = zoom.zoomLevel || this.options.messages.toolbar.zoom;
			}
		},
		_wrapper: function() {
			var that = this, options = that.options;
			that.wrapper = that.element;
			that.wrapper.width(options.width).height(options.height).addClass(styles.viewer).on(KEYDOWN, that, that._keydown.bind(that));
			that._allowResize = that.options.scale === null;
			that._autoZoomScale = _progress_kendo_pdfviewer_common.DEFAULT_ZOOM_LEVEL;
			that.zoomScale = that.options.scale || that._autoZoomScale;
			that._resizeHandler = kendo.onResize(function() {
				that.resize();
			});
			that._pageNum = that.options.page;
		},
		_keydown: function(e) {
			var plusShortcuts = [keys.PLUS, keys.NUMPAD_PLUS], minusShortcuts = [keys.MINUS, keys.NUMPAD_MINUS], zeroShortcuts = [keys.ZERO, keys.NUMPAD_ZERO], shouldExecute = false, args = {
				command: ZOOMCOMMAND,
				options: { updateComboBox: true }
			};
			if (!e.ctrlKey || this._blankPage || this.processingLib === PROCESSORS.dpl) return;
			if (plusShortcuts.includes(e.keyCode)) {
				args.options.zoomIn = true;
				shouldExecute = true;
			} else if (minusShortcuts.includes(e.keyCode)) {
				args.options.zoomOut = true;
				shouldExecute = true;
			} else if (zeroShortcuts.includes(e.keyCode)) {
				args.options.value = _progress_kendo_pdfviewer_common.DEFAULT_ZOOM_LEVEL;
				shouldExecute = true;
			}
			if (shouldExecute) {
				this.execute(args);
				e.preventDefault();
			}
		},
		_handlePageChangeEvent: function(event) {
			const that = this;
			if (!that._pageChangeFromScroll) {
				this.activatePage(event.index, false);
				that._showPagerInputLabels();
			}
			delete that._pageChangeFromScroll;
		},
		_showPagerInputLabels: function() {
			const inputElements = this.pager.element.find(".k-pager-input").children();
			if (inputElements) {
				const labels = inputElements.eq(0).add(inputElements.eq(2));
				if (!$(labels).is(":visible")) labels.show();
			}
		},
		_resizePager: function() {
			const that = this;
			if (!that.pager || !that.pager.options.responsive) return;
			const pagerWidth = kendo._outerWidth(that.pager.element);
			const visibleToolbarItems = Array.from(that.toolbar.element.children(":not(.k-hidden):not(:has(.k-pager))"));
			const containerWidth = kendo._outerWidth(that.element);
			let visibleToolsWidth = 0;
			const gap = Number(that.toolbar.element.css("gap").replace(/(em|ex|%|px|cm|mm|in|pt|pc|ch|rem|vh|vw|vmin|vmax)$/, ""));
			if (visibleToolbarItems.length > 0) {
				let temp = 0;
				for (let i = 0; i < visibleToolbarItems.length; i++) temp += kendo._outerWidth(visibleToolbarItems[i]) + gap;
				if (temp) visibleToolsWidth = temp;
			}
			const elementsToShrink = that.pager.element.find(".k-pager-nav");
			if (pagerWidth + visibleToolsWidth + gap > containerWidth) for (var i = elementsToShrink.length - 1; i >= 0; i--) elementsToShrink.eq(i).addClass("k-hidden");
			if (pagerWidth + visibleToolsWidth + gap < containerWidth) {
				const hidden = that.pager.element.find(".k-hidden:not(.k-input-validation-icon)");
				for (var i = 0; i < hidden.length; i++) hidden.eq(i).removeClass("k-hidden");
			}
			if (that.pager.options.input) that._showPagerInputLabels();
		},
		_initProcessor: function(options) {
			var that = this, processingOptions = options.dplProcessing ? that.options.dplProcessing : that.options.pdfjsProcessing;
			that.processingLib = options.dplProcessing ? PROCESSORS.dpl : PROCESSORS.pdfjs;
			if (that._isDPLProcessor()) {
				that.processor = new kendo.pdfviewer[that.processingLib].processor(processingOptions, that);
				Page = kendo.pdfviewer[that.processingLib].Page;
			} else isLoaded();
		},
		_isDPLProcessor: function() {
			return this.processingLib === PROCESSORS.dpl;
		},
		_hasPagerTool: function(tools) {
			let hasPager = false;
			let index;
			for (let i = 0; i < tools.length; i++) {
				const tool = tools[i];
				if (typeof tool === "string") {
					hasPager = tool.toLowerCase() === "pager";
					index = i;
				} else if (tool.type) {
					hasPager = tool.type.toLowerCase() === "pager";
					index = i;
				} else if (tool.name) {
					hasPager = tool.name.toLowerCase() === "pager";
					if (hasPager) delete tool.name;
					index = i;
				}
				if (hasPager) break;
			}
			return {
				hasPager,
				index
			};
		},
		_renderToolbar: function() {
			var that = this, options = that.options, toolbarOptions = extend({}, options.toolbar), tools = toolbarOptions.items && toolbarOptions.items.length ? toolbarOptions.items : Object.keys(that.defaultTools);
			if (that.options.pdfjsProcessing.renderForms && !toolbarOptions.items.length) {
				const [enableSelection, enablePan] = [...that.defaultTools["toggleSelection"].buttons];
				enableSelection.selected = true;
				enablePan.selected = false;
			}
			const { hasPager, index } = that._hasPagerTool(tools);
			tools = that._processTools(tools);
			if (hasPager) {
				let pagerMessages = that.options.messages.toolbar.pager;
				if (pagerMessages) {
					if (pagerMessages.of) {
						pagerMessages.of = `${pagerMessages.of} {0}`;
						if (pagerMessages.pages) {
							pagerMessages.of = pagerMessages.of + " " + pagerMessages.pages;
							delete pagerMessages.pages;
						}
					}
				}
				that.defaultTools.pager.componentOptions.messages = pagerMessages;
				options.messages.toolbar.pager = "Pager";
				const currentPagerOptions = that.defaultTools.pager.componentOptions;
				if (typeof tools[index] !== "string") {
					that.defaultTools.pager.componentOptions = $.extend(tools[index], currentPagerOptions);
					tools[index] = that.defaultTools.pager;
				}
			}
			toolbarOptions = {
				defaultTools: $.extend({}, that.defaultTools, that.exportAsTool),
				parentMessages: options.messages.toolbar,
				tools,
				resizable: true,
				fillMode: "flat",
				overflow: toolbarOptions.overflow
			};
			var toolbarElement = $("<div />");
			toolbarElement.appendTo(that.element);
			that.toolbar = new kendo.ui.ToolBar(toolbarElement, toolbarOptions);
			that.options.toolbar = that.toolbar.options;
			that.toolbar.bind(TOGGLE, that._toolbarClick.bind(that));
			that.toolbar.bind(CLICK, that._toolbarClick.bind(that));
			that.toolbar.bind(CHANGE, that._toolbarClick.bind(that));
			if (toolbarOptions.contextMenu) that.toolbar.element.find("[data-role=dropdownbutton]").on(CLICK, that._toolbarClick.bind(that));
			if (hasPager) {
				that.pager = that.toolbar.element.find(".k-pager");
				if (that.pager.length > 0) that.pager = that.pager.data("kendoPager");
				that.pager.bind(CHANGE, that._handlePageChangeEvent.bind(that));
			}
			that.bind({ update: that._updateToolbar.bind(that) });
			return that.toolbar;
		},
		_processTools: function(tools) {
			var that = this, toolbar = that.options.toolbar, messages = that.options.messages.toolbar;
			tools = tools.flatMap((t) => {
				if (t === "zoom") t = that.defaultTools.zoom;
				if (t.name === "zoom") {
					t = $.extend({}, that.defaultTools.zoom, t);
					var zoomLevels = [
						{
							percent: PREDEFINED_ZOOM_VALUES.auto,
							text: messages.autoWidth
						},
						{
							percent: PREDEFINED_ZOOM_VALUES.actual,
							text: messages.actualWidth
						},
						{
							percent: PREDEFINED_ZOOM_VALUES.fitToWidth,
							text: messages.fitToWidth
						},
						{
							percent: PREDEFINED_ZOOM_VALUES.fitToPage,
							text: messages.fitToPage
						}
					];
					var comboOptions = t.data.map((i) => {
						return {
							percent: i,
							text: i + "%"
						};
					});
					var value = that.options.scale ? that.options.scale * 100 + "%" : "auto";
					zoomLevels = zoomLevels.concat(comboOptions);
					t.componentOptions.dataSource = zoomLevels;
					t.componentOptions.value = value;
				}
				return t;
			});
			if (!toolbar.contextMenu) {
				const contextMenuIndex = tools.findIndex((t) => t === "contextMenu");
				if (contextMenuIndex !== -1) tools.splice(contextMenuIndex, 1);
				const separatorIndex = tools.findIndex((t) => t === "separator");
				if (separatorIndex !== -1) tools.splice(separatorIndex, 1);
			} else tools = tools.filter((t) => t !== "open" && t !== "download" && t !== "print");
			return tools;
		},
		_updateToolbar: function(e) {
			var pageOptions = {
				page: e.page || 1,
				total: e.total || 1
			}, toolbar = this.toolbar, toolbarEl = toolbar.element, zoomCombo = toolbarEl.find("[data-command=ZoomCommand][data-role=combobox]").data("kendoComboBox"), toFocus = toolbarEl.find(".k-focus");
			if (toFocus.length === 0) {
				toFocus = toolbarEl.find("[tabindex=0]").first();
				if (toFocus.length === 0) toFocus = toolbar._getAllItems().first();
			}
			if (zoomCombo) {
				zoomCombo.enable(!e.isBlank);
				if (e.action === "zoom") this._updateZoomComboBox(e.zoom);
			}
			if ((e.action === "pagechange" && e.updatePager !== false || e.isBlank) && this.pager) {
				if (e.updatePager) pageOptions.updatePager = true;
				if (e.pageChangeFromScroll) pageOptions.pageChangeFromScroll = true;
				this._updatePager(pageOptions);
			}
			this._updateOnBlank(e.isBlank);
			toolbar._resetTabIndex(toFocus);
		},
		_updateOnBlank: function(isBlank) {
			const toolbar = this.toolbar, toolbarEl = toolbar.element;
			const contextMenu = $("#pdfviewer-toolbar-context-menu_buttonmenu");
			let downloadButton = toolbarEl.find("[data-command='DownloadCommand']");
			let printButton = toolbarEl.find("[data-command='PrintCommand']");
			if (contextMenu.length) {
				downloadButton = contextMenu.find("[data-command='DownloadCommand']");
				printButton = contextMenu.find("[data-command='PrintCommand']");
			}
			toolbar.enable(toolbarEl.find("[data-command=EnableSelectionCommand]").parent(), !isBlank);
			toolbar.enable(toolbarEl.find("button[data-command=ZoomCommand]").parent(), !isBlank);
			toolbar.enable(toolbarEl.find("[data-command='OpenSearchCommand']"), !isBlank);
			toolbar.enable(downloadButton, !isBlank);
			toolbar.enable(printButton, !isBlank);
		},
		_updatePager: function(options) {
			const that = this;
			if (options.updatePager) {
				const data = that.processingLib === "dpl" ? that.document && that.document.pages ? that.document.pages : [] : that.pages ?? [];
				const pagerDataSource = new kendo.data.DataSource({
					data: data ?? [],
					pageSize: 1,
					page: options.page
				});
				that.pager.setDataSource(pagerDataSource);
				that._resizePager();
			} else if (that.pager.page() !== options.page) {
				if (options.pageChangeFromScroll) that._pageChangeFromScroll = true;
				that.pager.page(options.page);
			}
			that._showPagerInputLabels();
			that._togglePagerDisabledClass();
		},
		_togglePagerDisabledClass: function() {
			const pager = this.pager;
			if (pager.totalPages() <= 1) pager.element.addClass(DISABLED);
			else if (pager.element.hasClass(DISABLED)) pager.element.removeClass(DISABLED);
		},
		_updateZoomComboBox: function(value) {
			var isPredefined = value === PREDEFINED_ZOOM_VALUES.auto || value === PREDEFINED_ZOOM_VALUES.actual || value === PREDEFINED_ZOOM_VALUES.fitToPage || value === PREDEFINED_ZOOM_VALUES.fitToWidth, zoomCombo = this.toolbar.element.find("[data-command=ZoomCommand][data-role=combobox]").data("kendoComboBox");
			if (!isPredefined) value = Math.round(value * 100) + "%";
			if (zoomCombo) zoomCombo.value(value);
		},
		_toolbarClick: function(ev) {
			let target = $(ev.target), command = target.data("command"), options = target.data("options");
			if (!command && !options) {
				target = $(ev.currentTarget);
				command = target.data("command");
				options = target.data("options");
			}
			options = extend({}, { value: target.val() }, options);
			if (!command) return;
			this.execute({
				command,
				options
			});
		},
		_initErrorDialog: function(options) {
			var that = this;
			if (!that._errorDialog) {
				options = extend(options, { messages: that.options.messages });
				that._errorDialog = new kendo.pdfviewer.dialogs.ErrorDialog(options)._dialog;
			}
			return that._errorDialog;
		},
		_renderPageContainer: function() {
			var that = this;
			if (!that.pageContainer) {
				that.pageContainerWrapper = $("<div />");
				that.pageContainerWrapper.addClass(styles.scroller);
				that.pageContainer = $(`<div class="k-pdf-viewer-pages" />`);
				that.pageContainer.attr(TABINDEX, 0);
				that.pageContainerWrapper.append(that.pageContainer);
				that.wrapper.append(that.pageContainerWrapper);
			}
		},
		_triggerError: function(options) {
			var dialog = this._initErrorDialog();
			extend(options, { dialog });
			if (this.pageContainer) progress(this.pageContainer, false);
			if (this.trigger(ERROR, options)) return;
			dialog.open().content(options.message);
		},
		_renderPages: function() {
			var that = this, document = that.document, pagesData;
			that.pages = [];
			if (!document || !document.total) {
				that._renderBlankPage();
				return;
			}
			pagesData = document.pages;
			for (var i = 1; i <= document.total; i++) {
				var viewerPage, pageData = {
					processor: that.processor,
					number: i
				};
				if (pagesData && pagesData.length) pageData = extend(pageData, pagesData[i - 1]);
				viewerPage = new Page(pageData, that);
				that.pages.push(viewerPage);
				that.pageContainer.append(viewerPage.element);
			}
			if (that.pdfScroller) that.pdfScroller.enablePanEventsTracking();
			that._attachContainerEvents();
			that._getVisiblePagesCount();
			that._updatePager({ updatePager: true });
		},
		_renderBlankPage: function() {
			this._blankPage = new BlankPage(this.options.defaultPageSize, this);
			this.pageContainer.append(this._blankPage.element);
			this._blankPage._initUpload();
			this.trigger(UPDATE, { isBlank: true });
		},
		_removeBlankPage: function() {
			if (this._blankPage) {
				this._blankPage.destroy();
				this._blankPage.element.remove();
				this._blankPage = null;
			}
		},
		_resize: function() {
			var that = this, containerWidth, ratio;
			if (!that._allowResize) return;
			if (!that.pages || !that.pages.length) {
				if (that._blankPage) {
					ratio = containerWidth / that._blankPage.element.width();
					that._blankPage.resize(ratio);
				}
				return;
			}
			if (that.toolbar) that.toolbar.resize(true);
			if (that._resizeHandler) clearTimeout(that._resizeHandler);
			that._resizeHandler = setTimeout(that._resizePages.bind(that), 100);
		},
		_resizePages: function() {
			const that = this, containerWidth = that.pageContainer[0].clientWidth, pagesElements = that.pdfViewerCommon?.getPagesElements();
			let ratio = 0;
			that.pages.forEach(function(page) {
				const pageWidth = page.element ? page.element.width() : $(pagesElements[page._pageIndex]).width();
				const currentRatio = containerWidth / pageWidth;
				if (currentRatio > ratio) ratio = currentRatio;
			});
			if (that._autoFit) {
				that.zoom(that._autoFit, true);
				return;
			}
			ratio = Math.min(Math.max(ratio, that.options.zoomMin), _progress_kendo_pdfviewer_common.DEFAULT_ZOOM_LEVEL);
			if (ratio != that.zoomScale) {
				that.zoom(ratio, true);
				that.zoomScale = ratio;
				that._allowResize = true;
			}
			if (that.pager && that.pager.element) that._resizePager();
		},
		_attachContainerEvents: function() {
			const that = this;
			that.pageContainer.addClass(styles.enablePanning);
			that.pageContainerWrapper.bind(SCROLL, that._scroll.bind(that));
		},
		_scroll: function(e) {
			var that = this, containerHeight = that.pageContainerWrapper.height(), total = that.pages.length, pageNum = that._pageNum, pageIndex = pageNum - 1, pageToLoadNum = pageNum, pageToLoad;
			if (that._preventScroll || !total) {
				that._preventScroll = false;
				return;
			}
			that._scrollingStarted = true;
			const nextPageIndex = (0, _progress_kendo_pdfviewer_common.currentPage)(that.element[0]);
			that.pages[pageIndex];
			pageToLoadNum = pageNum + nextPageIndex - pageIndex;
			if (pageNum !== pageToLoadNum && pageToLoadNum >= 1 && pageToLoadNum <= total) {
				pageToLoad = that.pages[pageToLoadNum - 1].element;
				if (pageToLoad.offset().top > containerHeight) return;
				that._pageNum = pageToLoadNum;
				that._loadVisiblePages();
				that.trigger(UPDATE, {
					action: PAGE_CHANGE,
					page: pageToLoadNum,
					total,
					pageChangeFromScroll: true
				});
			}
		},
		zoom: function(scale, preventComboBoxChange) {
			var that = this;
			if (that._isDPLProcessor()) return;
			if (!scale) return that.zoomScale;
			return that.execute({
				command: ZOOMCOMMAND,
				options: {
					value: scale,
					updateComboBox: !preventComboBoxChange
				}
			});
		},
		execute: function(options) {
			var commandOptions = extend({ viewer: this }, options.options);
			return new kendo.pdfviewer[options.command](commandOptions).exec();
		},
		_loadDPLDocument: function() {
			var that = this;
			var page = that.options.page;
			progress(that.pageContainer, true);
			that.processor.fetchDocument().done(function(document) {
				that._clearPages();
				that.document = document;
				that._renderPages();
				that.resize(true);
				if (document) {
					page = page >= 1 && page <= document.total ? page : 1;
					that.activatePage(page, true);
				}
				if (that.pdfScroller) that.pdfScroller.destroy();
				that.pdfScroller = new _progress_kendo_pdfviewer_common.Scroller(that.pageContainer[0].parentNode, {
					filter: ".k-page",
					events: {}
				});
				that.pdfScroller.enablePanEventsTracking();
				progress(that.pageContainer, false);
			});
		},
		_loadPdfJSDocument: function(data) {
			const that = this;
			const options = that.options;
			const page = options.page;
			let file;
			if (data) file = data;
			else file = options.pdfjsProcessing.file;
			if (!file) {
				that._renderBlankPage();
				return;
			}
			if (typeof file === "string") file = { url: file };
			else if (file instanceof ArrayBuffer) file = { data: file };
			that._removeBlankPage();
			progress(that.pageContainer, true);
			that.pdfViewerCommon = new _progress_kendo_pdfviewer_common.PdfViewer(that.element[0], {
				loadOnDemand: that.options.pdfjsProcessing.loadOnDemand,
				loadOnDemandPageSize: 1,
				zoomLevel: that.zoomScale,
				renderForms: that.options.pdfjsProcessing.renderForms,
				fileDescriptor: file,
				events: {
					pagesLoad: (e) => {
						that.document = e.pdfDoc;
						that.pages = e.pdfPages;
						if (that.options.pdfjsProcessing.renderForms) setInteractionMode(that.pdfViewerCommon, 0);
						else setInteractionMode(that.pdfViewerCommon, 1);
						that.activatePage(page, true);
						that.trigger(UPDATE);
						if (that._currentPage > -1) {
							that.pdfViewerCommon.scrollToPage({ pageNumber: that._currentPage });
							that._currentPage = null;
						}
						progress(that.pageContainer, false);
					},
					pageRendered: (e) => {
						if (!that._preventRenderEvent) that.trigger(RENDER, { page: e.page.pdfPage });
						that._setPageNumberAttributes();
						that._preventRenderEvent = false;
					},
					zoomStart: (e) => {
						that._currentPage = that.pdfViewerCommon.getCurrentPageIndex() + 1;
					},
					zoomEnd: (e) => {
						that.zoomScale = e.zoomLevel;
						that._updateZoomComboBox(e.zoomLevel);
						that.trigger(ZOOMEND, { scale: e.zoomLevel });
					},
					printEnd: (e) => {
						progress(that.pageContainerWrapper, false);
					},
					scroll: (e) => {
						if (e.isPageChanged) that.trigger(UPDATE, {
							action: PAGE_CHANGE,
							page: e.pageNumber,
							total: that.pages.length,
							pageChangeFromScroll: true
						});
					},
					error: (e) => {
						that._triggerError({
							error: e.message,
							message: that.options.messages.errorMessages.parseError
						});
					},
					annotationEditorToolBarShow: that.onAnnotationEditorToolBarShow.bind(that)
				}
			});
		},
		_enablePanning: function() {
			this.pdfViewerCommon.documentScroller.enablePanEventsTracking();
		},
		_disablePanning: function() {
			this.pdfViewerCommon.documentScroller.disablePanEventsTracking();
		},
		_setPageNumberAttributes: function() {
			this.pageContainer.find(".k-page").each((i, el) => {
				$(el).attr(kendo.attr("number"), i + 1);
			});
		},
		loadPage: function(number) {
			const that = this, page = that.pages && that.pages[number - 1];
			if (!page) return;
			if (that._isDPLProcessor()) return page.load(that.zoomScale);
			return Promise.resolve();
		},
		activatePage: function(number, updatePager) {
			const that = this;
			if (!(that.pages && that.pages[number - 1])) return;
			that._pageNum = number;
			if (that._isDPLProcessor()) {
				that._loadVisiblePages();
				that._scrollToActivatedPage(number, updatePager);
			} else {
				that.pdfViewerCommon.activatePageNumber(number);
				that.trigger(UPDATE, {
					action: PAGE_CHANGE,
					page: number,
					total: that.pages.length,
					updatePager
				});
			}
		},
		_scrollToActivatedPage: function(number, updatePager) {
			const that = this, pageContainer = that.pageContainerWrapper;
			that._preventScroll = true;
			(0, _progress_kendo_pdfviewer_common.scrollToPage)(pageContainer[0], number - 1);
			that.trigger(UPDATE, {
				action: PAGE_CHANGE,
				page: number,
				total: that.pages.length,
				updatePager
			});
		},
		_getVisiblePagesCount: function() {
			var that = this, loadedPagesHeight = 0, updatedVisiblePagesCount = 0, containerHeight = that._isDPLProcessor() ? that.pageContainerWrapper[0].clientHeight : that.pageContainer[0].clientHeight, index = 0;
			while (loadedPagesHeight <= containerHeight && index < that.pages.length) {
				loadedPagesHeight += that.pages[index].element.height();
				updatedVisiblePagesCount++;
				index++;
			}
			that._visiblePagesCount = updatedVisiblePagesCount;
		},
		_loadVisiblePages: function() {
			var pagesCount = this.pages && this.pages.length, minVisiblePageNum = Math.max(this._pageNum - this._visiblePagesCount, 1), maxVisiblePageNum = Math.min(this._pageNum + this._visiblePagesCount, pagesCount);
			this._visiblePages = this.pages.slice(minVisiblePageNum - 1, maxVisiblePageNum);
			for (var i = minVisiblePageNum; i <= maxVisiblePageNum; i++) this.loadPage(i);
		},
		_loadAllPages: function() {
			const pagesCount = this.pages && this.pages.length;
			const promises = [];
			for (var i = 0; i <= pagesCount; i++) promises.push(this.loadPage(i));
			return promises;
		},
		fromFile: function(file) {
			const that = this;
			if (that._isDPLProcessor()) {
				that.zoomScale = that.options.scale || _progress_kendo_pdfviewer_common.DEFAULT_ZOOM_LEVEL;
				that.zoom(that.zoomScale, true);
				that.trigger(UPDATE, {
					action: "zoom",
					zoom: that.options.scale || "auto"
				});
				that.processor._updateDocument(file);
				that._loadDPLDocument();
			} else if (that.pdfViewerCommon) {
				that.annotationsToolbar?.destroy();
				resetAnnotationEditorMode(that.pdfViewerCommon);
				that.toolbar.toggle("[title='Annotations']", false);
				that.toolbar.toggle("[title='Enable Selection']", false);
				that.toolbar.toggle("[title='Enable Panning']", true);
				const loadParams = $.isPlainObject(file) ? file : { url: file };
				that.pdfViewerCommon.loadFile(loadParams);
			} else that._loadPdfJSDocument(file);
		},
		exportImage: function(options) {
			var that = this;
			var pageNumber = options.page;
			var page = that.pages[pageNumber - 1] || that._blankPage;
			var rootGroup = new drawing.Group();
			page.load();
			var background = kendo.drawing.Path.fromRect(new kendo.geometry.Rect([0, 0], [page.width, page.height]), {
				fill: { color: WHITECOLOR },
				stroke: null
			});
			progress(that.pageContainer, true);
			rootGroup.append(background, page.group);
			drawing.exportImage(rootGroup).done(function(data) {
				progress(that.pageContainer, false);
				kendo.saveAs({
					dataURI: data,
					fileName: options.fileName,
					proxyURL: options.proxyURL || "",
					forceProxy: options.forceProxy,
					proxyTarget: options.proxyTarget
				});
			});
		},
		exportSVG: function(options) {
			var that = this;
			var pageNumber = options.page;
			var page = that.pages[pageNumber - 1] || that._blankPage;
			progress(that.pageContainer, true);
			page.load();
			drawing.exportSVG(page.group).done(function(data) {
				progress(that.pageContainer, false);
				kendo.saveAs({
					dataURI: data,
					fileName: options.fileName,
					proxyURL: options.proxyURL || "",
					forceProxy: options.forceProxy,
					proxyTarget: options.proxyTarget
				});
			});
		},
		setOptions: function(options) {
			var that = this;
			if (options.pdfjsProcessing || options.dplProcessing) that._initProcessor(options || {});
			options = $.extend(that.options, options);
			Widget.fn.setOptions.call(that, options);
			if (options.page) {
				that._pageNum = options.page;
				that.activatePage(options.page, false);
			}
			if (options.width) that.element.width(options.width);
			if (options.height) that.element.height(options.height);
		},
		destroy: function() {
			if (this._resizeHandler) kendo.unbindResize(this._resizeHandler);
			if (this._errorDialog) this._errorDialog.destroy();
			if (this._saveDialog) this._saveDialog.destroy();
			if (this._upload) this._upload.destroy();
			if (this.pager) this.pager.destroy();
			if (this.toolbar) {
				this.toolbar.unbind();
				this.toolbar.destroy();
				this.toolbar = null;
			}
			if (this.pages && this.pages.length && this._isDPLProcessor()) {
				this.pages.forEach(function(page) {
					page.destroy();
				});
				this.pages = [];
			}
			if (this.pdfScroller) this.pdfScroller.destroy();
			this.pageContainer.off(NS);
			this.pageContainerWrapper.off(NS);
			Widget.fn.destroy.call(this);
		},
		_clearPages: function() {
			this.pages = [];
			this.document = null;
			this._pageNum = 1;
			this.pageContainer.off(NS);
			this.pageContainer.empty();
			if (this.pdfScroller) this.pdfScroller.destroy();
		},
		onAnnotationEditorToolBarShow: function(e) {
			const that = this;
			const type = e.annotationEditorMode;
			const anchor = e.anchor;
			const popup = that.annotationPopup?.popup;
			const editor = e.source.firstSelectedEditor;
			if (popup && popup.visible() && !popup._closing && type === "freeText") return;
			if (that.annotationPopup) {
				that.annotationPopup.destroy();
				that.annotationPopup.destroyEditor();
				that.annotationPopup = null;
			}
			switch (type) {
				case "highlight":
					that.annotationPopup = new HighlightAnnotationPopup(that, anchor, editor);
					break;
				case "freeText":
					that.annotationPopup = new FreeTextAnnotationPopup(that, anchor, editor);
					break;
			}
		}
	});
	ui.plugin(PDFViewer);
})(window.kendo.jQuery);
var kendo_pdfviewer_default = kendo;
//#endregion
Object.defineProperty(exports, "__meta__", {
	enumerable: true,
	get: function() {
		return __meta__;
	}
});
Object.defineProperty(exports, "kendo_pdfviewer_default", {
	enumerable: true,
	get: function() {
		return kendo_pdfviewer_default;
	}
});