import { PdfFormFieldBase } from '../index';
import { createElement, Browser, isNullOrUndefined } from '@syncfusion/ej2-base';
import { AjaxHandler } from '../index';
import { Size } from '@syncfusion/ej2-drawings';
import { TaskPriorityLevel } from '../base/pdfviewer-utlis';
/**
 * Print module
 */
var Print = /** @class */ (function () {
    /**
     * @param {PdfViewer} viewer - It describes about the viewer
     * @param {PdfViewerBase} base - It describes about the base
     * @private
     * @returns {void}
     */
    function Print(viewer, base) {
        this.printHeight = 1056;
        this.printWidth = 816;
        this.maximumPixels = 16777216;
        this.pdfViewer = viewer;
        this.pdfViewerBase = base;
    }
    /**
     * Print the PDF document being loaded in the ejPdfViewer control.
     *
     * @returns {void}
     */
    Print.prototype.print = function () {
        var _this = this;
        var pageIndex;
        if (this.pdfViewerBase.pageCount > 0) {
            this.printViewerContainer = createElement('div', {
                id: this.pdfViewer.element.id + '_print_viewer_container',
                className: 'e-pv-print-viewer-container'
            });
            if (this.pdfViewer.printMode === 'Default') {
                this.pdfViewerBase.showPrintLoadingIndicator(true);
                this.iframe = document.createElement('iframe');
                this.iframe.className = 'iframeprint';
                this.iframe.id = 'iframePrint';
                this.iframe.style.position = 'fixed';
                this.iframe.style.top = '-100000000px';
                document.body.appendChild(this.iframe);
                this.frameDoc = this.iframe.contentWindow ? this.iframe.contentWindow : this.iframe.contentDocument;
                this.frameDoc.document.open();
            }
            else {
                this.printWindow = window.open('', 'print', 'height=' + window.outerHeight + ',width=' + window.outerWidth + ',tabbar=no');
                this.printWindow.moveTo(0, 0);
                this.printWindow.resizeTo(screen.availWidth, screen.availHeight);
                this.createPrintLoadingIndicator(this.printWindow.document.body);
            }
            setTimeout(function () {
                for (pageIndex = 0; pageIndex < _this.pdfViewerBase.pageCount; pageIndex++) {
                    var pageWidth = _this.pdfViewerBase.pageSize[parseInt(pageIndex.toString(), 10)].width;
                    var pageHeight = _this.pdfViewerBase.pageSize[parseInt(pageIndex.toString(), 10)].height;
                    // Check if the document is A4 by comparing the A4 standard values with the buffer value
                    var a4StdWidth = 793;
                    var a4StdHeight = 1122;
                    var bufferWidth = 10;
                    var bufferHeight = 10;
                    //Reduced the A4 standard width and height to prevent blank pages while printing
                    var a4PrintWidth = 783;
                    var a4PrintHeight = 1110;
                    _this.printWidth = 816;
                    _this.printHeight = 1056;
                    // Check if the A4 document is protrait or landscape
                    if (pageWidth > pageHeight) {
                        a4StdWidth = 1122;
                        a4StdHeight = 793;
                    }
                    if (!(pageWidth >= (a4StdWidth + bufferWidth) || pageWidth <= (a4StdWidth - bufferWidth)) &&
                        !(pageHeight >= (a4StdHeight + bufferHeight) || pageHeight <= (a4StdHeight - bufferHeight))) {
                        _this.printWidth = a4PrintWidth;
                        _this.printHeight = a4PrintHeight;
                    }
                    _this.pdfViewer.printModule.createRequestForPrint(pageIndex, pageWidth, pageHeight, _this.pdfViewerBase.pageCount, _this.pdfViewer.printScaleFactor);
                }
                _this.pdfViewer.firePrintEnd(_this.pdfViewer.downloadFileName);
            }, 100);
        }
    };
    Print.prototype.createRequestForPrint = function (pageIndex, pageWidth, pageHeight, pageCount, printScaleFactor) {
        // eslint-disable-next-line
        var proxy = this;
        var jsonObject = {
            pageNumber: pageIndex.toString(),
            documentId: this.pdfViewerBase.documentId,
            hashId: this.pdfViewerBase.hashId, zoomFactor: '1',
            action: 'PrintImages',
            elementId: this.pdfViewer.element.id,
            uniqueId: this.pdfViewerBase.documentId,
            digitalSignaturePresent: this.pdfViewerBase.digitalSignaturePresent(pageIndex),
            printScaleFactor: printScaleFactor >= 0.5 && printScaleFactor <= 5 ? printScaleFactor : printScaleFactor > 5 ? 5 : 1
        };
        if (this.pdfViewerBase.jsonDocumentId) {
            jsonObject.documentId = this.pdfViewerBase.jsonDocumentId;
        }
        proxy.pdfViewerBase.createFormfieldsJsonData();
        proxy.printRequestHandler = new AjaxHandler(proxy.pdfViewer);
        proxy.printRequestHandler.url = proxy.pdfViewer.serviceUrl + '/' + proxy.pdfViewer.serverActionSettings.print;
        proxy.printRequestHandler.responseType = null;
        proxy.printRequestHandler.mode = false;
        if (this.pdfViewerBase.validateForm && this.pdfViewer.enableFormFieldsValidation) {
            this.pdfViewer.fireValidatedFailed(proxy.pdfViewer.serverActionSettings.download);
            this.pdfViewerBase.validateForm = false;
            this.pdfViewerBase.showPrintLoadingIndicator(false);
        }
        else {
            if (proxy.pdfViewerBase.clientSideRendering) {
                this.pdfViewerBase.pdfViewerRunner.addTask({
                    pageIndex: pageIndex, message: 'printImage', printScaleFactor: printScaleFactor >= 0.5 && printScaleFactor <= 5 ? printScaleFactor : printScaleFactor > 5 ? 5 : 1
                }, TaskPriorityLevel.High);
            }
            else {
                proxy.printRequestHandler.send(jsonObject);
            }
        }
        proxy.printRequestHandler.onSuccess = function (result) {
            proxy.printSuccess(result, pageWidth, pageHeight, pageIndex);
        };
        this.printRequestHandler.onFailure = function (result) {
            proxy.pdfViewer.fireAjaxRequestFailed(result.status, result.statusText, proxy.pdfViewer.serverActionSettings.print);
        };
        this.printRequestHandler.onError = function (result) {
            proxy.pdfViewerBase.openNotificationPopup();
            proxy.pdfViewer.fireAjaxRequestFailed(result.status, result.statusText, proxy.pdfViewer.serverActionSettings.print);
        };
    };
    /**
     * @param {any} event - It describes about the event
     * @private
     * @returns {void}
     */
    Print.prototype.printOnMessage = function (event) {
        var canvas = document.createElement('canvas');
        var _a = event.data, value = _a.value, width = _a.width, height = _a.height, pageIndex = _a.pageIndex, pageWidth = _a.pageWidth, pageHeight = _a.pageHeight;
        canvas.width = width;
        canvas.height = height;
        var canvasContext = canvas.getContext('2d');
        var imageData = canvasContext.createImageData(width, height);
        imageData.data.set(value);
        canvasContext.putImageData(imageData, 0, 0);
        var imageUrl = canvas.toDataURL();
        this.pdfViewerBase.releaseCanvas(canvas);
        var data = ({ image: imageUrl, pageNumber: pageIndex, uniqueId: this.pdfViewerBase.documentId, pageWidth: width });
        this.printSuccess(data, pageWidth, pageHeight, pageIndex);
    };
    Print.prototype.printSuccess = function (result, pageWidth, pageHeight, pageIndex) {
        var _this = this;
        this.pdfViewerBase.isPrint = true;
        var printImage = this.pdfViewerBase.clientSideRendering ? result : result.data;
        var redirect = this.pdfViewerBase.checkRedirection(printImage);
        if (redirect) {
            this.pdfViewerBase.showPrintLoadingIndicator(false);
        }
        else {
            if (printImage) {
                if (typeof printImage !== 'object') {
                    try {
                        printImage = JSON.parse(printImage);
                        if (typeof printImage !== 'object') {
                            this.pdfViewerBase.onControlError(500, printImage, this.pdfViewer.serverActionSettings.print);
                            printImage = null;
                        }
                    }
                    catch (error) {
                        this.pdfViewerBase.onControlError(500, printImage, this.pdfViewer.serverActionSettings.print);
                        printImage = null;
                    }
                }
            }
            if (printImage && printImage.uniqueId === this.pdfViewerBase.documentId) {
                this.pdfViewer.fireAjaxRequestSuccess(this.pdfViewer.serverActionSettings.print, printImage);
                var annotationSource_1;
                if (!this.pdfViewer.annotationSettings.skipPrint) {
                    var annotationCollections = this.pdfViewerBase.documentAnnotationCollections;
                    if (annotationCollections && annotationCollections[printImage.pageNumber] &&
                        this.pdfViewerBase.isTextMarkupAnnotationModule()) {
                        var printCollection = annotationCollections[printImage.pageNumber];
                        if (this.pdfViewerBase.isImportAction) {
                            var textMarkupAnnotation = printCollection.textMarkupAnnotation;
                            var shapeAnnotation = printCollection.shapeAnnotation;
                            var measureShapeAnnotation = printCollection.measureShapeAnnotation;
                            var stampAnnotation = printCollection.stampAnnotations;
                            var freeTextAnnotation = printCollection.freeTextAnnotation;
                            var inkAnnotation = printCollection.signatureInkAnnotation;
                            var stickyNoteAnnotation = printCollection.stickyNotesAnnotation;
                            annotationSource_1 = this.pdfViewer.annotationModule.textMarkupAnnotationModule.
                                printAnnotationsInCanvas(textMarkupAnnotation, printImage.pageNumber, stampAnnotation, shapeAnnotation, measureShapeAnnotation, stickyNoteAnnotation, freeTextAnnotation, inkAnnotation);
                        }
                        else {
                            annotationSource_1 = this.pdfViewer.annotationModule.textMarkupAnnotationModule.
                                printAnnotationsInCanvas(printCollection.textMarkupAnnotation, printImage.pageNumber, printCollection.stampAnnotations, printCollection.shapeAnnotation, printCollection.measureShapeAnnotation, printCollection.stickyNotesAnnotation, printCollection.freeTextAnnotation, printCollection.signatureInkAnnotation);
                        }
                    }
                    if (this.pdfViewerBase.isAnnotationCollectionRemoved) {
                        annotationSource_1 = this.pdfViewer.annotationModule.textMarkupAnnotationModule.
                            printAnnotationsInCanvas(null, printImage.pageNumber, null, null, null, null, null, null);
                    }
                }
                var currentPageNumber_1 = printImage.pageNumber;
                this.printCanvas = createElement('canvas', { id: this.pdfViewer.element.id + '_printCanvas_' + pageIndex, className: 'e-pv-print-canvas' });
                this.printCanvas.style.width = pageWidth + 'px';
                this.printCanvas.style.height = pageHeight + 'px';
                var printScaleValue = this.pdfViewer.printScaleFactor > 1 && this.pdfViewer.printScaleFactor <= 5 ?
                    this.pdfViewer.printScaleFactor : this.pdfViewer.printScaleFactor > 5 ? 5 : 2;
                if (this.pdfViewerBase.clientSideRendering) {
                    //An A0 piece of paper measures 33.1 × 46.8 inches, with 46.8 inches being the greater dimension. The pixel value of 46.8 inches is 4493px. If the document size is too large, we may not be able to display the image. Therefore, we should consider the maximum size of A0 paper if the page size is greater than 4493 pixels.
                    var maxPageSize = 4493;
                    var whichIsBigger = (pageWidth > pageHeight) ? 'Width' : 'Height';
                    var maxWidth = pageWidth;
                    var maxHeight = pageHeight;
                    if (whichIsBigger === 'Width') {
                        maxWidth = (pageWidth > maxPageSize) ? maxPageSize : pageWidth;
                        if (maxWidth === maxPageSize) {
                            maxHeight = pageHeight / (pageWidth / maxPageSize);
                        }
                    }
                    else {
                        maxHeight = (pageHeight > maxPageSize) ? maxPageSize : pageHeight;
                        if (maxHeight === maxPageSize) {
                            maxWidth = pageWidth / (pageHeight / maxPageSize);
                        }
                    }
                    if ((pageHeight < pageWidth) && this.pdfViewer.enablePrintRotation) {
                        this.printCanvas.height = pageWidth * printScaleValue * window.devicePixelRatio;
                        this.printCanvas.width = pageHeight * printScaleValue * window.devicePixelRatio;
                    }
                    else {
                        this.printCanvas.height = maxHeight * printScaleValue * window.devicePixelRatio;
                        this.printCanvas.width = maxWidth * printScaleValue * window.devicePixelRatio;
                    }
                }
                else {
                    this.printCanvas.height = this.printHeight * printScaleValue * window.devicePixelRatio;
                    this.printCanvas.width = this.printWidth * printScaleValue * window.devicePixelRatio;
                }
                if (this.pdfViewerBase.isDeviceiOS) {
                    var size = new Size(this.printCanvas.width, this.printCanvas.height);
                    var newSize = this.limitSize(size, this.maximumPixels);
                    this.printCanvas.width = newSize.width;
                    this.printCanvas.height = newSize.height;
                }
                var context_1 = this.printCanvas.getContext('2d');
                var pageImage_1 = new Image();
                var annotationImage_1 = new Image();
                var annotationImage1_1 = new Image();
                pageImage_1.onload = function () {
                    _this.pdfViewerBase.isPrint = true;
                    if ((pageHeight > pageWidth) || !_this.pdfViewer.enablePrintRotation) {
                        context_1.drawImage(pageImage_1, 0, 0, _this.printCanvas.width, _this.printCanvas.height);
                        if (annotationSource_1 && annotationSource_1.annotImg) {
                            context_1.drawImage(annotationImage_1, 0, 0, _this.printCanvas.width, _this.printCanvas.height);
                        }
                        if (annotationSource_1 && annotationSource_1.highlightImg) {
                            context_1.save();
                            context_1.globalCompositeOperation = 'multiply';
                            context_1.drawImage(annotationImage1_1, 0, 0, _this.printCanvas.width, _this.printCanvas.height);
                            context_1.restore();
                        }
                    }
                    else {
                        // translate to center canvas
                        context_1.translate(_this.printCanvas.width * 0.5, _this.printCanvas.height * 0.5);
                        // rotate the canvas to - 90 degree
                        context_1.rotate(-0.5 * Math.PI);
                        // un translate the canvas back to origin
                        context_1.translate(-_this.printCanvas.height * 0.5, -_this.printCanvas.width * 0.5);
                        // draw the image
                        context_1.drawImage(pageImage_1, 0, 0, _this.printCanvas.height, _this.printCanvas.width);
                        if (annotationSource_1 && annotationSource_1.annotImg) {
                            context_1.drawImage(annotationImage_1, 0, 0, _this.printCanvas.height, _this.printCanvas.width);
                        }
                        if (annotationSource_1 && annotationSource_1.highlightImg) {
                            context_1.save();
                            context_1.globalCompositeOperation = 'multiply';
                            context_1.drawImage(annotationImage1_1, 0, 0, _this.printCanvas.height, _this.printCanvas.width);
                            context_1.restore();
                        }
                    }
                    if (currentPageNumber_1 === (_this.pdfViewerBase.pageCount - 1)) {
                        _this.printWindowOpen();
                    }
                    _this.pdfViewer.renderDrawing(null, pageIndex);
                    _this.pdfViewerBase.isPrint = false;
                };
                pageImage_1.src = printImage.image;
                if (annotationSource_1 && !isNullOrUndefined(annotationSource_1.annotImg)) {
                    annotationImage_1.src = annotationSource_1.annotImg;
                }
                if (annotationSource_1 && !isNullOrUndefined(annotationSource_1.highlightImg)) {
                    annotationImage1_1.src = annotationSource_1.highlightImg;
                }
                this.printViewerContainer.appendChild(this.printCanvas);
            }
        }
        this.pdfViewerBase.isPrint = false;
    };
    Print.prototype.limitSize = function (size, maximumPixels) {
        var width = size.width, height = size.height;
        var requiredPixels = width * height;
        if (requiredPixels <= maximumPixels) {
            return new Size(size.width, size.height);
        }
        var scalar = Math.sqrt(maximumPixels) / Math.sqrt(requiredPixels);
        return new Size(Math.floor(width * scalar), Math.floor(height * scalar));
    };
    Print.prototype.renderFieldsForPrint = function (pageIndex, heightRatio, widthRatio) {
        var data = null;
        var targetField;
        if (this.pdfViewer.printMode === 'Default') {
            targetField = this.frameDoc.document.getElementById('fields_' + pageIndex);
        }
        else {
            targetField = this.printWindow.document.getElementById('fields_' + pageIndex);
        }
        if (this.pdfViewer.formFieldsModule) {
            data = this.pdfViewerBase.getItemFromSessionStorage('_formfields');
        }
        if (!this.pdfViewer.formDesignerModule) {
            if (data) {
                var formFieldsData = JSON.parse(data);
                for (var i = 0; i < formFieldsData.length; i++) {
                    var currentData = formFieldsData[parseInt(i.toString(), 10)];
                    if (parseFloat(currentData['PageIndex']) === pageIndex) {
                        var field = this.pdfViewer.formFieldsModule.createFormFields(currentData, pageIndex, i, targetField);
                        var inputField = field.currentField;
                        if (inputField) {
                            var bounds = currentData['LineBounds'];
                            var font = currentData['Font'];
                            this.applyPosition(inputField, bounds, font, heightRatio, widthRatio);
                            inputField.InsertSpaces = currentData.InsertSpaces;
                            if (inputField.InsertSpaces) {
                                var font_1 = ((parseInt(inputField.style.width, 10) / inputField.maxLength) -
                                    (parseFloat(inputField.style.fontSize) / 2)) - 0.6;
                                inputField.style.letterSpacing = '' + font_1 + 'px';
                                inputField.style.fontFamily = 'monospace';
                            }
                            var pageDetails = this.pdfViewerBase.pageSize[parseInt(pageIndex.toString(), 10)];
                            if ((pageDetails.width > pageDetails.height) && this.pdfViewer.enablePrintRotation) {
                                /*
                                The below logig have been modified for the bug https://syncfusion.atlassian.net/browse/EJ2-57986
                                This code changes is specific for form field elements.

                                    inputField.style.transform = 'rotate(-90deg)';
                                    let previousLeft: number = parseFloat(inputField.style.left);
                                    let currentWidthPosition: number = parseFloat(inputField.style.width) / 2;
                                    let currentHeightPosition: number = parseFloat(inputField.style.height) / 2;
                                    let currentTop: number = parseFloat(inputField.style.top);
                                    let currentHeight: number = parseFloat(inputField.style.height);
                                    inputField.style.left = (currentHeightPosition - currentWidthPosition + currentTop) + 'px';
                                    inputField.style.top = (pageDetails.width / widthRatio) - (currentHeight / heightRatio) - ((currentWidthPosition / heightRatio) - (currentHeightPosition / heightRatio) + previousLeft) + 'px';
                                */
                                var x = this.pdfViewer.formFieldsModule.ConvertPointToPixel(bounds.X);
                                var y = this.pdfViewer.formFieldsModule.ConvertPointToPixel(bounds.Y);
                                var width = this.pdfViewer.formFieldsModule.ConvertPointToPixel(bounds.Width);
                                var height = this.pdfViewer.formFieldsModule.ConvertPointToPixel(bounds.Height);
                                var pageHeight = pageDetails.width;
                                var top_1 = pageHeight - x - height;
                                var left = (y + height);
                                inputField.style.transform = 'rotate(-90deg)';
                                inputField.style.transformOrigin = 'left bottom';
                                inputField.style.left = left + 'px';
                                inputField.style.top = top_1 + 'px';
                                inputField.style.height = height + 'px';
                                inputField.style.width = width + 'px';
                            }
                            inputField.style.backgroundColor = 'transparent';
                            if (!currentData.IsSignatureField) {
                                inputField.style.borderColor = 'transparent';
                            }
                            targetField.appendChild(inputField);
                        }
                    }
                }
            }
        }
        else {
            var formDesignerData = null;
            if (this.pdfViewer.formDesignerModule) {
                formDesignerData = this.pdfViewerBase.getItemFromSessionStorage('_formDesigner');
            }
            if (formDesignerData || this.pdfViewer.formFieldCollections.length > 0) {
                var formFieldsData = !isNullOrUndefined(formDesignerData) ? JSON.parse(formDesignerData) : [];
                this.pdfViewer.formDesignerModule.updateMissingFormFields(formFieldsData);
                var formDesignerFieldsData = formFieldsData;
                for (var i = 0; i < formDesignerFieldsData.length; i++) {
                    var currentData = formDesignerFieldsData[parseInt(i.toString(), 10)].FormField;
                    if (currentData.pageNumber - 1 === pageIndex && currentData.isPrint) {
                        var signatureField = this.pdfViewer.nameTable[formDesignerFieldsData[parseInt(i.toString(), 10)].Key.split('_')[0]];
                        var element = null;
                        if (!isNullOrUndefined(signatureField)) {
                            element = signatureField.wrapper.children[0];
                        }
                        else {
                            signatureField = this.createSignatureField(currentData);
                            element = signatureField.wrapper.children[0];
                        }
                        var htmlElement = void 0;
                        if (element) {
                            if (currentData.formFieldAnnotationType === 'RadioButton') {
                                for (var j = 0; j < currentData.radiobuttonItem.length; j++) {
                                    signatureField = this.pdfViewer.nameTable[currentData.radiobuttonItem[parseInt(j.toString(), 10)].id.split('_')[0]];
                                    if (isNullOrUndefined(signatureField)) {
                                        signatureField = this.createSignatureField(currentData.radiobuttonItem[parseInt(j.toString(), 10)]);
                                    }
                                    htmlElement = this.createFormDesignerFields(currentData.radiobuttonItem[parseInt(j.toString(), 10)], element, signatureField);
                                    if (htmlElement) {
                                        var bounds = currentData.radiobuttonItem[parseInt(j.toString(), 10)].lineBound;
                                        var font = currentData.radiobuttonItem[parseInt(j.toString(), 10)].fontFamily;
                                        this.applyPosition(htmlElement, bounds, font, heightRatio, widthRatio, true, currentData.radiobuttonItem[parseInt(j.toString(), 10)].zoomValue, currentData.pageNumber - 1);
                                        targetField.appendChild(htmlElement);
                                    }
                                }
                            }
                            else {
                                htmlElement = this.createFormDesignerFields(currentData, element, signatureField);
                                if (htmlElement) {
                                    var bounds = currentData.lineBound;
                                    var font = currentData.fontFamily;
                                    this.applyPosition(htmlElement, bounds, font, heightRatio, widthRatio, true, currentData.zoomValue, currentData.pageNumber - 1);
                                    if (!isNullOrUndefined(bounds) && bounds.Width > 0 && bounds.Height > 0) {
                                        targetField.appendChild(htmlElement);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    };
    Print.prototype.createSignatureField = function (data) {
        var cloneCurrentData = JSON.parse(JSON.stringify(data));
        if (data.lineBound) {
            var _a = data.lineBound, x = _a.X, y = _a.Y, width = _a.Width, height = _a.Height;
            cloneCurrentData.bounds = { x: x, y: y, width: width, height: height };
            delete cloneCurrentData.lineBound;
        }
        if (data.option && (data.formFieldAnnotationType === 'DropdownList' || data.formFieldAnnotationType === 'ListBox')) {
            cloneCurrentData.options = cloneCurrentData.option;
            delete cloneCurrentData.option;
        }
        var signatureField = new PdfFormFieldBase(this.pdfViewer, 'formFields', cloneCurrentData, true);
        this.pdfViewer.drawing.initNode(signatureField);
        signatureField.backgroundColor = typeof signatureField.backgroundColor === 'string' ?
            signatureField.backgroundColor :
            this.pdfViewer.formDesignerModule.getRgbToHex(signatureField.backgroundColor);
        signatureField.borderColor = typeof signatureField.borderColor === 'string' ?
            signatureField.borderColor :
            this.pdfViewer.formDesignerModule.getRgbToHex(signatureField.borderColor);
        return signatureField;
    };
    Print.prototype.createFormDesignerFields = function (currentData, element, signatureField) {
        var parentHtmlElementAttribute = {
            'id': 'form_field_' + element.id + '_html_element',
            'class': 'foreign-object'
        };
        var parentHtmlElement = this.pdfViewer.formDesignerModule.createHtmlElement('div', parentHtmlElementAttribute);
        var HtmlElementAttribute = {
            'id': element.id + '_html_element',
            'class': 'foreign-object'
        };
        var htmlElement = this.pdfViewer.formDesignerModule.createHtmlElement('div', HtmlElementAttribute);
        if (currentData.formFieldAnnotationType === 'SignatureField' || currentData.formFieldAnnotationType === 'InitialField') {
            this.pdfViewer.formDesignerModule.disableSignatureClickEvent = true;
            element.template = htmlElement.appendChild(this.pdfViewer.formDesignerModule.
                createSignatureDialog(this.pdfViewer, signatureField, null, true));
            this.pdfViewer.formDesignerModule.disableSignatureClickEvent = false;
        }
        else if (currentData.formFieldAnnotationType === 'DropdownList') {
            element.template = htmlElement.appendChild(this.pdfViewer.formDesignerModule.createDropDownList(element, signatureField, true));
        }
        else if (currentData.formFieldAnnotationType === 'ListBox') {
            element.template = htmlElement.appendChild(this.pdfViewer.formDesignerModule.createListBox(element, signatureField, true));
        }
        else {
            element.template = htmlElement.appendChild(this.pdfViewer.formDesignerModule.
                createInputElement(currentData.formFieldAnnotationType, signatureField, null, true));
        }
        parentHtmlElement.appendChild(htmlElement);
        return htmlElement;
    };
    /**
     * @param {any} inputField - It describes about the input field
     * @param {any} bounds - It describes about the bounds
     * @param {any} font - It describes about the font
     * @param {number} heightRatio - It describes about the height ratio
     * @param {number} widthRatio - It describes about the width ratio
     * @param {boolean} isFormDesignerField - It describes about the isFormDesignerField
     * @param {number} zoomValue - It describes about the zoom value
     * @param {number} pageIndex - It describes about the page index value
     * @private
     * @returns {void}
     */
    Print.prototype.applyPosition = function (inputField, bounds, font, heightRatio, widthRatio, isFormDesignerField, zoomValue, pageIndex) {
        if (bounds) {
            var pageHeight = void 0;
            var left = void 0;
            var top_2;
            var width = void 0;
            var height = void 0;
            // This code changes is specific for form designer elements. https://syncfusion.atlassian.net/browse/EJ2-57986
            // eslint-disable-next-line
            var pageDetails = this.pdfViewerBase.pageSize[pageIndex];
            var actualWidth = pageDetails ? pageDetails.width : 0;
            var actualHeight = pageDetails ? pageDetails.height : 0;
            if (isFormDesignerField && actualHeight < actualWidth && this.pdfViewer.enablePrintRotation) {
                /*
                The below logig have been modified for the bug https://syncfusion.atlassian.net/browse/EJ2-57986
                This code changes is specific for form designer elements.
                pageHeight = actualWidth;
                top=  pageHeight - bounds.X / zoomValue;
                left = bounds.Y / zoomValue;
                width = (bounds.Width / zoomValue);
                height = (bounds.Height / zoomValue);
                inputField.style.transform = "rotate(-90deg)";
                inputField.style.transformOrigin = "top left";
                */
                // need to set inverse page height and width
                pageHeight = actualWidth;
                top_2 = pageHeight - bounds.X / zoomValue - bounds.Height / zoomValue;
                left = (bounds.Y + bounds.Height) / zoomValue;
                width = (bounds.Width / zoomValue);
                height = (bounds.Height / zoomValue);
                inputField.style.transform = 'rotate(-90deg)';
                inputField.style.transformOrigin = 'left bottom';
            }
            else {
                left = isFormDesignerField ? (bounds.X / zoomValue) / widthRatio :
                    (this.pdfViewer.formFieldsModule.ConvertPointToPixel(bounds.X)) / widthRatio;
                top_2 = isFormDesignerField ? (bounds.Y / zoomValue) / heightRatio :
                    (this.pdfViewer.formFieldsModule.ConvertPointToPixel(bounds.Y)) / heightRatio;
                width = isFormDesignerField ? (bounds.Width / zoomValue) / widthRatio :
                    (this.pdfViewer.formFieldsModule.ConvertPointToPixel(bounds.Width)) / widthRatio;
                height = isFormDesignerField ? (bounds.Height / zoomValue) / heightRatio :
                    (this.pdfViewer.formFieldsModule.ConvertPointToPixel(bounds.Height)) / heightRatio;
            }
            var fontHeight = 0;
            if (font !== null && font.Height) {
                inputField.style.fontFamily = font.Name;
                if (font.Italic) {
                    inputField.style.fontStyle = 'italic';
                }
                if (font.Bold) {
                    inputField.style.fontWeight = 'Bold';
                }
                fontHeight = this.pdfViewerBase.ConvertPointToPixel(font.Size);
            }
            if (Browser.isIE) {
                top_2 = top_2 - 1;
            }
            this.pdfViewerBase.setStyleToTextDiv(inputField, left, top_2, fontHeight, width, height, true);
        }
    };
    /**
     * @param {any} printDocument - It describes printdocument element
     * @param {string} styleContent - It describes styles text content
     * @private
     * @returns {void}
     */
    Print.prototype.createStyleSheet = function (printDocument, styleContent) {
        var blob = new Blob([styleContent], { type: 'text/css' });
        var linkElement = printDocument.createElement('link');
        linkElement.rel = 'stylesheet';
        linkElement.href = URL.createObjectURL(blob);
        printDocument.head.appendChild(linkElement);
    };
    Print.prototype.printWindowOpen = function () {
        var _this = this;
        var browserUserAgent = navigator.userAgent;
        var printDocument;
        if (this.pdfViewer.printMode === 'Default') {
            printDocument = this.frameDoc.document;
        }
        else {
            printDocument = this.printWindow.document;
        }
        for (var i = 0; i < this.printViewerContainer.children.length; i++) {
            /*
            Create a new Base64-encoded image with increased quality
            Also help to reduce the file size while save as pdf
            */
            if (i === 0) {
                printDocument.write('<!DOCTYPE html>');
                printDocument.write('<html moznomarginboxes mozdisallowselectionprint><head></head><body>');
            }
            var canvasUrl = this.printViewerContainer.children[parseInt(i.toString(), 10)].toDataURL('image/jpeg');
            printDocument.write('<div id="' + 'imageElementPdf_' + i + '"><img src="' + canvasUrl + '" id="' + 'image_' + i + '" /><div id="' + 'fields_' + i + '"></div></div>');
            var imageElement = printDocument.getElementById('imageElementPdf_' + i);
            imageElement.style.cssText = "margin:0mm;width:" + this.printWidth + "px;height:" + this.printHeight + "px;position:relative";
            var fieldElement = printDocument.getElementById('fields_' + i);
            fieldElement.style.cssText = "margin:0px;top:0px;left:0px;position:absolute;width:" + this.printWidth + "px;height:" + this.printHeight + "px;z-index:2";
            if (this.pdfViewer.formFieldsModule || this.pdfViewer.formDesignerModule) {
                var pageWidth = this.pdfViewerBase.pageSize[parseInt(i.toString(), 10)].width;
                var pageHeight = this.pdfViewerBase.pageSize[parseInt(i.toString(), 10)].height;
                var heightRatio = void 0;
                var widthRatio = void 0;
                if ((pageHeight < pageWidth) && this.pdfViewer.enablePrintRotation) {
                    heightRatio = pageHeight / this.printWidth;
                    widthRatio = pageWidth / this.printHeight;
                }
                else {
                    heightRatio = pageHeight / this.printHeight;
                    widthRatio = pageWidth / this.printWidth;
                }
                this.renderFieldsForPrint(i, heightRatio, widthRatio);
            }
            if (i === 0) {
                if ((browserUserAgent.indexOf('Chrome') !== -1) || (browserUserAgent.indexOf('Safari') !== -1) ||
                    (browserUserAgent.indexOf('Firefox')) !== -1) {
                    var styleContent = "\n                        html, body { height: 100%; width: 100%; }\n                        img { height: 100%; width: 100%; display: block; }\n                        @media print { \n                            body { margin: 0cm; }\n                            img { width: 100%; box-sizing: border-box; }\n                            br, button { display: none; }\n                            div { page-break-inside: avoid; }\n                        }\n                        @page { margin: 0mm; size: " + this.printWidth.toString() + "px " + this.printHeight.toString() + "px; }\n                    ";
                    this.createStyleSheet(printDocument, styleContent);
                }
                else {
                    var styleContent = "\n                        html, body { height: 100%; }\n                        img { height: 100%; width: 100%; }\n                        @media print { \n                            body { margin: 0cm; }\n                            img { width: 100%; box-sizing: border-box; }\n                            br, button { display: none; }\n                            div { page-break-inside: avoid; }\n                        }\n                        @page { margin: 0mm; size: " + this.printWidth.toString() + "px " + this.printHeight.toString() + "px; }\n                    ";
                    this.createStyleSheet(printDocument, styleContent);
                }
            }
        }
        if (Browser.isIE || Browser.info.name === 'edge') {
            try {
                if (this.pdfViewer.printMode === 'Default') {
                    this.pdfViewerBase.showPrintLoadingIndicator(false);
                    this.iframe.contentWindow.document.execCommand('print', false, null);
                }
                else {
                    this.printWindow.document.execCommand('print', false, null);
                }
            }
            catch (e) {
                if (this.pdfViewer.printMode === 'Default') {
                    this.pdfViewerBase.showPrintLoadingIndicator(false);
                    this.iframe.contentWindow.print();
                }
                else {
                    this.printWindow.print();
                }
            }
        }
        else {
            setTimeout(function () {
                if (_this.pdfViewer.printMode === 'Default') {
                    _this.pdfViewerBase.showPrintLoadingIndicator(false);
                    _this.iframe.contentWindow.print();
                    _this.iframe.contentWindow.focus();
                    if (_this.pdfViewerBase.isDeviceiOS || Browser.isDevice) {
                        // eslint-disable-next-line
                        var proxy_1 = _this;
                        window.onafterprint = function () {
                            document.body.removeChild(proxy_1.iframe);
                        };
                    }
                    else {
                        document.body.removeChild(_this.iframe);
                    }
                }
                else {
                    if (_this.printWindow) {
                        _this.printWindow.print();
                        _this.printWindow.focus();
                        if (!Browser.isDevice || _this.pdfViewerBase.isDeviceiOS) {
                            _this.printWindow.close();
                        }
                    }
                }
            }, 200);
        }
    };
    Print.prototype.createPrintLoadingIndicator = function (element) {
        var printWindowContainer = createElement('div', {
            id: this.pdfViewer.element.id + '_printWindowcontainer'
        });
        printWindowContainer.style.height = '100%';
        printWindowContainer.style.width = '100%';
        printWindowContainer.style.position = 'absolute';
        printWindowContainer.style.zIndex = 2000;
        printWindowContainer.style.left = 0;
        printWindowContainer.style.top = 0;
        printWindowContainer.style.overflow = 'auto';
        printWindowContainer.style.backgroundColor = 'rgba(0, 0, 0, 0.3)';
        element.appendChild(printWindowContainer);
        var printWaitingPopup = createElement('div', {
            id: this.pdfViewer.element.id + '_printLoadingContainer'
        });
        printWaitingPopup.style.position = 'absolute';
        printWaitingPopup.style.width = '50px';
        printWaitingPopup.style.height = '50px';
        printWaitingPopup.style.left = '46%';
        printWaitingPopup.style.top = '45%';
        printWindowContainer.style.zIndex = 3000;
        printWindowContainer.appendChild(printWaitingPopup);
        var printImageContainer = new Image();
        printImageContainer.src = 'data:image/gif;base64,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';
        printImageContainer.style.width = '50px';
        printImageContainer.style.height = '50px';
        printWaitingPopup.appendChild(printImageContainer);
        var printLabelContainer = createElement('div', {
            id: this.pdfViewer.element.id + '_printLabelContainer'
        });
        printLabelContainer.style.position = 'absolute';
        printLabelContainer.textContent = 'Loading ...';
        printLabelContainer.style.fontWeight = 'Bold';
        printLabelContainer.style.left = '46%';
        printLabelContainer.style.top = '54.5%';
        printLabelContainer.style.zIndex = '3000';
        printWindowContainer.appendChild(printLabelContainer);
    };
    /**
     * @private
     * @returns {void}
     */
    Print.prototype.destroy = function () {
        this.printViewerContainer = undefined;
        this.frameDoc = undefined;
        this.printWindow = undefined;
    };
    /**
     * @private
     * @returns {string} - string
     */
    Print.prototype.getModuleName = function () {
        return 'Print';
    };
    return Print;
}());
export { Print };
