{"version":3,"sources":["public/src/modules/pictureCropper.js"],"names":["define","Cropper","module","show","data","callback","fileSize","hasOwnProperty","undefined","parseInt","app","parseAndTranslate","showHelp","title","description","button","accept","replace","uploadModal","modal","on","remove","uploadForm","find","route","attr","$","this","addClass","onSubmit","handleImageCrop","url","utils","escapeHTML","cropperModal","backdrop","cropBoxHeight","window","height","img","document","getElementById","css","cropperTool","aspectRatio","autoCropArea","viewMode","checkCrossOrigin","cropmove","restrictImageDimension","cropBoxData","width","imageDimension","setCropBoxData","ready","checkCORS","origDimension","dimension","degrees","getAttribute","rotate","option","method","scaleX","scaleY","setAttribute","reset","imageData","removeClass","socketData","paramName","paramValue","socket","emit","socketMethod","err","hide","alertError","message","destroy","trigger","imageType","getCroppedCanvas","toDataURL","corsErrors","indexOf","showAlert","type","translateText","fileInput","val","file","files","size","name","endsWith","require","uploader","ajaxSubmit","reader","FileReader","addEventListener","imageUrl","result","allowSkippingCrop","readAsDataURL"],"mappings":"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","file":"public/src/modules/pictureCropper.js","sourcesContent":["'use strict';\n\ndefine('pictureCropper', ['cropper'], function (Cropper) {\n\tvar module = {};\n\n\tmodule.show = function (data, callback) {\n\t\tvar fileSize = data.hasOwnProperty('fileSize') && data.fileSize !== undefined ? parseInt(data.fileSize, 10) : false;\n\t\tapp.parseAndTranslate('partials/modals/upload_file_modal', {\n\t\t\tshowHelp: data.hasOwnProperty('showHelp') && data.showHelp !== undefined ? data.showHelp : true,\n\t\t\tfileSize: fileSize,\n\t\t\ttitle: data.title || '[[global:upload_file]]',\n\t\t\tdescription: data.description || '',\n\t\t\tbutton: data.button || '[[global:upload]]',\n\t\t\taccept: data.accept ? data.accept.replace(/,/g, ', ') : '',\n\t\t}, function (uploadModal) {\n\t\t\tuploadModal.modal('show');\n\t\t\tuploadModal.on('hidden.bs.modal', function () {\n\t\t\t\tuploadModal.remove();\n\t\t\t});\n\n\t\t\tvar uploadForm = uploadModal.find('#uploadForm');\n\t\t\tif (data.route) {\n\t\t\t\tuploadForm.attr('action', data.route);\n\t\t\t}\n\n\t\t\tuploadModal.find('#fileUploadSubmitBtn').on('click', function () {\n\t\t\t\t$(this).addClass('disabled');\n\t\t\t\tdata.uploadModal = uploadModal;\n\t\t\t\tonSubmit(data, callback);\n\t\t\t\treturn false;\n\t\t\t});\n\t\t});\n\t};\n\n\tmodule.handleImageCrop = function (data, callback) {\n\t\t$('#crop-picture-modal').remove();\n\t\tapp.parseAndTranslate('modals/crop_picture', {\n\t\t\turl: utils.escapeHTML(data.url),\n\t\t}, function (cropperModal) {\n\t\t\tcropperModal.modal({\n\t\t\t\tbackdrop: 'static',\n\t\t\t}).modal('show');\n\n\t\t\t// Set cropper image max-height based on viewport\n\t\t\tvar cropBoxHeight = parseInt($(window).height() / 2, 10);\n\t\t\tvar img = document.getElementById('cropped-image');\n\t\t\t$(img).css('max-height', cropBoxHeight);\n\n\t\t\tvar cropperTool = new Cropper(img, {\n\t\t\t\taspectRatio: data.aspectRatio,\n\t\t\t\tautoCropArea: 1,\n\t\t\t\tviewMode: 1,\n\t\t\t\tcheckCrossOrigin: true,\n\t\t\t\tcropmove: function () {\n\t\t\t\t\tif (data.restrictImageDimension) {\n\t\t\t\t\t\tif (cropperTool.cropBoxData.width > data.imageDimension) {\n\t\t\t\t\t\t\tcropperTool.setCropBoxData({\n\t\t\t\t\t\t\t\twidth: data.imageDimension,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (cropperTool.cropBoxData.height > data.imageDimension) {\n\t\t\t\t\t\t\tcropperTool.setCropBoxData({\n\t\t\t\t\t\t\t\theight: data.imageDimension,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tready: function () {\n\t\t\t\t\tif (!checkCORS(cropperTool, data)) {\n\t\t\t\t\t\treturn cropperModal.modal('hide');\n\t\t\t\t\t}\n\n\t\t\t\t\tif (data.restrictImageDimension) {\n\t\t\t\t\t\tvar origDimension = (img.width < img.height) ? img.width : img.height;\n\t\t\t\t\t\tvar dimension = (origDimension > data.imageDimension) ? data.imageDimension : origDimension;\n\t\t\t\t\t\tcropperTool.setCropBoxData({\n\t\t\t\t\t\t\twidth: dimension,\n\t\t\t\t\t\t\theight: dimension,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tcropperModal.find('.rotate').on('click', function () {\n\t\t\t\t\t\tvar degrees = this.getAttribute('data-degrees');\n\t\t\t\t\t\tcropperTool.rotate(degrees);\n\t\t\t\t\t});\n\n\t\t\t\t\tcropperModal.find('.flip').on('click', function () {\n\t\t\t\t\t\tvar option = this.getAttribute('data-option');\n\t\t\t\t\t\tvar method = this.getAttribute('data-method');\n\t\t\t\t\t\tif (method === 'scaleX') {\n\t\t\t\t\t\t\tcropperTool.scaleX(option);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcropperTool.scaleY(option);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.setAttribute('data-option', option * -1);\n\t\t\t\t\t});\n\n\t\t\t\t\tcropperModal.find('.reset').on('click', function () {\n\t\t\t\t\t\tcropperTool.reset();\n\t\t\t\t\t});\n\n\t\t\t\t\tcropperModal.find('.crop-btn').on('click', function () {\n\t\t\t\t\t\t$(this).addClass('disabled');\n\t\t\t\t\t\tvar imageData = checkCORS(cropperTool, data);\n\t\t\t\t\t\tif (!imageData) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcropperModal.find('#upload-progress-bar').css('width', '100%');\n\t\t\t\t\t\tcropperModal.find('#upload-progress-box').show().removeClass('hide');\n\n\t\t\t\t\t\tvar socketData = {};\n\t\t\t\t\t\tsocketData[data.paramName] = data.paramValue;\n\t\t\t\t\t\tsocketData.imageData = imageData;\n\n\t\t\t\t\t\tsocket.emit(data.socketMethod, socketData, function (err, imageData) {\n\t\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\t\tcropperModal.find('#upload-progress-box').hide();\n\t\t\t\t\t\t\t\tcropperModal.find('.upload-btn').removeClass('disabled');\n\t\t\t\t\t\t\t\tcropperModal.find('.crop-btn').removeClass('disabled');\n\t\t\t\t\t\t\t\treturn app.alertError(err.message);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcallback(imageData.url);\n\t\t\t\t\t\t\tcropperModal.modal('hide');\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\n\t\t\t\t\tcropperModal.find('.upload-btn').on('click', function () {\n\t\t\t\t\t\t$(this).addClass('disabled');\n\t\t\t\t\t\tcropperTool.destroy();\n\n\t\t\t\t\t\tcropperTool = new Cropper(img, {\n\t\t\t\t\t\t\tviewMode: 1,\n\t\t\t\t\t\t\tautoCropArea: 1,\n\t\t\t\t\t\t\tready: function () {\n\t\t\t\t\t\t\t\tcropperModal.find('.crop-btn').trigger('click');\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\t\t});\n\t};\n\n\tfunction checkCORS(cropperTool, data) {\n\t\tvar imageData;\n\t\ttry {\n\t\t\timageData = data.imageType ? cropperTool.getCroppedCanvas().toDataURL(data.imageType) : cropperTool.getCroppedCanvas().toDataURL();\n\t\t} catch (err) {\n\t\t\tvar corsErrors = [\n\t\t\t\t'The operation is insecure.',\n\t\t\t\t'Failed to execute \\'toDataURL\\' on \\'HTMLCanvasElement\\': Tainted canvases may not be exported.',\n\t\t\t];\n\t\t\tif (corsErrors.indexOf(err.message) !== -1) {\n\t\t\t\tapp.alertError('[[error:cors-error]]');\n\t\t\t} else {\n\t\t\t\tapp.alertError(err.message);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\treturn imageData;\n\t}\n\n\tfunction onSubmit(data, callback) {\n\t\tfunction showAlert(type, message) {\n\t\t\tif (type === 'error') {\n\t\t\t\tdata.uploadModal.find('#fileUploadSubmitBtn').removeClass('disabled');\n\t\t\t}\n\t\t\tdata.uploadModal.find('#alert-' + type).translateText(message).removeClass('hide');\n\t\t}\n\t\tvar fileInput = data.uploadModal.find('#fileInput');\n\t\tif (!fileInput.val()) {\n\t\t\treturn showAlert('error', '[[uploads:select-file-to-upload]]');\n\t\t}\n\n\t\tvar file = fileInput[0].files[0];\n\t\tvar fileSize = data.hasOwnProperty('fileSize') && data.fileSize !== undefined ? parseInt(data.fileSize, 10) : false;\n\t\tif (fileSize && file.size > fileSize * 1024) {\n\t\t\treturn app.alertError('[[error:file-too-big, ' + fileSize + ']]');\n\t\t}\n\n\t\tif (file.name.endsWith('.gif')) {\n\t\t\trequire(['uploader'], function (uploader) {\n\t\t\t\tuploader.ajaxSubmit(data.uploadModal, callback);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tvar reader = new FileReader();\n\t\treader.addEventListener('load', function () {\n\t\t\tvar imageUrl = reader.result;\n\n\t\t\tdata.uploadModal.modal('hide');\n\n\t\t\tmodule.handleImageCrop({\n\t\t\t\turl: imageUrl,\n\t\t\t\timageType: file.type,\n\t\t\t\tsocketMethod: data.socketMethod,\n\t\t\t\taspectRatio: data.aspectRatio,\n\t\t\t\tallowSkippingCrop: data.allowSkippingCrop,\n\t\t\t\trestrictImageDimension: data.restrictImageDimension,\n\t\t\t\timageDimension: data.imageDimension,\n\t\t\t\tparamName: data.paramName,\n\t\t\t\tparamValue: data.paramValue,\n\t\t\t}, callback);\n\t\t}, false);\n\n\t\tif (file) {\n\t\t\treader.readAsDataURL(file);\n\t\t}\n\t}\n\n\treturn module;\n});\n"]}