UNPKG

filepicker-js

Version:
1,352 lines (1,329 loc) 150 kB
"use strict"; (function() { var fp = function() { var context = {}; var addObjectTo = function(name, obj, base) { var path = name.split("."); for (var i = 0; i < path.length - 1; i++) { if (!base[path[i]]) { base[path[i]] = {}; } base = base[path[i]]; } if (typeof obj === "function") { if (obj.isClass) { base[path[i]] = obj; } else { base[path[i]] = function() { return obj.apply(context, arguments); }; } } else { base[path[i]] = obj; } }; var extendObject = function(name, obj, is_public) { addObjectTo(name, obj, context); if (is_public) { addObjectTo(name, obj, window.filepicker); } }; var extend = function(pkg, init_fn, is_public) { if (typeof pkg === "function") { is_public = init_fn; init_fn = pkg; pkg = ""; } if (pkg) { pkg += "."; } var objs = init_fn.call(context); for (var obj_name in objs) { extendObject(pkg + obj_name, objs[obj_name], is_public); } }; var internal = function(fn) { fn.apply(context, arguments); }; return { extend: extend, internal: internal }; }(); if (!window.filepicker) { window.filepicker = fp; } else { for (var attr in fp) { window.filepicker[attr] = fp[attr]; } } })(); "use strict"; filepicker.extend("comm", function() { var fp = this; var COMM_IFRAME_NAME = "filepicker_comm_iframe"; var API_IFRAME_NAME = "fpapi_comm_iframe"; var openCommIframe = function() { if (window.frames[COMM_IFRAME_NAME] === undefined) { openCommunicationsChannel(); var commIFrame; commIFrame = document.createElement("iframe"); commIFrame.id = commIFrame.name = COMM_IFRAME_NAME; commIFrame.src = fp.urls.COMM; commIFrame.style.display = "none"; document.body.appendChild(commIFrame); } if (window.frames[API_IFRAME_NAME] === undefined) { openCommunicationsChannel(); var apiIFrame; apiIFrame = document.createElement("iframe"); apiIFrame.id = apiIFrame.name = API_IFRAME_NAME; apiIFrame.src = fp.urls.API_COMM; apiIFrame.style.display = "none"; document.body.appendChild(apiIFrame); } }; var communicationsHandler = function(event) { if (event.origin !== fp.urls.BASE && event.origin !== fp.urls.DIALOG_BASE) { return; } try { var data = fp.json.parse(event.data); } catch (err) { console.log("[Filepicker] Failed processing message:", event.data); } if (data) { fp.handlers.run(data); } }; var isOpen = false; var openCommunicationsChannel = function() { if (isOpen) { return; } else { isOpen = true; } if (window.addEventListener) { window.addEventListener("message", communicationsHandler, false); } else if (window.attachEvent) { window.attachEvent("onmessage", communicationsHandler); } else { throw new fp.FilepickerException("Unsupported browser"); } }; var destroyCommIframe = function() { if (window.removeEventListener) { window.removeEventListener("message", communicationsHandler, false); } else if (window.attachEvent) { window.detachEvent("onmessage", communicationsHandler); } else { throw new fp.FilepickerException("Unsupported browser"); } if (!isOpen) { return; } else { isOpen = false; } var iframes = document.getElementsByName(COMM_IFRAME_NAME); for (var i = 0; i < iframes.length; i++) { iframes[i].parentNode.removeChild(iframes[i]); } try { delete window.frames[COMM_IFRAME_NAME]; } catch (e) {} var api_iframes = document.getElementsByName(API_IFRAME_NAME); for (var j = 0; j < api_iframes.length; j++) { api_iframes[j].parentNode.removeChild(api_iframes[j]); } try { delete window.frames[API_IFRAME_NAME]; } catch (e) {} }; return { openChannel: openCommIframe, closeChannel: destroyCommIframe }; }); "use strict"; filepicker.extend("comm_fallback", function() { var fp = this; var FP_COMM_IFRAME_NAME = "filepicker_comm_iframe"; var HOST_COMM_IFRAME_NAME = "host_comm_iframe"; var base_host_location = ""; var hash_check_interval = 200; var openCommIframe = function() { openHostCommIframe(); }; var openHostCommIframe = function() { if (window.frames[HOST_COMM_IFRAME_NAME] === undefined) { var hostCommIFrame; hostCommIFrame = document.createElement("iframe"); hostCommIFrame.id = hostCommIFrame.name = HOST_COMM_IFRAME_NAME; base_host_location = hostCommIFrame.src = fp.urls.constructHostCommFallback(); hostCommIFrame.style.display = "none"; var onload = function() { base_host_location = hostCommIFrame.contentWindow.location.href; openFPCommIframe(); }; if (hostCommIFrame.attachEvent) { hostCommIFrame.attachEvent("onload", onload); } else { hostCommIFrame.onload = onload; } document.body.appendChild(hostCommIFrame); } }; var openFPCommIframe = function() { if (window.frames[FP_COMM_IFRAME_NAME] === undefined) { var fpCommIFrame; fpCommIFrame = document.createElement("iframe"); fpCommIFrame.id = fpCommIFrame.name = FP_COMM_IFRAME_NAME; fpCommIFrame.src = fp.urls.FP_COMM_FALLBACK + "?host_url=" + encodeURIComponent(base_host_location); fpCommIFrame.style.display = "none"; document.body.appendChild(fpCommIFrame); } openCommunicationsChannel(); }; var isOpen = false; var timer; var lastHash = ""; var checkHash = function() { var comm_iframe = window.frames[FP_COMM_IFRAME_NAME]; if (!comm_iframe) { return; } var host_iframe = comm_iframe.frames[HOST_COMM_IFRAME_NAME]; if (!host_iframe) { return; } var hash = host_iframe.location.hash; if (hash && hash.charAt(0) === "#") { hash = hash.substr(1); } if (hash === lastHash) { return; } lastHash = hash; if (!lastHash) { return; } var data; try { data = fp.json.parse(hash); } catch (e) {} if (data) { fp.handlers.run(data); } }; var openCommunicationsChannel = function() { if (isOpen) { return; } else { isOpen = true; } timer = window.setInterval(checkHash, hash_check_interval); }; var destroyCommIframe = function() { window.clearInterval(timer); if (!isOpen) { return; } else { isOpen = false; } var iframes = document.getElementsByName(FP_COMM_IFRAME_NAME); for (var i = 0; i < iframes.length; i++) { iframes[i].parentNode.removeChild(iframes[i]); } try { delete window.frames[FP_COMM_IFRAME_NAME]; } catch (e) {} iframes = document.getElementsByName(HOST_COMM_IFRAME_NAME); for (i = 0; i < iframes.length; i++) { iframes[i].parentNode.removeChild(iframes[i]); } try { delete window.frames[HOST_COMM_IFRAME_NAME]; } catch (e) {} }; var isEnabled = !("postMessage" in window); var setEnabled = function(enabled) { if (enabled !== isEnabled) { isEnabled = !!enabled; if (isEnabled) { activate(); } else { deactivate(); } } }; var old_comm; var activate = function() { old_comm = fp.comm; fp.comm = { openChannel: openCommIframe, closeChannel: destroyCommIframe }; }; var deactivate = function() { fp.comm = old_comm; old_comm = undefined; }; if (isEnabled) { activate(); } return { openChannel: openCommIframe, closeChannel: destroyCommIframe, isEnabled: isEnabled }; }); "use strict"; filepicker.extend("cookies", function() { var fp = this; var getReceiveCookiesMessage = function(callback) { var handler = function(data) { if (data.type !== "ThirdPartyCookies") { return; } fp.cookies.THIRD_PARTY_COOKIES = !!data.payload; if (callback && typeof callback === "function") { callback(!!data.payload); } }; return handler; }; var checkThirdParty = function(callback) { var handler = getReceiveCookiesMessage(callback); fp.handlers.attach("cookies", handler); fp.comm.openChannel(); }; return { checkThirdParty: checkThirdParty }; }); "use strict"; filepicker.extend("handlers", function() { var fp = this; var storage = {}; var attachHandler = function(id, handler) { if (storage.hasOwnProperty(id)) { storage[id].push(handler); } else { storage[id] = [ handler ]; } return handler; }; var detachHandler = function(id, fn) { var handlers = storage[id]; if (!handlers) { return; } if (fn) { for (var i = 0; i < handlers.length; i++) { if (handlers[i] === fn) { handlers.splice(i, 1); break; } } if (handlers.length === 0) { delete storage[id]; } } else { delete storage[id]; } }; var run = function(data) { if (data == null || data.id == null) { return false; } var callerId = data.id; if (storage.hasOwnProperty(callerId)) { var handlers = storage[callerId]; for (var i = 0; i < handlers.length; i++) { handlers[i](data); } return true; } return false; }; return { attach: attachHandler, detach: detachHandler, run: run }; }); "use strict"; filepicker.extend("exporter", function() { var fp = this; var normalizeOptions = function(options) { var normalize = function(singular, plural, def) { if (options[plural] && !fp.util.isArray(options[plural])) { options[plural] = [ options[plural] ]; } else if (options[singular]) { options[plural] = [ options[singular] ]; } else if (def) { options[plural] = def; } }; if (options.mimetype && options.extension) { throw fp.FilepickerException("Error: Cannot pass in both mimetype and extension parameters to the export function"); } normalize("service", "services"); if (options.services) { for (var i = 0; i < options.services.length; i++) { var service = ("" + options.services[i]).replace(" ", ""); var sid = fp.services[service]; options.services[i] = sid === undefined ? service : sid; } } if (options.openTo) { options.openTo = fp.services[options.openTo] || options.openTo; } fp.util.setDefault(options, "container", fp.browser.openInModal() ? "modal" : "window"); }; var getExportHandler = function(onSuccess, onError) { var handler = function(data) { if (data.type !== "filepickerUrl") { return; } if (data.error) { fp.util.console.error(data.error); onError(fp.errors.FPError(132)); } else { var fpfile = {}; fpfile.url = data.payload.url; fpfile.filename = data.payload.data.filename; fpfile.mimetype = data.payload.data.type; fpfile.size = data.payload.data.size; fpfile.client = data.payload.data.client; fpfile.isWriteable = true; onSuccess(fpfile); } fp.modal.close(); }; return handler; }; var createExporter = function(input, options, onSuccess, onError) { normalizeOptions(options); var api = { close: function() { fp.modal.close(); } }; if (options.debug) { setTimeout(function() { onSuccess({ id: 1, url: "https://www.filepicker.io/api/file/-nBq2onTSemLBxlcBWn1", filename: "test.png", mimetype: "image/png", size: 58979, client: "computer" }); }, 1); return api; } if (fp.cookies.THIRD_PARTY_COOKIES === undefined) { var alreadyHandled = false; fp.cookies.checkThirdParty(function() { if (!alreadyHandled) { createExporter(input, options, onSuccess, onError); alreadyHandled = true; } }); return api; } var id = fp.util.getId(); var finished = false; var onSuccessMark = function(fpfile) { finished = true; onSuccess(fpfile); }; var onErrorMark = function(fperror) { finished = true; onError(fperror); }; var onClose = function() { if (!finished) { finished = true; onError(fp.errors.FPError(131)); } }; fp.window.open(options.container, fp.urls.constructExportUrl(input, options, id), onClose); fp.handlers.attach(id, getExportHandler(onSuccessMark, onErrorMark)); return api; }; return { createExporter: createExporter }; }); "use strict"; filepicker.extend("modal", function() { var fp = this, SHADE_NAME = "filepicker_shade", WINDOW_CONTAINER_NAME = "filepicker_dialog_container"; var originalBody = getHtmlTag(); if (originalBody) { var originalOverflow = originalBody.style.overflow; } var generateModal = function(modalUrl, onClose) { appendStyle(); var shade = createModalShade(onClose), container = createModalContainer(), close = createModalClose(onClose), modal = document.createElement("iframe"); modal.name = fp.window.WINDOW_NAME; modal.id = fp.window.WINDOW_NAME; modal.style.width = "100%"; modal.style.height = "100%"; modal.style.border = "none"; modal.style.position = "relative"; modal.setAttribute("border", 0); modal.setAttribute("frameborder", 0); modal.setAttribute("frameBorder", 0); modal.setAttribute("marginwidth", 0); modal.setAttribute("marginheight", 0); modal.src = modalUrl; container.appendChild(modal); shade.appendChild(close); shade.appendChild(container); document.body.appendChild(shade); var body = getHtmlTag(); if (body) { body.style.overflow = "hidden"; } return modal; }; var createModalShade = function(onClose) { var shade = document.createElement("div"); shade.id = SHADE_NAME; shade.className = "fp__overlay"; shade.onclick = getCloseModal(onClose); return shade; }; var createModalContainer = function() { var modalcontainer = document.createElement("div"); modalcontainer.id = WINDOW_CONTAINER_NAME; modalcontainer.className = "fp__container"; return modalcontainer; }; var createModalClose = function(onClose) { var close = document.createElement("div"); close.className = "fp__close"; var closeAnchor = document.createElement("a"); closeAnchor.appendChild(document.createTextNode("X")); close.appendChild(closeAnchor); closeAnchor.onclick = getCloseModal(onClose); document.onkeydown = function(evt) { evt = evt || window.event; if (evt.keyCode === 27) { getCloseModal(onClose)(); } }; return close; }; var getCloseModal = function(onClose, force) { force = !!force; return function() { if (fp.uploading && !force) { if (!window.confirm('You are currently uploading. If you choose "OK", the window will close and your upload will not finish. Do you want to stop uploading and close the window?')) { return; } } fp.uploading = false; document.onkeydown = null; setOriginalOverflow(); var shade = document.getElementById(SHADE_NAME); if (shade) { document.body.removeChild(shade); } var container = document.getElementById(WINDOW_CONTAINER_NAME); if (container) { document.body.removeChild(container); } try { delete window.frames[fp.window.WINDOW_NAME]; } catch (e) {} if (onClose) { onClose(); } }; }; function hide() { var shade = document.getElementById(SHADE_NAME); if (shade) { shade.hidden = true; } var container = document.getElementById(WINDOW_CONTAINER_NAME); if (container) { container.hidden = true; } setOriginalOverflow(); } function setOriginalOverflow() { var body = getHtmlTag(); if (body) { body.style.overflow = originalOverflow; } } function appendStyle() { var css = ".fp__overlay {top: 0;right: 0;bottom: 0;left: 0;z-index: 1000;background: rgba(0, 0, 0, 0.8);}" + ".fp__close {top: 104px; right: 108px; width: 35px; height: 35px; z-index: 20; cursor: pointer}" + "@media screen and (max-width: 768px), screen and (max-height: 500px) {.fp__close {top: 15px; right: 12px;}}" + ".fp__close a {text-indent: -9999px; overflow: hidden; display: block; width: 100%; height: 100%; background: url(https://d1zyh3sbxittvg.cloudfront.net/close.png) 50% 50% no-repeat;}" + ".fp__close a:hover {background-color: rgba(0,0,0, .02); opacity: .8;}" + "@media screen and (max-width: 768px), screen and (max-height: 500px) {top: 14px; right: 14px;}" + ".fp__copy {display: none;}" + ".fp__container {-webkit-overflow-scrolling: touch; overflow: hidden; min-height: 300px; top: 100px;right: 100px;bottom: 100px;left: 100px;background: #eee; box-sizing:content-box; -webkit-box-sizing:content-box; -moz-box-sizing:content-box;}" + "@media screen and (max-width: 768px), screen and (max-height: 500px) {.fp__copy {bottom: 0; left: 0; right: 0; height: 20px; background: #333;}}" + "@media screen and (max-width: 768px), screen and (max-height: 500px) {.fp__copy a {margin-left: 5px;}}" + "@media screen and (max-width: 768px), screen and (max-height: 500px) {.fp__container {top: 0;right: 0;bottom: 0;left: 0;}}" + ".fp__overlay, .fp__close, .fp__copy, .fp__container {position: fixed;}"; var head = document.head || document.getElementsByTagName("head")[0], style = document.createElement("style"); style.type = "text/css"; if (style.styleSheet) { style.styleSheet.cssText = css; } else { style.appendChild(document.createTextNode(css)); } head.appendChild(style); } function getHtmlTag() { try { return document.getElementsByTagName("html")[0]; } catch (err) { return null; } } var closeModal = getCloseModal(function() {}); return { generate: generateModal, close: closeModal, hide: hide }; }); "use strict"; filepicker.extend("picker", function() { var fp = this; var normalizeOptions = function(options) { var normalize = function(singular, plural, def) { if (options[plural]) { if (!fp.util.isArray(options[plural])) { options[plural] = [ options[plural] ]; } } else if (options[singular]) { options[plural] = [ options[singular] ]; } else if (def) { options[plural] = def; } }; normalize("service", "services"); normalize("mimetype", "mimetypes"); normalize("extension", "extensions"); if (options.services) { for (var i = 0; i < options.services.length; i++) { var service = ("" + options.services[i]).replace(" ", ""); if (fp.services[service] !== undefined) { service = fp.services[service]; } options.services[i] = service; } } if (options.mimetypes && options.extensions) { throw fp.FilepickerException("Error: Cannot pass in both mimetype and extension parameters to the pick function"); } if (!options.mimetypes && !options.extensions) { options.mimetypes = [ "*/*" ]; } if (options.openTo) { options.openTo = fp.services[options.openTo] || options.openTo; } fp.util.setDefault(options, "container", fp.browser.openInModal() ? "modal" : "window"); }; var getPickHandler = function(onSuccess, onError, onProgress) { var handler = function(data) { if (filterDataType(data, onProgress)) { return; } fp.uploading = false; if (data.error) { fp.util.console.error(data.error); if (data.error.code) { onError(fp.errors.FPError(data.error.code)); } else { onError(fp.errors.FPError(102)); fp.modal.close(); } } else { var fpfile = fpfileFromPayload(data.payload); onSuccess(fpfile); fp.modal.close(); } }; return handler; }; var getPickFolderHandler = function(onSuccess, onError, onProgress) { var handler = function(data) { if (filterDataType(data, onProgress)) { return; } fp.uploading = false; if (data.error) { fp.util.console.error(data.error); onError(fp.errors.FPError(102)); } else { data.payload.data.url = data.payload.url; onSuccess(data.payload.data); } fp.modal.close(); }; return handler; }; var getUploadingHandler = function(onUploading) { onUploading = onUploading || function() {}; var handler = function(data) { if (data.type !== "uploading") { return; } fp.uploading = !!data.payload; onUploading(fp.uploading); }; return handler; }; var addIfExist = function(data, fpfile, key) { if (data[key]) { fpfile[key] = data[key]; } }; var fpfileFromPayload = function(payload) { var fpfile = {}; var url = payload.url; if (url && url.url) { url = url.url; } fpfile.url = url; var data = payload.url.data || payload.data; fpfile.filename = data.filename; fpfile.mimetype = data.type; fpfile.size = data.size; if (data.cropped !== undefined) { fpfile.cropped = data.cropped; } if (data.rotated !== undefined) { fpfile.rotated = data.rotated; } if (data.converted !== undefined) { fpfile.converted = data.converted; } addIfExist(data, fpfile, "id"); addIfExist(data, fpfile, "key"); addIfExist(data, fpfile, "container"); addIfExist(data, fpfile, "path"); addIfExist(data, fpfile, "client"); fpfile.isWriteable = true; return fpfile; }; var getPickMultipleHandler = function(onSuccess, onError, onProgress) { var handler = function(data) { if (filterDataType(data, onProgress)) { return; } fp.uploading = false; if (data.error) { fp.util.console.error(data.error); onError(fp.errors.FPError(102)); } else { var fpfiles = []; if (!fp.util.isArray(data.payload)) { data.payload = [ data.payload ]; } for (var i = 0; i < data.payload.length; i++) { var fpfile = fpfileFromPayload(data.payload[i]); fpfiles.push(fpfile); } onSuccess(fpfiles); } fp.modal.close(); }; return handler; }; var createPicker = function(options, onSuccess, onError, multiple, folder, onProgress, convertFile) { normalizeOptions(options); var api = { close: function() { fp.modal.close(); } }; if (options.debug) { var dumy_data = { id: 1, url: "https://www.filepicker.io/api/file/-nBq2onTSemLBxlcBWn1", filename: "test.png", mimetype: "image/png", size: 58979, client: "computer" }; var dumy_callback; if (multiple || options.storeLocation) { dumy_callback = [ dumy_data, dumy_data, dumy_data ]; } else { dumy_callback = dumy_data; } setTimeout(function() { onSuccess(dumy_callback); }, 1); return api; } if (fp.cookies.THIRD_PARTY_COOKIES === undefined) { var alreadyHandled = false; fp.cookies.checkThirdParty(function() { if (!alreadyHandled) { createPicker(options, onSuccess, onError, !!multiple, folder, onProgress); alreadyHandled = true; } }); return api; } var id = fp.util.getId(); var finished = false; var onSuccessMark = function(fpfile) { if (options.container === "window") { window.onbeforeunload = null; } finished = true; onSuccess(fpfile); }; var onErrorMark = function(fperror) { finished = true; onError(fperror); }; var onClose = function() { if (!finished) { finished = true; onError(fp.errors.FPError(101)); } }; var url; var handler; if (convertFile) { url = fp.urls.constructConvertUrl(options, id); handler = getPickHandler(onSuccessMark, onErrorMark, onProgress); } else if (multiple) { url = fp.urls.constructPickUrl(options, id, true); handler = getPickMultipleHandler(onSuccessMark, onErrorMark, onProgress); } else if (folder) { url = fp.urls.constructPickFolderUrl(options, id); handler = getPickFolderHandler(onSuccessMark, onErrorMark, onProgress); } else { url = fp.urls.constructPickUrl(options, id, false); handler = getPickHandler(onSuccessMark, onErrorMark, onProgress); } fp.window.open(options.container, url, onClose); fp.handlers.attach(id, handler); var key = id + "-upload"; fp.handlers.attach(key, getUploadingHandler(function() { fp.handlers.detach(key); })); return api; }; function filterDataType(data, onProgress) { if (data.type === "filepickerProgress") { fp.uploading = true; if (onProgress) { onProgress(data.payload.data); } } else if (data.type === "notUploading") { fp.uploading = false; } else if (data.type === "closeModal") { fp.modal.close(); } else if (data.type === "hideModal") { fp.modal.hide(); } else if (data.type === "filepickerUrl" || data.type === "serverHttpError") { return false; } return true; } return { createPicker: createPicker }; }); "use strict"; filepicker.extend("window", function() { var fp = this; var DIALOG_TYPES = { OPEN: "/dialog/open/", SAVEAS: "/dialog/save/" }; var WINDOW_NAME = "filepicker_dialog"; var WINDOW_PROPERTIES = "left=100,top=100,height=600,width=800,menubar=no,toolbar=no,location=no,personalbar=no,status=no,resizable=yes,scrollbars=yes,dependent=yes,dialog=yes"; var CLOSE_CHECK_INTERVAL = 100; var openWindow = function(container, src, onClose) { onClose = onClose || function() {}; if (!container && fp.browser.openInModal()) { container = "modal"; } else if (!container) { container = "window"; } if (container === "window") { var name = WINDOW_NAME + fp.util.getId(); window.onbeforeunload = function confirmExit() { return "Filepicker upload does not complete."; }; var win = window.open(src, name, WINDOW_PROPERTIES); if (!win) { window.onbeforeunload = null; window.alert("Please disable your popup blocker to upload files."); } var closeCheck = window.setInterval(function() { if (!win || win.closed) { window.onbeforeunload = null; window.clearInterval(closeCheck); onClose(); } }, CLOSE_CHECK_INTERVAL); } else if (container === "modal") { fp.modal.generate(src, onClose); } else { var container_iframe = document.getElementById(container); if (!container_iframe) { throw new fp.FilepickerException('Container "' + container + '" not found. This should either be set to "window","modal", or the ID of an iframe that is currently in the document.'); } container_iframe.src = src; } }; return { open: openWindow, WINDOW_NAME: WINDOW_NAME }; }); "use strict"; filepicker.extend("conversions", function() { var fp = this; var valid_parameters = { align: "string", blurAmount: "number", crop: "string or array", crop_first: "boolean", compress: "boolean", exif: "string or boolean", filter: "string", fit: "string", format: "string", height: "number", policy: "string", quality: "number", page: "number", rotate: "string or number", secure: "boolean", sharpenAmount: "number", signature: "string", storeAccess: "string", storeContainer: "string", storeRegion: "string", storeLocation: "string", storePath: "string", text: "string", text_align: "string", text_color: "string", text_font: "string", text_padding: "number", text_size: "number", watermark: "string", watermark_position: "string", watermark_size: "number", width: "number" }; var rest_map = { w: "width", h: "height" }; var mapRestParams = function(options) { var obj = {}; for (var key in options) { obj[rest_map[key] || key] = options[key]; if (valid_parameters[rest_map[key] || key] === "number") { obj[rest_map[key] || key] = Number(options[key]); } } return obj; }; var checkParameters = function(options) { var found; for (var key in options) { found = false; for (var test in valid_parameters) { if (key === test) { found = true; if (valid_parameters[test].indexOf(fp.util.typeOf(options[key])) === -1) { throw new fp.FilepickerException("Conversion parameter " + key + " is not the right type: " + options[key] + ". Should be a " + valid_parameters[test]); } } } if (!found) { throw new fp.FilepickerException("Conversion parameter " + key + " is not a valid parameter."); } } }; var convert = function(fp_url, options, onSuccess, onError, onProgress) { checkParameters(options); if (options.crop && fp.util.isArray(options.crop)) { options.crop = options.crop.join(","); } fp.ajax.post(fp_url + "/convert", { data: options, json: true, success: function(fpfile) { onSuccess(fp.util.standardizeFPFile(fpfile)); }, error: function(msg, status, xhr) { if (msg === "not_found") { onError(new fp.errors.FPError(141)); } else if (msg === "bad_params") { onError(new fp.errors.FPError(142)); } else if (msg === "not_authorized") { onError(new fp.errors.FPError(403)); } else { onError(new fp.errors.FPError(143)); } }, progress: onProgress }); }; return { convert: convert, mapRestParams: mapRestParams }; }); "use strict"; filepicker.extend("errors", function() { var fp = this; var FPError = function(code) { if (this === window) { return new FPError(code); } this.code = code; if (filepicker.debug) { var info = filepicker.error_map[this.code]; this.message = info.message; this.moreInfo = info.moreInfo; this.toString = function() { return "FPError " + this.code + ": " + this.message + ". For help, see " + this.moreInfo; }; } else { this.toString = function() { return "FPError " + this.code + ". Include filepicker_debug.js for more info"; }; } return this; }; FPError.isClass = true; var handleError = function(fperror) { if (filepicker.debug) { fp.util.console.error(fperror.toString()); } }; return { FPError: FPError, handleError: handleError }; }, true); "use strict"; filepicker.extend(function() { var fp = this, VERSION = "2.4.18"; fp.API_VERSION = "v2"; var setKey = function(key) { fp.apikey = key; }; var FilepickerException = function(text) { this.text = text; this.toString = function() { return "FilepickerException: " + this.text; }; return this; }; FilepickerException.isClass = true; var pick = function(options, onSuccess, onError, onProgress) { fp.util.checkApiKey(); if (typeof options === "function") { onError = onSuccess; onSuccess = options; options = {}; } options = options || {}; onSuccess = onSuccess || function() {}; onError = onError || fp.errors.handleError; return fp.picker.createPicker(options, onSuccess, onError, false, false, onProgress); }; var pickMultiple = function(options, onSuccess, onError, onProgress) { fp.util.checkApiKey(); if (typeof options === "function") { onProgress = onError; onError = onSuccess; onSuccess = options; options = {}; } options = options || {}; onSuccess = onSuccess || function() {}; onError = onError || fp.errors.handleError; return fp.picker.createPicker(options, onSuccess, onError, true, false, onProgress); }; var pickAndStore = function(picker_options, store_options, onSuccess, onError, onProgress) { fp.util.checkApiKey(); if (!picker_options || !store_options || typeof picker_options === "function" || typeof picker_options === "function") { throw new fp.FilepickerException("Not all required parameters given, missing picker or store options"); } onError = onError || fp.errors.handleError; var multiple = !!picker_options.multiple; var options = !!picker_options ? fp.util.clone(picker_options) : {}; options.storeLocation = store_options.location || "S3"; options.storePath = store_options.path; options.storeContainer = store_options.storeContainer || store_options.container; options.storeRegion = store_options.storeRegion; options.storeAccess = store_options.access || "private"; if (multiple && options.storePath) { if (options.storePath.charAt(options.storePath.length - 1) !== "/") { throw new fp.FilepickerException("pickAndStore with multiple files requires a path that ends in " / ""); } } var success = onSuccess; if (!multiple) { success = function(resp) { onSuccess([ resp ]); }; } return fp.picker.createPicker(options, success, onError, multiple, false, onProgress); }; var pickFolder = function(options, onSuccess, onError, onProgress) { fp.util.checkApiKey(); if (typeof options === "function") { onError = onSuccess; onSuccess = options; options = {}; } options = options || {}; onSuccess = onSuccess || function() {}; onError = onError || fp.errors.handleError; return fp.picker.createPicker(options, onSuccess, onError, false, true, onProgress); }; var read = function(input, options, onSuccess, onError, onProgress) { fp.util.checkApiKey(); if (!input) { throw new fp.FilepickerException("No input given - nothing to read!"); } if (typeof options === "function") { onProgress = onError; onError = onSuccess; onSuccess = options; options = {}; } options = options || {}; onSuccess = onSuccess || function() {}; onError = onError || fp.errors.handleError; onProgress = onProgress || function() {}; if (typeof input === "string") { if (fp.util.isFPUrl(input)) { fp.files.readFromFPUrl(input, options, onSuccess, onError, onProgress); } else { fp.files.readFromUrl(input, options, onSuccess, onError, onProgress); } } else if (fp.util.isFileInputElement(input)) { if (!input.files) { storeThenRead(input, options, onSuccess, onError, onProgress); } else if (input.files.length === 0) { onError(new fp.errors.FPError(115)); } else { fp.files.readFromFile(input.files[0], options, onSuccess, onError, onProgress); } } else if (fp.util.isFile(input)) { fp.files.readFromFile(input, options, onSuccess, onError, onProgress); } else if (input.url) { fp.files.readFromFPUrl(input.url, options, onSuccess, onError, onProgress); } else { throw new fp.FilepickerException("Cannot read given input: " + input + ". Not a url, file input, DOM File, or FPFile object."); } }; var storeThenRead = function(input, readOptions, onSuccess, onError, onProgress) { onProgress(10); fp.store(input, function(fpfile) { onProgress(50); fp.read(fpfile, readOptions, onSuccess, onError, function(progress) { onProgress(50 + progress / 2); }); }, onError); }; var write = function(fpfile, input, options, onSuccess, onError, onProgress) { fp.util.checkApiKey(); if (!fpfile) { throw new fp.FilepickerException("No fpfile given - nothing to write to!"); } if (input === undefined || input === null) { throw new fp.FilepickerException("No input given - nothing to write!"); } if (typeof options === "function") { onProgress = onError; onError = onSuccess; onSuccess = options; options = {}; } options = options || {}; onSuccess = onSuccess || function() {}; onError = onError || fp.errors.handleError; onProgress = onProgress || function() {}; var fp_url; if (fp.util.isFPUrl(fp.util.getFPUrl(fpfile))) { fp_url = fpfile; } else if (fpfile.url) { fp_url = fpfile.url; } else { throw new fp.FilepickerException("Invalid file to write to: " + fpfile + ". Not a filepicker url or FPFile object."); } fp_url = fp.util.trimConvert(fp.util.getFPUrl(fp_url)); if (typeof input === "string") { fp.files.writeDataToFPUrl(fp_url, input, options, onSuccess, onError, onProgress); } else { if (fp.util.isFileInputElement(input)) { if (!input.files) { fp.files.writeFileInputToFPUrl(fp_url, input, options, onSuccess, onError, onProgress); } else if (input.files.length === 0) { onError(new fp.errors.FPError(115)); } else { fp.files.writeFileToFPUrl(fp_url, input.files[0], options, onSuccess, onError, onProgress); } } else if (fp.util.isFile(input)) { fp.files.writeFileToFPUrl(fp_url, input, options, onSuccess, onError, onProgress); } else if (input.url) { fp.files.writeUrlToFPUrl(fp_url, input.url, options, onSuccess, onError, onProgress); } else { throw new fp.FilepickerException("Cannot read from given input: " + input + ". Not a string, file input, DOM File, or FPFile object."); } } }; var writeUrl = function(fpfile, input, options, onSuccess, onError, onProgress) { fp.util.checkApiKey(); if (!fpfile) { throw new fp.FilepickerException("No fpfile given - nothing to write to!"); } if (input === undefined || input === null) { throw new fp.FilepickerException("No input given - nothing to write!"); } if (typeof options === "function") { onProgress = onError; onError = onSuccess; onSuccess = options; options = {}; } options = options || {}; onSuccess = onSuccess || function() {}; onError = onError || fp.errors.handleError; onProgress = onProgress || function() {}; var fp_url; if (fp.util.isFPUrl(fp.util.getFPUrl(fpfile))) { fp_url = fpfile; } else if (fpfile.url) { fp_url = fpfile.url; } else { throw new fp.FilepickerException("Invalid file to write to: " + fpfile + ". Not a filepicker url or FPFile object."); } fp_url = fp.util.getFPUrl(fp_url); fp.files.writeUrlToFPUrl(fp.util.trimConvert(fp_url), input, options, onSuccess, onError, onProgress); }; var exportFn = function(input, options, onSuccess, onError) { fp.util.checkApiKey(); if (typeof options === "function") { onError = onSuccess; onSuccess = options; options = {}; } options = !!options ? fp.util.clone(options) : {}; onSuccess = onSuccess || function() {}; onError = onError || fp.errors.handleError; var fp_url; if (typeof input === "string" && fp.util.isUrl(input)) { fp_url = input; } else if (input.url) { fp_url = input.url; if (!options.mimetype && !options.extension) { options.mimetype = input.mimetype; } if (!options.suggestedFilename) { options.suggestedFilename = input.filename; } } else { throw new fp.FilepickerException("Invalid file to export: " + input + ". Not a valid url or FPFile object. You may want to use filepicker.store() to get an FPFile to export"); } if (options.suggestedFilename) { options.suggestedFilename = encodeURI(options.suggestedFilename); } return fp.exporter.createExporter(fp_url, options, onSuccess, onError); }; var processImage = function(input, options, onSuccess, onError, onProgress) { var convertUrl; fp.util.checkApiKey(); if (typeof options === "function") { onError = onSuccess; onSuccess = options; options = {}; } options = options || {}; onSuccess = onSuccess || function() {}; onError = onError || fp.errors.handleError; if (typeof input === "string") { convertUrl = input; } else if (input.url) { convertUrl = input.url; if (!options.filename) { options.filename = input.filename; } } else { throw new fp.FilepickerException("Invalid file to convert: " + input + ". Not a valid url or FPFile object or not filepicker url. You can convert only filepicker url images."); } options.convertUrl = convertUrl; options.multiple = false; options.services = [ "CONVERT", "COMPUTER" ]; options.backgroundUpload = true; options.hide = false; return fp.picker.createPicker(options, onSuccess, onError, false, false, onProgress, true); }; var store = function(input, options, onSuccess, onError, onProgress) { fp.util.checkApiKey(); if (typeof options === "function") { onProgress = onError; onError = onSuccess; onSuccess = options; options = {}; } options = !!options ? fp.util.clone(options) : {}; onSuccess = onSuccess || function() {}; onError = onError || fp.errors.handleError; onProgress = onProgress || function() {}; if (typeof input === "string") { fp.files.storeData(input, options, onSuccess, onError, onProgress); } else { if (fp.util.isFileInputElement(input)) { if (!input.files) { fp.files.storeFileInput(input, options, onSuccess, onError, onProgress); } else if (input.files.length === 0) { onError(new fp.errors.FPError(115)); } else { fp.files.storeFile(input.files[0], options, onSuccess, onError, onProgress); } } else if (fp.util.isFile(input)) { fp.files.storeFile(input, options, onSuccess, onError, onProgress); } else if (input.url) { if (!options.filename) { options.filename = input.filename; } fp.files.storeUrl(input.url, options, onSuccess, onError, onProgress); } else { throw new fp.FilepickerException("Cannot store given input: " + input + ". Not a string, file input, DOM File, or FPFile object."); } } }; var storeUrl = function(input, options, onSuccess, onError, onProgress) { fp.util.checkApiKey(); if (typeof options === "function") { onProgress = onError; onError = onSuccess; onSuccess = options; options = {}; } options = options || {}; onSuccess = onSuccess || function() {}; onError = onError || fp.errors.handleError; onProgress = onProgress || function() {}; fp.files.storeUrl(input, options, onSuccess, onError, onProgress); }; var stat = function(fpfile, options, onSuccess, onError) { fp.util.checkApiKey(); if (typeof options === "function") { onError = onSuccess; onSuccess = options; options = {}; } options = options || {}; onSuccess = onSuccess || function() {}; onError = onErro