2017-10-08 01:15:16 +00:00
|
|
|
;
|
|
|
|
var contented = (function ($, currentScriptPath) {
|
2017-10-08 00:45:55 +00:00
|
|
|
"use strict";
|
|
|
|
|
2017-10-08 01:10:47 +00:00
|
|
|
var baseURL = currentScriptPath.replace('sdk.js', '');
|
|
|
|
|
2017-10-08 01:49:00 +00:00
|
|
|
var formatBytes = function(bytes) {
|
2017-10-08 02:07:04 +00:00
|
|
|
if (bytes < 1024) {
|
|
|
|
return bytes + " B";
|
|
|
|
} else if (bytes < (1024*1024)) {
|
|
|
|
return (bytes / 1024).toFixed(1) + " KiB";
|
|
|
|
} else if (bytes < (1024*1024*1024)) {
|
|
|
|
return (bytes / (1024*1024)).toFixed(1) + " MiB";
|
|
|
|
} else {
|
|
|
|
return (bytes / (1024*1024*1024)).toFixed(1) + " GiB";
|
|
|
|
}
|
2017-10-08 01:49:00 +00:00
|
|
|
};
|
|
|
|
|
2017-10-08 00:45:55 +00:00
|
|
|
/**
|
2017-10-08 02:16:38 +00:00
|
|
|
* supportsDrop returns whether drag-and-drop is supported by this browser.
|
2017-10-08 00:45:55 +00:00
|
|
|
*
|
|
|
|
* @return bool
|
|
|
|
*/
|
2017-10-08 02:16:38 +00:00
|
|
|
var supportsDrop = function () {
|
2017-10-08 00:45:55 +00:00
|
|
|
return ('ondrop' in window && 'FormData' in window && 'FileReader' in window);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2017-10-08 02:16:38 +00:00
|
|
|
* initArea shows the contented upload widget over the top of a target DOM element.
|
2017-10-08 00:45:55 +00:00
|
|
|
*
|
2017-10-08 01:10:47 +00:00
|
|
|
* @param any element Drop target (string selector / DOMElement / jQuery)
|
2017-10-08 02:16:38 +00:00
|
|
|
* @param Function onUploaded Called with an array of upload IDs
|
|
|
|
* @param Function onClose Called when the widget is being destroyed
|
2017-10-08 00:45:55 +00:00
|
|
|
*/
|
2017-10-08 02:16:38 +00:00
|
|
|
var initArea = function (elementSelector, onUploaded, onClose) {
|
2017-10-08 01:15:16 +00:00
|
|
|
onUploaded = onUploaded || function () { };
|
|
|
|
onClose = onClose || function () { };
|
2017-10-08 00:45:55 +00:00
|
|
|
|
2017-10-08 01:10:47 +00:00
|
|
|
if ($(elementSelector).length != 1) {
|
|
|
|
return; // should only find one element
|
|
|
|
}
|
|
|
|
var element = $(elementSelector)[0];
|
|
|
|
|
2017-10-08 00:45:55 +00:00
|
|
|
// <input type="hidden" name="MAX_FILE_SIZE" value="` + ret.MaxUploadBytes + `" />
|
|
|
|
|
|
|
|
// Create a new div for ourselves on top of the existing area
|
2017-10-08 01:15:16 +00:00
|
|
|
$.get(baseURL + "about", function (ret) {
|
2017-10-08 02:16:57 +00:00
|
|
|
|
2017-10-08 00:45:55 +00:00
|
|
|
var extraText = "";
|
|
|
|
if (ret.MaxUploadBytes > 0) {
|
2017-10-08 01:49:00 +00:00
|
|
|
extraText = " (max " + formatBytes(ret.MaxUploadBytes) + ")";
|
2017-10-08 00:45:55 +00:00
|
|
|
}
|
|
|
|
|
2017-10-08 01:15:16 +00:00
|
|
|
$.get(baseURL + "widget.html", function (widgetHtml) {
|
2017-10-08 00:45:55 +00:00
|
|
|
|
|
|
|
var $f = $("<div>").html(widgetHtml);
|
|
|
|
$f.find(".contented-extratext").text(extraText);
|
|
|
|
|
2017-10-08 01:15:16 +00:00
|
|
|
var ourClose = function () {
|
2017-10-08 00:45:55 +00:00
|
|
|
$f.remove(); // remove from dom
|
|
|
|
onClose(); // upstream close
|
|
|
|
};
|
2017-10-08 01:15:16 +00:00
|
|
|
$f.find(".contented-close").click(function () {
|
2017-10-08 00:45:55 +00:00
|
|
|
ourClose();
|
|
|
|
})
|
|
|
|
|
2017-10-08 01:15:16 +00:00
|
|
|
var setType = function (type) {
|
2017-10-08 00:45:55 +00:00
|
|
|
$f.find(".contented-upload-type").removeClass("contented-upload-type-active");
|
|
|
|
$f.find(".contented-upload-type[data-upload-type=" + type + "]").addClass("contented-upload-type-active");
|
|
|
|
|
|
|
|
$f.find(".contented-upload-if").removeClass("contented-active");
|
|
|
|
$f.find(".contented-if-" + type).addClass("contented-active");
|
|
|
|
};
|
|
|
|
|
2017-10-08 01:15:16 +00:00
|
|
|
$f.find(".contented-upload-type").click(function () {
|
|
|
|
setType($(this).attr('data-upload-type'));
|
2017-10-08 00:45:55 +00:00
|
|
|
});
|
|
|
|
|
2017-10-08 02:16:38 +00:00
|
|
|
if (!supportsDrop()) {
|
2017-10-08 00:45:55 +00:00
|
|
|
// switch default
|
|
|
|
setType('file');
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
var $element = $(element);
|
|
|
|
var offset = $element.offset();
|
2017-10-08 01:15:16 +00:00
|
|
|
|
2017-10-08 00:45:55 +00:00
|
|
|
$f.css({
|
|
|
|
'position': 'absolute',
|
2017-10-08 01:15:16 +00:00
|
|
|
'left': offset.left + "px",
|
|
|
|
'top': offset.top + "px",
|
|
|
|
'width': $element.width() + "px",
|
|
|
|
'min-width': $element.width() + "px",
|
|
|
|
'max-width': $element.width() + "px",
|
|
|
|
'height': $element.height() + "px",
|
|
|
|
'min-height': $element.height() + "px",
|
|
|
|
'max-height': $element.height() + "px"
|
2017-10-08 00:45:55 +00:00
|
|
|
});
|
2017-10-08 01:15:16 +00:00
|
|
|
|
|
|
|
$f.find('.contented').on('dragover dragenter', function (e) {
|
2017-10-08 00:45:55 +00:00
|
|
|
e.preventDefault();
|
|
|
|
e.stopPropagation();
|
|
|
|
$(this).addClass('is-dragging');
|
|
|
|
});
|
|
|
|
|
2017-10-08 01:15:16 +00:00
|
|
|
$f.find('.contented').on('dragleave dragend', function (e) {
|
2017-10-08 00:45:55 +00:00
|
|
|
e.preventDefault();
|
|
|
|
e.stopPropagation();
|
|
|
|
$(this).removeClass('is-dragging');
|
|
|
|
});
|
|
|
|
|
2017-10-08 01:49:00 +00:00
|
|
|
$f.find('.contented').on('drop', function (e) {
|
2017-10-08 01:15:16 +00:00
|
|
|
e.preventDefault();
|
|
|
|
e.stopPropagation();
|
2017-10-08 01:49:00 +00:00
|
|
|
handleUploadFrom(e.originalEvent.dataTransfer.files);
|
2017-10-08 01:15:16 +00:00
|
|
|
});
|
|
|
|
|
2017-10-08 03:11:59 +00:00
|
|
|
$f.find('.contented-file-upload').on('click', function(e) {
|
|
|
|
e.preventDefault();
|
|
|
|
e.stopPropagation();
|
|
|
|
handleUploadFrom($(".contented-file-selector")[0].files);
|
|
|
|
});
|
|
|
|
|
2017-10-08 03:15:15 +00:00
|
|
|
$f.find('.contented-paste-upload').on('click', function(e) {
|
|
|
|
e.preventDefault();
|
|
|
|
e.stopPropagation();
|
|
|
|
var blob = new Blob([$(".contented-if-paste textarea").val()], {type : 'text/plain'});
|
|
|
|
handleUploadFrom([blob]);
|
|
|
|
});
|
|
|
|
|
2017-10-08 01:15:16 +00:00
|
|
|
$("body").append($f);
|
|
|
|
|
2017-10-08 01:49:00 +00:00
|
|
|
var setProgressCaption = function(message) {
|
|
|
|
$f.find(".contented-if-progress label").text(message);
|
|
|
|
};
|
|
|
|
var setProgressPercentage = function(frc) {
|
|
|
|
$f.find(".contented-progress-element").css('width', (frc * 100) + "%");
|
|
|
|
};
|
|
|
|
|
2017-10-08 01:15:16 +00:00
|
|
|
var handleUploadFrom = function (files) {
|
|
|
|
|
2017-10-08 01:49:00 +00:00
|
|
|
setProgressCaption("Uploading, please wait...");
|
|
|
|
setProgressPercentage(0);
|
2017-10-08 00:45:55 +00:00
|
|
|
setType("progress");
|
|
|
|
|
2017-10-08 02:07:16 +00:00
|
|
|
$f.find(".contented-upload-type-selector").hide();
|
|
|
|
$f.find(".contented").removeClass('is-dragging');
|
|
|
|
|
2017-10-08 00:45:55 +00:00
|
|
|
// Ajax uploader
|
2017-10-08 01:49:00 +00:00
|
|
|
var ajaxData = new FormData();
|
|
|
|
for (var i = 0; i < files.length; ++i) {
|
|
|
|
ajaxData.append("f", files[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
// ajax request
|
|
|
|
$.ajax({
|
|
|
|
url: baseURL + "upload",
|
|
|
|
type: "POST",
|
|
|
|
data: ajaxData,
|
|
|
|
dataType: 'json', // response type
|
|
|
|
cache: false,
|
|
|
|
contentType: false,
|
|
|
|
processData: false,
|
2017-10-08 02:07:28 +00:00
|
|
|
xhr: function() {
|
|
|
|
var xhr = $.ajaxSettings.xhr();
|
|
|
|
xhr.upload.addEventListener(
|
|
|
|
'progress',
|
|
|
|
function(ev) {
|
|
|
|
console.log([ev.lengthComputable, ev.loaded, ev.total]);
|
|
|
|
if (ev.lengthComputable) {
|
|
|
|
setProgressCaption("Uploading (" + formatBytes(ev.loaded) + " / " + formatBytes(ev.total) + ")...");
|
|
|
|
setProgressPercentage(ev.total == 0 ? 0 : ev.loaded / ev.total);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
false
|
|
|
|
);
|
|
|
|
return xhr;
|
2017-10-08 01:49:00 +00:00
|
|
|
},
|
|
|
|
complete: function () {
|
|
|
|
setProgressCaption("Upload complete.");
|
|
|
|
setProgressPercentage(1);
|
|
|
|
},
|
|
|
|
success: function (data) {
|
|
|
|
onUploaded(data);
|
|
|
|
ourClose();
|
|
|
|
},
|
|
|
|
error: function () {
|
|
|
|
setProgressCaption("Upload failed.");
|
|
|
|
}
|
|
|
|
});
|
2017-10-08 00:45:55 +00:00
|
|
|
|
2017-10-08 01:15:16 +00:00
|
|
|
}
|
2017-10-07 05:05:58 +00:00
|
|
|
|
|
|
|
});
|
|
|
|
|
2017-10-08 00:45:55 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2017-10-08 01:10:57 +00:00
|
|
|
//
|
2017-10-08 00:45:55 +00:00
|
|
|
return {
|
2017-10-08 02:16:38 +00:00
|
|
|
'supportsDrop': supportsDrop,
|
|
|
|
'init': initArea
|
2017-10-08 00:45:55 +00:00
|
|
|
};
|
2017-10-07 05:05:58 +00:00
|
|
|
|
2017-10-08 01:10:47 +00:00
|
|
|
})(
|
|
|
|
jQuery,
|
2017-10-08 01:15:16 +00:00
|
|
|
(function () {
|
|
|
|
"use strict";
|
|
|
|
|
2017-10-08 01:10:47 +00:00
|
|
|
// Determine current script path
|
|
|
|
// @ref https://stackoverflow.com/a/26023176
|
2017-10-08 01:15:16 +00:00
|
|
|
var scripts = document.querySelectorAll('script[src]');
|
|
|
|
var currentScript = scripts[scripts.length - 1].src;
|
|
|
|
var currentScriptChunks = currentScript.split('/');
|
|
|
|
var currentScriptFile = currentScriptChunks[currentScriptChunks.length - 1];
|
|
|
|
|
|
|
|
return currentScript.replace(currentScriptFile, '');
|
2017-10-08 01:10:47 +00:00
|
|
|
})()
|
|
|
|
);
|