//string extention function - executes .net like string format String.format = function () { // The string containing the format items (e.g. "{0}") // will and always has to be the first argument. var theString = arguments[0]; // start with the second argument (i = 1) for (var i = 1; i < arguments.length; i++) { // "gm" = RegEx options for Global search (more than one instance) and for Multiline search var regEx = new RegExp("\\{" + (i - 1) + "\\}", "gm"); theString = theString.replace(regEx, arguments[i]); } return theString; } // source: https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent ; (function () { if (typeof window.CustomEvent === "function") return false function CustomEvent(event, params) { params = params || { bubbles: false, cancelable: false, detail: undefined } var evt = document.createEvent("CustomEvent") evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail) return evt } CustomEvent.prototype = window.Event.prototype window.CustomEvent = CustomEvent })() // https://tc39.github.io/ecma262/#sec-array.prototype.find if (!Array.prototype.find) { Object.defineProperty(Array.prototype, 'find', { value: function (predicate) { // 1. Let O be ? ToObject(this value). if (this == null) { throw new TypeError('"this" is null or not defined'); } var o = Object(this); // 2. Let len be ? ToLength(? Get(O, "length")). var len = o.length >>> 0; // 3. If IsCallable(predicate) is false, throw a TypeError exception. if (typeof predicate !== 'function') { throw new TypeError('predicate must be a function'); } // 4. If thisArg was supplied, let T be thisArg; else let T be undefined. var thisArg = arguments[1]; // 5. Let k be 0. var k = 0; // 6. Repeat, while k < len while (k < len) { // a. Let Pk be ! ToString(k). // b. Let kValue be ? Get(O, Pk). // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)). // d. If testResult is true, return kValue. var kValue = o[k]; if (predicate.call(thisArg, kValue, k, o)) { return kValue; } // e. Increase k by 1. k++; } // 7. Return undefined. return undefined; }, configurable: true, writable: true }); } // https://tc39.github.io/ecma262/#sec-array.prototype.includes if (!Array.prototype.includes) { Object.defineProperty(Array.prototype, 'includes', { value: function (valueToFind, fromIndex) { if (this == null) { throw new TypeError('"this" is null or not defined'); } // 1. Let O be ? ToObject(this value). var o = Object(this); // 2. Let len be ? ToLength(? Get(O, "length")). var len = o.length >>> 0; // 3. If len is 0, return false. if (len === 0) { return false; } // 4. Let n be ? ToInteger(fromIndex). // (If fromIndex is undefined, this step produces the value 0.) var n = fromIndex | 0; // 5. If n ≥ 0, then // a. Let k be n. // 6. Else n < 0, // a. Let k be len + n. // b. If k < 0, let k be 0. var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); function sameValueZero(x, y) { return x === y || (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y)); } // 7. Repeat, while k < len while (k < len) { // a. Let elementK be the result of ? Get(O, ! ToString(k)). // b. If SameValueZero(valueToFind, elementK) is true, return true. if (sameValueZero(o[k], valueToFind)) { return true; } // c. Increase k by 1. k++; } // 8. Return false return false; } }); } if (!String.prototype.trim) { String.prototype.trim = function () { return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); }; } COMMON.functions = (function () { var imagesToUpload = []; var getBrowserName = function () { var name = "Unknown"; if (navigator.userAgent.indexOf("MSIE") != -1 || navigator.userAgent.indexOf("Trident") != -1) { name = "MSIE"; } else if (navigator.userAgent.indexOf("Firefox") != -1) { name = "Firefox"; } else if (navigator.userAgent.indexOf("Opera") != -1) { name = "Opera"; } else if (navigator.userAgent.match(/Version\/[\d\.]+.*Safari/)) { name = "Safari"; } else if (navigator.userAgent.indexOf("Chrome") != -1) { name = "Chrome"; } return name; } var createUUID = function () { var s = []; var hexDigits = "0123456789abcdef"; for (var i = 0; i < 36; i++) { s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); } s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010 s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01 s[8] = s[13] = s[18] = s[23] = "-"; var uuid = s.join(""); return uuid; } var spinner = { elementText: '', show: function (container, color, pixel, size, text) { var h = ''; var t = '' + text + ''; $(container).addClass('prevent-click').addClass('unset-line-height'); $(container).children().fadeOut(); spinner.elementText = $(container).html(); $(container).html(''); if ($(container).find('#spinner').length == 0) $(container).append(h); if (text) { $(container).addClass('spinner-flex'); $(container).append(t); } }, hide: function (container, _text) { if (!container) { var spinnerContainer = $('#spinner').parent(); $('#spinner').remove(); $(spinnerContainer).removeClass('prevent-click'); $(spinnerContainer).removeClass('spinner-flex'); $(spinnerContainer).children().fadeIn(); $(spinnerContainer).html(spinner.elementText); } $(container).find('#spinner').remove(); $(container).removeClass('spinner-flex'); $(container).removeClass('prevent-click'); $(container).children().fadeIn(); if (_text) $(container).html(_text); else $(container).html(spinner.elementText); } } var cubesLoader = { show: function (bgColor) { if(isSharedViewSession && SHARED_REVIEW.collaboration){ SHARED_REVIEW.collaboration.showHideLoader(true); } else{ bgColor = bgColor ? bgColor : 'rgba(62, 69, 84, 0.1)'; $(".loading-indicator").addClass('active').css('background', bgColor); } }, hide: function () { if(isSharedViewSession && SHARED_REVIEW.collaboration){ SHARED_REVIEW.collaboration.showHideLoader(false); } $(".loading-indicator").removeClass('active'); } }; /** * Add the relevant script to the document.head if not exists * @param {string} scriptSrc - The script source url. * @param {Function} callback - The callback that called AFTER the script is ready. */ var loadScript = function (scriptSrc, callback) { try { // Get all page scripts var scriptList = []; $.each($('script'), function (index, currScript) { scriptList.push(currScript.src); }); // If script exsists, Remove it. const existScript = $.grep(scriptList, function (e) { return e.indexOf(scriptSrc) > -1 }); if (existScript.length > 0 && existScript[0].indexOf('americanexpress') === -1) { callback({ result: true }); return; } else if (existScript.length > 0 && existScript[0].indexOf('americanexpress') > -1) { $("script[src='" + existScript + "']").remove(); } const script = document.createElement('script'); script.type = "text/javascript"; // only required for IE < 9 if (script.readyState) { script.onreadystatechange = function () { if (script.readyState === "loaded" || script.readyState === "complete") { script.onreadystatechange = null; if (callback) callback({ result: true }); } }; //Other browsers } else { script.onload = function () { if (callback) callback({ result: true }); }; } script.setAttribute('src', scriptSrc); script.onerror = function () { if (callback) callback({ result: false }); }; document.head.appendChild(script); } catch (ex) { if (callback) callback({ result: false }); } }; var togglePanel = function (panelId) { var $panel = $('#' + panelId); if ($panel.length) { var navigationType = $panel.attr('data-type'); $('.tab-content').find('.tab-pane').removeClass('active'); if (navigationType == "tool") { $('.files.side-view').find('.tabs-controls').hide(); $('.tools-back-arrow').off('click').on('click', function (e) { e.preventDefault(); panelId = $(this).attr('data-toggle'); COMMON.functions.togglePanel(panelId); }); } else { $('.files.side-view').find('.tabs-controls').show(); } switch (panelId) { case 'document_request_panel': { DOCUMENT_REQUEST.bucket.reset(); DOCUMENT_REQUEST.view.init(); $panel.find('.document-request-browser .dr-all-documents').addClass('collapse'); $panel.find('.document-request-browser .dr-all-documents .circle-plus').removeClass('opened'); break; } case 'shared_review_panel': { SHARED_REVIEW_PANEL.view.reset(); break; } case 'send_batch_panel': { SEND_BATCH.view.reset(); break; } } $panel.addClass('active'); } } var getImageOrientation = function (file, callback) { var reader = new FileReader(); reader.onload = function (e) { var view = new DataView(e.target.result); if (view.getUint16(0, false) != 0xFFD8) return callback(-2); var length = view.byteLength, offset = 2; while (offset < length) { var marker = view.getUint16(offset, false); offset += 2; if (marker == 0xFFE1) { if (view.getUint32(offset += 2, false) != 0x45786966) return callback(-1); var little = view.getUint16(offset += 6, false) == 0x4949; offset += view.getUint32(offset + 4, little); var tags = view.getUint16(offset, little); offset += 2; for (var i = 0; i < tags; i++) if (view.getUint16(offset + (i * 12), little) == 0x0112) return callback(view.getUint16(offset + (i * 12) + 8, little)); } else if ((marker & 0xFF00) != 0xFF00) break; else offset += view.getUint16(offset, false); } return callback(-1); }; reader.readAsArrayBuffer(file.slice(0, 64 * 1024)); } var showFile = function (fileId, direction, callback) { COMMON.functions.cubesLoader.show(); var xhr = $.ajax({ cache: false, async: true, type: "GET", url: 'Handlers/GetDocument.ashx?preview=1&sessionId=' + m_sessionData.sessionId + '&fileId=' + fileId + '&direction=' + direction + '&lang=' + m_sessionData.language + '&sid=' + m_sessionData.sessionId, contentType: "application/json", success: function (response) { if (response.fileData) { files = []; files[0] = {}; files[0].data = response.fileData; files[0].type = "application/pdf/base64"; COMMON.functions.showFiles(files, function (res) { if (callback) callback({ result: res.result }); }); } else { COMMON.functions.cubesLoader.hide(); } }, error: function (textStatus, errorThrown) { COMMON.functions.cubesLoader.hide(); } }); }; var showFiles = function (files, callback) { COMMON.functions.cubesLoader.show(); COMMON.functions.eventDispacher("destroyMultiSigner"); canvases = []; panzoomObj = []; for (var i = 0, file; file = files[i]; i++) { if (file.type == "application/pdf") { pdfFileName = file.name; var reader = new FileReader(); reader.onload = function (e2) { pdfFile = e2.target.result; var imagesUrlArr = []; var pdfAsDataUri = e2.target.result; pdfAsDataUri = convertDataURIToBinary(pdfAsDataUri); pdfjsLib.GlobalWorkerOptions.workerSrc = "js/pdf.worker.js"; pdfjsLib.getDocument(pdfAsDataUri).then(function (pdfDoc) { for (var i = 1; i <= pdfDoc.numPages; i++) { imagesUrlArr.push('images/1px.png'); } gallery = blueimp.Gallery(imagesUrlArr, { useBootstrapModal: false, toggleControlsOnSlideClick: false, toggleSlideshowOnSpace: false, enableKeyboardNavigation: false, closeOnSlideClick: false, emulateTouchEvents: false, unloadElements: false, disableScroll: true, stopTouchEventsPropagation: true, toggleControlsOnReturn: false, onopened: function () { $('.navigation .pages .count').text('1/' + pdfDoc.numPages); COMMON.functions.cubesLoader.hide(); }, onslide: function (index, slide) { const slideIndex = index + 1; $('.navigation .pages .count').text((slideIndex) + '/' + pdfDoc.numPages); COMMON.functions.resetPanZoom(); }, onclosed: function () { canvases = []; imagesToUpload = []; }, preloadRange: imagesUrlArr.length }); $('#inputImageCaption').val(pdfFileName); for (var j = 1; j <= pdfDoc.numPages; j++) { pdfDoc.getPage(j).then(function (page) { var viewport = page.getViewport(2.0); var canvas = document.createElement('canvas'); var context = canvas.getContext('2d'); canvas.height = viewport.height; canvas.width = viewport.width; var renderContext = { canvasContext: context, viewport: viewport }; var task = page.render(renderContext); var completeCallback = task._internalRenderTask.callback; task._internalRenderTask.callback = function (error) { completeCallback.call(this, error); var currentPageNumber = this.pageNumber; imagesToUpload.push({ fileIndex: currentPageNumber, fileData: canvas.toDataURL() }); var slide = $('.slides .slide[data-index=' + (currentPageNumber - 1) + ']') var img = slide.get(0).getElementsByTagName('img')[0]; // Create new img element img.src = canvas.toDataURL(); img.onload = function () { $(slide).append(''); var oCanvasObj = oCanvas.create({ canvas: slide.get(0).getElementsByTagName('canvas')[0] }); var image = oCanvasObj.display.image({ image: img, width: img.naturalWidth, height: img.naturalHeight }); oCanvasObj.addChild(image); canvases.push({ index: currentPageNumber - 1, canvas: oCanvasObj }); $(slide).find('img').hide(); panzoomObj[currentPageNumber - 1] = Panzoom($(slide).find('canvas')[0]); if (currentPageNumber === pdfDoc.numPages && callback) { COMMON.functions.cubesLoader.hide(); callback({ result: true, _canvases: canvases }); } } }; }); } }); } reader.readAsDataURL(file); // start reading the file data. } else if (file.type == "application/pdf/base64") { pdfFileName = file.fileName; $('#inputImageCaption').val(pdfFileName); // when clicking send var imagesUrlArr = []; panzoomObj = []; var pdfAsDataUri = 'data:application/pdf;base64,' + file.data; pdfFile = pdfAsDataUri; pdfAsDataUri = convertDataURIToBinary(pdfAsDataUri); m_forwardFileData = null; pdfjsLib.GlobalWorkerOptions.workerSrc = "js/pdf.worker.js"; pdfjsLib.getDocument(pdfAsDataUri).then(function (pdfDoc) { for (var i = 1; i <= pdfDoc.numPages; i++) { imagesUrlArr.push('images/1px.png'); } gallery = blueimp.Gallery(imagesUrlArr, { useBootstrapModal: false, toggleControlsOnSlideClick: false, toggleSlideshowOnSpace: false, enableKeyboardNavigation: false, closeOnSlideClick: false, emulateTouchEvents: false, unloadElements: false, disableScroll: true, stopTouchEventsPropagation: true, toggleControlsOnReturn: false, onopened: function () { $('.navigation .pages .count').text('1/' + pdfDoc.numPages); $('#blueimp-gallery').removeClass('invisible'); COMMON.functions.cubesLoader.hide(); if (callback) callback({ result: true }); }, onslide: function (index, slide) { const slideIndex = index + 1; $('.navigation .pages .count').text(slideIndex + '/' + pdfDoc.numPages); COMMON.functions.resetPanZoom(); if (imagesToUpload[slideIndex]) { } else { COMMON.functions.cubesLoader.show(); loadBlueimpSingleImage(pdfDoc, (slideIndex)); } }, onclosed: function () { canvases = []; imagesToUpload = []; $('#blueimp-gallery').addClass('invisible'); }, preloadRange: 0 }); }); } else if (file.type == "image/png" || file.type == "image/jpeg") { var reader = new FileReader(); var fileName = file.name; reader.onload = function (e2) { imgFile = e2.target.result; Lightico.api.showImage(imgFile, true, '', fileName); $buttonSendFile.off('click').on('click', function () { onSendImageClick(imgFile, $('#inputImageCaption').val()); }); COMMON.functions.cubesLoader.hide(); if (callback) callback({ result: true }); } reader.readAsDataURL(file); } else { $('.popup-view').addClass('visible').find('.popup-msg').text(Resources.file_not_supported); COMMON.functions.cubesLoader.hide(); } } } var initPlaceholderFocus = function () { $(document).on('select2:open', function (e) { $(e.target).closest('.input-placeholder').addClass('focused'); }); $(document).on('select2:close', function (e) { $(e.target).closest('.input-placeholder').removeClass('focused'); }); const selector = 'input[type="text"], input[type="number"], input[type="date"], textarea'; $(document) .on('focusin', selector, function (e) { $(e.target).parent().addClass('focused'); }) .on('focusout', selector, function (e) { $(e.target).parent().removeClass('focused'); }); $(document) .on('focusin', 'input.hasDatepicker', function (e) { $(e.target).closest('.input-placeholder').addClass('focused'); }) .on('focusout', 'input.hasDatepicker', function (e) { $(e.target).closest('.input-placeholder').removeClass('focused'); }); } var eventDispacher = function (eventFunc, message, callback) { setTimeout(function () { let event = new CustomEvent(eventFunc, { detail: message }); document.dispatchEvent(event); if (callback) callback(event.detail); }, 0); } var getMultiSignerList = function (_sessionId, _esignId, callback) { try { $.ajax({ cache: false, async: true, type: "POST", url: 'Handlers/GetMultiSigners.ashx?sid=' + _sessionId, data: { sessionId: _sessionId, esignId: _esignId, direction: m_sessionData.direction }, dataType: "json", success: function (response) { if (response != null && response.signers != null && response.signers.length > 0) { response.signers.forEach(function (item) { if (item.phoneNumber != null) { item.customerContact = item.phoneNumber; } else if (item.email != null) { item.customerContact = item.email; } else if (item.customerId != '') { item.customerContact = item.customerId; } }); } if (callback) callback({ response: response }); }, error: function (textStatus, errorThrown) { if (callback) callback({ response: false }); } }); } catch (ex) { if (callback) callback({ response: false, message: ex }); } } var validatImageUrl = function (url, callback) { var image = new Image(); image.src = url; image.onload = function () { callback(true); } image.onerror = function () { callback(false); } } var getInitials = function (fullName) { try { let names = fullName.split(' '), initials = names[0].substring(0, 1).toUpperCase(); if (names.length > 1) { initials += names[names.length - 1].substring(0, 1).toUpperCase(); } return initials; } catch (ex) { return fullName; } } var escapeURL = function (input) { if (input != '') { var regex = /LINK#[^#]+#/g; var found = input.match(regex); if (found && found.length > 0) { found.forEach(function (element) { let link = '{1}'; let split = element.replace('LINK#', '').replace('#', '').split(';'); let url = split[0]; let name = split.length == 2 ? split[1] : url; link = String.format(link, url, name); input = input.replace(element, link); }); } } return input; } var loadBlueimpSingleImage = function (pdfDoc, fileIndex) { pdfDoc.getPage(fileIndex).then(function (page) { const slideIndex = fileIndex - 1; var viewport = page.getViewport(2.0); var canvas = document.createElement('canvas'); var context = canvas.getContext('2d'); canvas.height = viewport.height; canvas.width = viewport.width; var renderContext = { canvasContext: context, viewport: viewport }; var task = page.render(renderContext); var completeCallback = task._internalRenderTask.callback; task._internalRenderTask.callback = function (error) { completeCallback.call(this, error); imagesToUpload.push({ fileIndex: fileIndex, fileData: canvas.toDataURL() }); var slide = $('.slides .slide[data-index=' + slideIndex + ']'); var ctx = canvas.getContext('2d'); var imgdata = ctx.getImageData(0, 0, canvas.width, canvas.height); $(slide).append(''); var _canvas = $(slide).find('canvas')[0]; var _ctx = _canvas.getContext('2d'); _ctx.putImageData(imgdata, 0, 0); var oCanvasObj = oCanvas.create({ canvas: _canvas, fps: 60 }); var image = oCanvasObj.display.image({ image: canvas.toDataURL(), width: canvas.width, height: canvas.height }); oCanvasObj.addChild(image); canvases.push({ index: slideIndex, canvas: oCanvasObj }); panzoomObj[slideIndex] = Panzoom($(slide).find('canvas')[0]); COMMON.functions.cubesLoader.hide(); }; }); } var adjustColor = function (color, percent) { var R = parseInt(color.substring(1, 3), 16); var G = parseInt(color.substring(3, 5), 16); var B = parseInt(color.substring(5, 7), 16); R = parseInt(R * (100 + percent) / 100); G = parseInt(G * (100 + percent) / 100); B = parseInt(B * (100 + percent) / 100); R = (R < 255) ? R : 255; G = (G < 255) ? G : 255; B = (B < 255) ? B : 255; var RR = ((R.toString(16).length == 1) ? "0" + R.toString(16) : R.toString(16)); var GG = ((G.toString(16).length == 1) ? "0" + G.toString(16) : G.toString(16)); var BB = ((B.toString(16).length == 1) ? "0" + B.toString(16) : B.toString(16)); return "#" + RR + GG + BB; } var hexToRgba = function (hex, opacity) { const r = parseInt(hex.slice(1, 3), 16); const g = parseInt(hex.slice(3, 5), 16); const b = parseInt(hex.slice(5, 7), 16); // return 'rgba(r, g, b, a)' return 'rgba(' + r + ', ' + g + ', ' + b + ' ,' + opacity / 100 +')'; } var getClipboardPromise = function () { return window.clipboardData ? getIEClipboard() : getDataFromClipboard(); function getIEClipboard() { const res = window.clipboardData.getData("Text"); return Promise.resolve(res); } function getDataFromClipboard() { //returns a promise return navigator.clipboard.readText(); } } var getFormatedUtcDate = function (originDate, dateFormat) { dateFormat = dateFormat.toUpperCase(); let formatParts = dateFormat.split(' '); if (formatParts.length >= 2) { formatParts[1] = formatParts.slice(1).join(' '); formatParts[1] = formatParts[1].toLowerCase().replace('tt', 'A'); dateFormat = formatParts[0] + ' ' + formatParts[1]; } const date = moment.utc(originDate).format(dateFormat); return date; }; var resetPanZoom = function resetPanZoom() { if (panzoomObj && panzoomObj[gallery.getIndex()]) panzoomObj[gallery.getIndex()].reset({ animate: false }); }; var appendToFileName = function (filename, string) { var dotIndex = filename.lastIndexOf("."); if (dotIndex == -1) return filename + string; else return filename.substring(0, dotIndex) + string + filename.substring(dotIndex); } return { createUUID: createUUID, getBrowserName: getBrowserName, spinner: spinner, cubesLoader: cubesLoader, loadScript: loadScript, togglePanel: togglePanel, getImageOrientation: getImageOrientation, showFile: showFile, showFiles: showFiles, initPlaceholderFocus: initPlaceholderFocus, eventDispacher: eventDispacher, validatImageUrl: validatImageUrl, getMultiSignerList: getMultiSignerList, getInitials: getInitials, escapeURL: escapeURL, loadBlueimpSingleImage: loadBlueimpSingleImage, adjustColor: adjustColor, hexToRgba: hexToRgba, getClipboardPromise: getClipboardPromise, getFormatedUtcDate: getFormatedUtcDate, resetPanZoom: resetPanZoom, appendToFileName: appendToFileName } })(); COMMON.validate = (function () { var email = function (emailAddress) { const regex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return regex.test(String(emailAddress).toLowerCase()); } var phone = function (phoneNumber) { const regex = /(^[+]{0,1}\d*|\d*)/g; return phoneNumber.match(regex); } var imageUrl = function (url, callback) { var image = new Image(); image.src = url; image.onload = function () { callback(true); } image.onerror = function () { callback(false); } } return { email: email, phone: phone, imageUrl: imageUrl }; })(); COMMON.public = (function () { var fader = { template: '