filepicker-js
Version:
Filepicker client javascript library
1,352 lines (1,329 loc) • 150 kB
JavaScript
"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