summaryrefslogtreecommitdiff
path: root/static
diff options
context:
space:
mode:
Diffstat (limited to 'static')
-rw-r--r--static/theme.css109
-rw-r--r--static/upload.js145
2 files changed, 254 insertions, 0 deletions
diff --git a/static/theme.css b/static/theme.css
index 522f97d..8c5d22f 100644
--- a/static/theme.css
+++ b/static/theme.css
@@ -193,3 +193,112 @@ main {
display: block;
}
}
+
+/* Upload */
+.upload_form_cont {
+ background: -moz-linear-gradient(#ffffff, #f2f2f2);
+ background: -ms-linear-gradient(#ffffff, #f2f2f2);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f2f2f2));
+ background: -webkit-linear-gradient(#ffffff, #f2f2f2);
+ background: -o-linear-gradient(#ffffff, #f2f2f2);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f2f2f2');
+ -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f2f2f2')";
+ background: linear-gradient(#ffffff, #f2f2f2);
+ color:#000;
+ overflow:hidden;
+}
+#upload_form {
+ float:left;
+ padding:20px;
+ width:700px;
+}
+#upload_form > div {
+ margin-bottom:10px;
+}
+#speed,#remaining {
+ float:left;
+ width:100px;
+}
+#b_transfered {
+ float:right;
+ text-align:right;
+}
+.clear_both {
+ clear:both;
+}
+input {
+ border-radius:10px;
+ -moz-border-radius:10px;
+ -ms-border-radius:10px;
+ -o-border-radius:10px;
+ -webkit-border-radius:10px;
+ border:1px solid #ccc;
+ font-size:14pt;
+ padding:5px 10px;
+}
+input[type=button] {
+ background: -moz-linear-gradient(#ffffff, #dfdfdf);
+ background: -ms-linear-gradient(#ffffff, #dfdfdf);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #dfdfdf));
+ background: -webkit-linear-gradient(#ffffff, #dfdfdf);
+ background: -o-linear-gradient(#ffffff, #dfdfdf);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#dfdfdf');
+ -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#dfdfdf')";
+ background: linear-gradient(#ffffff, #dfdfdf);
+}
+#video_file {
+ width:400px;
+}
+#progress_info {
+ font-size:10pt;
+}
+#fileinfo,#error,#error2,#abort,#warnsize {
+ color:#aaa;
+ display:none;
+ font-size:10pt;
+ font-style:italic;
+ margin-top:10px;
+}
+#progress {
+ border:1px solid #ccc;
+ display:none;
+ float:left;
+ height:14px;
+ border-radius:10px;
+ -moz-border-radius:10px;
+ -ms-border-radius:10px;
+ -o-border-radius:10px;
+ -webkit-border-radius:10px;
+ background: -moz-linear-gradient(#66cc00, #4b9500);
+ background: -ms-linear-gradient(#66cc00, #4b9500);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #66cc00), color-stop(100%, #4b9500));
+ background: -webkit-linear-gradient(#66cc00, #4b9500);
+ background: -o-linear-gradient(#66cc00, #4b9500);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#66cc00', endColorstr='#4b9500');
+ -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#66cc00', endColorstr='#4b9500')";
+ background: linear-gradient(#66cc00, #4b9500);
+}
+#progress_percent {
+ float:right;
+}
+#upload_response {
+ margin-top: 10px;
+ padding: 20px;
+ overflow: hidden;
+ display: none;
+ border: 1px solid #ccc;
+ border-radius:10px;
+ -moz-border-radius:10px;
+ -ms-border-radius:10px;
+ -o-border-radius:10px;
+ -webkit-border-radius:10px;
+ box-shadow: 0 0 5px #ccc;
+ background: -moz-linear-gradient(#bbb, #eee);
+ background: -ms-linear-gradient(#bbb, #eee);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #bbb), color-stop(100%, #eee));
+ background: -webkit-linear-gradient(#bbb, #eee);
+ background: -o-linear-gradient(#bbb, #eee);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#bbb', endColorstr='#eee');
+ -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#bbb', endColorstr='#eee')";
+ background: linear-gradient(#000000, #1e1e1e);
+}
diff --git a/static/upload.js b/static/upload.js
new file mode 100644
index 0000000..7353c47
--- /dev/null
+++ b/static/upload.js
@@ -0,0 +1,145 @@
+// common variables
+var iBytesUploaded = 0;
+var iBytesTotal = 0;
+var iPreviousBytesLoaded = 0;
+var iMaxFilesize = 104857600; // 100MB
+var oTimer = 0;
+var sResultFileSize = '';
+function secondsToTime(secs) { // we will use this function to convert seconds in normal time format
+ var hr = Math.floor(secs / 3600);
+ var min = Math.floor((secs - (hr * 3600))/60);
+ var sec = Math.floor(secs - (hr * 3600) - (min * 60));
+ if (hr < 10) {hr = "0" + hr; }
+ if (min < 10) {min = "0" + min;}
+ if (sec < 10) {sec = "0" + sec;}
+ if (hr) {hr = "00";}
+ return hr + ':' + min + ':' + sec;
+};
+function bytesToSize(bytes) {
+ var sizes = ['Bytes', 'KB', 'MB'];
+ if (bytes == 0) return 'n/a';
+ var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
+ return (bytes / Math.pow(1024, i)).toFixed(1) + ' ' + sizes[i];
+};
+function fileSelected() {
+ // hide different warnings
+ document.getElementById('upload_response').style.display = 'none';
+ document.getElementById('error').style.display = 'none';
+ document.getElementById('error2').style.display = 'none';
+ document.getElementById('abort').style.display = 'none';
+ document.getElementById('warnsize').style.display = 'none';
+ // get selected file element
+ var oFile = document.getElementById('image_file').files[0];
+ // filter for image files
+ var rFilter = /^(image\/bmp|image\/gif|image\/jpeg|image\/png|image\/tiff)$/i;
+ if (! rFilter.test(oFile.type)) {
+ document.getElementById('error').style.display = 'block';
+ return;
+ }
+ // little test for filesize
+ if (oFile.size > iMaxFilesize) {
+ document.getElementById('warnsize').style.display = 'block';
+ return;
+ }
+ // get preview element
+ var oImage = document.getElementById('preview');
+ // prepare HTML5 FileReader
+ var oReader = new FileReader();
+ oReader.onload = function(e){
+ // e.target.result contains the DataURL which we will use as a source of the image
+ oImage.src = e.target.result;
+ oImage.onload = function () { // binding onload event
+ // we are going to display some custom image information here
+ sResultFileSize = bytesToSize(oFile.size);
+ document.getElementById('fileinfo').style.display = 'block';
+ document.getElementById('filename').innerHTML = 'Name: ' + oFile.name;
+ document.getElementById('filesize').innerHTML = 'Size: ' + sResultFileSize;
+ document.getElementById('filetype').innerHTML = 'Type: ' + oFile.type;
+ document.getElementById('filedim').innerHTML = 'Dimension: ' + oImage.naturalWidth + ' x ' + oImage.naturalHeight;
+ };
+ };
+ // read selected file as DataURL
+ oReader.readAsDataURL(oFile);
+}
+function startUploading() {
+ // cleanup all temp states
+ iPreviousBytesLoaded = 0;
+ document.getElementById('upload_response').style.display = 'none';
+ document.getElementById('error').style.display = 'none';
+ document.getElementById('error2').style.display = 'none';
+ document.getElementById('abort').style.display = 'none';
+ document.getElementById('warnsize').style.display = 'none';
+ document.getElementById('progress_percent').innerHTML = '';
+ var oProgress = document.getElementById('progress');
+ oProgress.style.display = 'block';
+ oProgress.style.width = '0px';
+ // get form data for POSTing
+ //var vFD = document.getElementById('upload_form').getFormData(); // for FF3
+ var vFD = new FormData(document.getElementById('upload_form'));
+ // create XMLHttpRequest object, adding few event listeners, and POSTing our data
+ var oXHR = new XMLHttpRequest();
+ oXHR.upload.addEventListener('progress', uploadProgress, false);
+ oXHR.addEventListener('load', uploadFinish, false);
+ oXHR.addEventListener('error', uploadError, false);
+ oXHR.addEventListener('abort', uploadAbort, false);
+ oXHR.open('POST', '/upload');
+ oXHR.send(vFD);
+ // set inner timer
+ oTimer = setInterval(doInnerUpdates, 300);
+}
+function doInnerUpdates() { // we will use this function to display upload speed
+ var iCB = iBytesUploaded;
+ var iDiff = iCB - iPreviousBytesLoaded;
+ // if nothing new loaded - exit
+ if (iDiff == 0)
+ return;
+ iPreviousBytesLoaded = iCB;
+ iDiff = iDiff * 2;
+ var iBytesRem = iBytesTotal - iPreviousBytesLoaded;
+ var secondsRemaining = iBytesRem / iDiff;
+ // update speed info
+ var iSpeed = iDiff.toString() + 'B/s';
+ if (iDiff > 1024 * 1024) {
+ iSpeed = (Math.round(iDiff * 100/(1024*1024))/100).toString() + 'MB/s';
+ } else if (iDiff > 1024) {
+ iSpeed = (Math.round(iDiff * 100/1024)/100).toString() + 'KB/s';
+ }
+ document.getElementById('speed').innerHTML = iSpeed;
+ document.getElementById('remaining').innerHTML = '| ' + secondsToTime(secondsRemaining);
+}
+function uploadProgress(e) { // upload process in progress
+ if (e.lengthComputable) {
+ iBytesUploaded = e.loaded;
+ iBytesTotal = e.total;
+ var iPercentComplete = Math.round(e.loaded * 100 / e.total);
+ var iBytesTransfered = bytesToSize(iBytesUploaded);
+ document.getElementById('progress_percent').innerHTML = iPercentComplete.toString() + '%';
+ document.getElementById('progress').style.width = (iPercentComplete * 4).toString() + 'px';
+ document.getElementById('b_transfered').innerHTML = iBytesTransfered;
+ if (iPercentComplete == 100) {
+ var oUploadResponse = document.getElementById('upload_response');
+ oUploadResponse.innerHTML = '<h1>Please wait...processing</h1>';
+ oUploadResponse.style.display = 'block';
+ }
+ } else {
+ document.getElementById('progress').innerHTML = 'unable to compute';
+ }
+}
+function uploadFinish(e) { // upload successfully finished
+ var oUploadResponse = document.getElementById('upload_response');
+ oUploadResponse.innerHTML = e.target.responseText;
+ oUploadResponse.style.display = 'block';
+ document.getElementById('progress_percent').innerHTML = '100%';
+ document.getElementById('progress').style.width = '400px';
+ document.getElementById('filesize').innerHTML = sResultFileSize;
+ document.getElementById('remaining').innerHTML = '| 00:00:00';
+ clearInterval(oTimer);
+}
+function uploadError(e) { // upload error
+ document.getElementById('error2').style.display = 'block';
+ clearInterval(oTimer);
+}
+function uploadAbort(e) { // upload abort
+ document.getElementById('abort').style.display = 'block';
+ clearInterval(oTimer);
+}