@ -2,58 +2,13 @@
@@ -2,58 +2,13 @@
$ ( "#upload-links" ) . css ( 'display' , 'none' , 'important' ) ;
$ ( "#upload-links" ) . html ( '' ) ;
$ ( "[name='saveKey']" ) . bootstrapSwitch ( ) ;
$ ( "[name='serverSideEncrypt']" ) . bootstrapSwitch ( ) ;
} ) ;
function linkSaveKey ( selector , uploadID , key , fileID ) {
$ ( selector ) . click ( function ( ) {
$ . ajax ( {
type : "POST" ,
url : saveKeyToServerURL ,
data : { file : uploadID , key : key } ,
success : function ( html ) {
if ( html . result ) {
$ ( '#key-link-' + fileID ) . html ( '<button type="button" class="btn btn-default btn-sm" id="remove-key-link-' + fileID + '">Remove Key From Server</button>' ) ;
$ ( '#upload-link-' + fileID ) . html ( '<p><a href="' + html . result + '" id="full-url-link-' + fileID + '" target="_blank" class="alert-link">' + html . result + '</a></p>' ) ;
linkRemoveKey ( '#remove-key-link-' + fileID + '' , uploadID , key , fileID ) ;
$ ( '#shortenUrl-button-' + fileID ) . prop ( 'disabled' , false ) ;
}
else {
$ ( "#top_msg" ) . css ( 'display' , 'inline' , 'important' ) ;
$ ( "#top_msg" ) . html ( '<div class="alert alert-danger alert-dismissable"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>' + html . error + '</div>' ) ;
}
}
} ) ;
return false ;
} ) ;
}
$ ( "[name='encrypt']" ) . bootstrapSwitch ( ) ;
function linkRemoveKey ( selector , uploadID , key , fileID ) {
$ ( selector ) . click ( function ( ) {
$ . ajax ( {
type : "POST" ,
url : removeKeyFromServerURL ,
data : { file : uploadID , key : key } ,
success : function ( html ) {
if ( html . result ) {
$ ( '#key-link-' + fileID ) . html ( '<button type="button" class="btn btn-default btn-sm" id="save-key-link-' + fileID + '">Save Key To Server</button>' ) ;
$ ( '#upload-link-' + fileID ) . html ( '<p><a href="' + html . result + '#' + key + '" id="full-url-link-' + fileID + '" target="_blank" class="alert-link">' + html . result + '#' + key + '</a></p>' ) ;
linkSaveKey ( '#save-key-link-' + fileID + '' , uploadID , key , fileID ) ;
$ ( '#shortenUrl-button-' + fileID ) . prop ( 'disabled' , false ) ;
}
else {
$ ( "#top_msg" ) . css ( 'display' , 'inline' , 'important' ) ;
$ ( "#top_msg" ) . html ( '<div class="alert alert-danger alert-dismissable"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>' + html . error + '</div>' ) ;
}
}
} ) ;
return false ;
} ) ;
}
linkCopyAll ( $ ( '#copy-all-button' ) ) ;
} ) ;
function linkUploadDelete ( selector , uploadID ) {
$ ( selector ) . click ( function ( ) {
function linkUploadDelete ( element , uploadID ) {
element . click ( function ( ) {
$ . ajax ( {
type : "POST" ,
url : generateDeleteKeyURL ,
@ -76,17 +31,18 @@ function linkUploadDelete(selector, uploadID) {
@@ -76,17 +31,18 @@ function linkUploadDelete(selector, uploadID) {
} ) ;
}
function linkShortenUrl ( selector , fileID , url ) {
$ ( selector ) . click ( function ( ) {
var url = $ ( '#full-url-link -' + fileID ) . html ( ) ;
function linkShortenUrl ( element , fileID , url ) {
element . click ( function ( ) {
var url = $ ( '#upload-panel -' + fileID ) . find ( '#upload-link' ) . text ( ) ;
$ . ajax ( {
type : "POST" ,
url : shortenURL ,
data : { url : url } ,
success : function ( html ) {
if ( html . result ) {
$ ( selector ) . prop ( 'disabled' , true ) ;
$ ( '#upload-link-' + fileID ) . html ( '<p><a href="' + html . result . shortUrl + '" id="full-url-link-' + fileID + '" target="_blank" class="alert-link">' + html . result . shortUrl + '</a></p>' ) ;
element . prop ( 'disabled' , true ) ;
$ ( '#upload-panel-' + fileID ) . find ( '#upload-link' ) . attr ( 'href' , html . result . shortUrl ) ;
$ ( '#upload-panel-' + fileID ) . find ( '#upload-link' ) . text ( html . result . shortUrl ) ;
}
else {
$ ( "#top_msg" ) . css ( 'display' , 'inline' , 'important' ) ;
@ -98,20 +54,40 @@ function linkShortenUrl(selector, fileID, url) {
@@ -98,20 +54,40 @@ function linkShortenUrl(selector, fileID, url) {
} ) ;
}
function linkRemove ( selector , fileID ) {
$ ( selector ) . click ( function ( ) {
$ ( '#link-' + fileID ) . remove ( ) ;
function linkRemove ( element , fileID ) {
element . click ( function ( ) {
$ ( '#upload-panel-' + fileID ) . remove ( ) ;
if ( $ ( '#upload-links' ) . children ( ) . length == 0 ) {
$ ( "#upload-links" ) . css ( 'display' , 'none' , 'important' ) ;
$ ( '#copy-all-button' ) . hide ( ) ;
}
return false ;
} ) ;
}
function linkCancel ( selector , fileID ) {
$ ( selector ) . click ( function ( ) {
$ ( '#link -' + fileID ) . remove ( ) ;
function linkCancel ( element , fileID ) {
element . click ( function ( ) {
$ ( '#upload-panel -' + fileID ) . remove ( ) ;
return false ;
} ) ;
}
function linkCopyAll ( element ) {
element . click ( function ( ) {
var allUploads = [ ] ;
$ ( "div[id^='upload-panel-']" ) . each ( function ( ) {
var url = $ ( this ) . find ( '#upload-link' ) . text ( ) ;
if ( url !== '' ) {
allUploads . push ( url ) ;
}
} ) ;
if ( allUploads . length > 0 ) {
var urlList = allUploads . join ( ) ;
copyTextToClipboard ( urlList ) ;
}
} ) ;
}
var fileCount = 0 ;
var dropZone = new Dropzone ( document . body , {
@ -125,35 +101,27 @@ var dropZone = new Dropzone(document.body, {
@@ -125,35 +101,27 @@ var dropZone = new Dropzone(document.body, {
// Create the UI element for the new item
var fileID = fileCount ;
fileCount ++ ;
$ ( "#upload-links" ) . css ( 'display' , 'inline' , 'important' ) ;
$ ( '#copy-all-button' ) . show ( ) ;
var itemDiv = $ ( '#upload-template' ) . clone ( ) ;
itemDiv . attr ( 'id' , 'upload-panel-' + fileID ) ;
// Hide Upload Details
itemDiv . find ( '#upload-link-panel' ) . hide ( ) ;
// Assign buttons
linkRemove ( itemDiv . find ( '#upload-close' ) , fileID ) ;
// Set the info
itemDiv . find ( '#upload-title' ) . html ( file . name ) ;
// Add the upload panel to the list
$ ( "#upload-links" ) . prepend ( itemDiv ) ;
// save ID to the file object
file . ID = fileID ;
$ ( "#upload-links" ) . css ( 'display' , 'inline' , 'important' ) ;
$ ( "#upload-links" ) . prepend ( ' \
< div class = "panel panel-default" id = "link-' + fileID + '" > \
< div class = "panel-heading text-center" id = "link-header-' + fileID + '" > '+ file.name + ' < / d i v > \
< div class = "panel-body" id = "link-panel-' + fileID + '" > \
< div class = "row" > \
< div class = "col-sm-12 text-center" id = "upload-link-' + fileID + '" > < / d i v > \
< / d i v > \
< div class = "row" > \
< div class = "col-sm-12 text-center" > \
< div class = "progress" id = "progress-' + fileID + '" > \
< div class = "progress-bar progress-bar-success progress-bar-striped active" role = "progressbar" aria - valuenow = "100" aria - valuemin = "0" aria - valuemax = "100" style = "width: 0%" > 0 % < / d i v > \
< / d i v > \
< / d i v > \
< / d i v > \
< / d i v > \
< div class = "panel-footer" id = "link-footer-' + fileID + '" > \
< div class = "row" > \
< div class = "col-sm-12 text-center" > \
< button type = "button" class = "btn btn-default btn-sm" id = "remove-link-' + fileID + '" > Cancel Upload < / b u t t o n > \
< / d i v > \
< / d i v > \
< / d i v > \
< / d i v > \
' ) ;
linkRemove ( '#remove-link-' + fileID + '' , fileID ) ;
// Check the file size
if ( file . size <= maxUploadSize ) {
@ -163,12 +131,7 @@ var dropZone = new Dropzone(document.body, {
@@ -163,12 +131,7 @@ var dropZone = new Dropzone(document.body, {
else
{
// An error occured
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . css ( 'width' , '100%' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . removeClass ( 'progress-bar-success' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . removeClass ( 'progress-bar-striped' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . removeClass ( 'active' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . addClass ( 'progress-bar-danger' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . html ( 'File Too Large' ) ;
setProgress ( fileID , 100 , 'progress-bar-danger' , '' , 'File Too Large' ) ;
}
this . removeFile ( file ) ;
}
@ -181,8 +144,7 @@ function encryptFile(file, callback) {
@@ -181,8 +144,7 @@ function encryptFile(file, callback) {
var fileExt = getFileExtension ( file . name ) ;
// Get session settings
var saveKey = $ ( '#saveKey' ) . is ( ':checked' ) ;
var serverSideEncrypt = $ ( '#serverSideEncrypt' ) . is ( ':checked' ) ;
var encrypt = $ ( '#encrypt' ) . is ( ':checked' ) ;
// Start the file reader
var reader = new FileReader ( ) ;
@ -190,28 +152,39 @@ function encryptFile(file, callback) {
@@ -190,28 +152,39 @@ function encryptFile(file, callback) {
// When the file has been loaded, encrypt it
reader . onload = ( function ( callback ) {
return function ( e ) {
// Create random key and iv (divide size by 8 for character length)
var keyStr = randomString ( ( keySize / 8 ) , '#aA' ) ;
var ivStr = randomString ( ( blockSize / 8 ) , '#aA' ) ;
// Encrypt on the server side if they ask for it
if ( s erverSideE ncrypt) {
callback ( e . target . result , keyStr , ivStr , filetype , fileExt , fileID , sav eKey , serverSideE ncrypt) ;
// Just send straight to server if they don't want to encrypt it
if ( ! encrypt ) {
callback ( e . target . result , null , null , filetype , fileExt , fileID , encrypt ) ;
}
else {
// Set variables for tracking
var lastTime = ( new Date ( ) ) . getTime ( ) ;
var lastData = 0 ;
// Create random key and iv (divide size by 8 for character length)
var keyStr = randomString ( ( keySize / 8 ) , '#aA' ) ;
var ivStr = randomString ( ( blockSize / 8 ) , '#aA' ) ;
var worker = new Worker ( GenerateBlobURL ( encScriptSrc ) ) ;
worker . addEventListener ( 'message' , function ( e ) {
switch ( e . data . cmd ) {
case 'progress' :
var percentComplete = Math . round ( e . data . processed * 100 / e . data . total ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . css ( 'width' , ( percentComplete * ( 2 / 5 ) ) + 20 + '%' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . html ( percentComplete + '% Encrypted' ) ;
var curTime = ( new Date ( ) ) . getTime ( ) ;
var elapsedTime = ( curTime - lastTime ) / 1000 ;
if ( elapsedTime >= 0.1 ) {
var speed = ( ( e . data . processed - lastData ) / elapsedTime ) ;
lastTime = curTime ;
lastData = e . data . processed ;
var percentComplete = Math . round ( e . data . processed * 100 / e . data . total ) ;
setProgress ( fileID , percentComplete , 'progress-bar-success progress-bar-striped active' , percentComplete + '%' , 'Encrypting [' + getReadableBandwidthString ( speed ) + ']' ) ;
}
break ;
case 'finish' :
if ( callback != null ) {
// Finish
callback ( e . data . buffer , keyStr , ivStr , filetype , fileExt , fileID , saveKey , serverSideEncrypt ) ;
callback ( e . data . buffer , keyStr , ivStr , filetype , fileExt , fileID , encrypt ) ;
}
break ;
}
@ -219,12 +192,8 @@ function encryptFile(file, callback) {
@@ -219,12 +192,8 @@ function encryptFile(file, callback) {
worker . onerror = function ( err ) {
// An error occured
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . css ( 'width' , '100%' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . removeClass ( 'progress-bar-success' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . removeClass ( 'progress-bar-striped' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . removeClass ( 'active' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . addClass ( 'progress-bar-danger' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . html ( 'Error Occured' ) ;
setProgress ( fileID , 100 , 'progress-bar-danger' , '' , 'Error Occured' ) ;
$ ( '#upload-panel-' + fileID ) . find ( '.panel' ) . addClass ( 'panel-danger' ) ;
}
// Generate the script to include as a blob
@ -248,8 +217,7 @@ function encryptFile(file, callback) {
@@ -248,8 +217,7 @@ function encryptFile(file, callback) {
reader . onprogress = function ( data ) {
if ( data . lengthComputable ) {
var progress = parseInt ( ( ( data . loaded / data . total ) * 100 ) , 10 ) ;
$ ( '#progress-' + fileID ) . children ( '.progress-bar' ) . css ( 'width' , ( progress / 5 ) + '%' ) ;
$ ( '#progress-' + fileID ) . children ( '.progress-bar' ) . html ( progress + '% Loaded' ) ;
setProgress ( fileID , progress , 'progress-bar-success progress-bar-striped active' , progress + '%' , 'Loading' ) ;
}
}
@ -258,124 +226,117 @@ function encryptFile(file, callback) {
@@ -258,124 +226,117 @@ function encryptFile(file, callback) {
reader . readAsArrayBuffer ( blob ) ;
}
function uploadFile ( data , key , iv , filetype , fileExt , fileID , sav eKey , serverSideE ncrypt)
function uploadFile ( data , key , iv , filetype , fileExt , fileID , encrypt )
{
$ ( '#key-' + fileID ) . val ( key ) ;
// Set variables for tracking
var lastTime = ( new Date ( ) ) . getTime ( ) ;
var lastData = 0 ;
var blob = new Blob ( [ data ] ) ;
// Now we need to upload the file
var fd = new FormData ( ) ;
fd . append ( 'fileType' , filetype ) ;
fd . append ( 'fileExt' , fileExt ) ;
if ( saveKey )
{
fd . append ( 'key' , key ) ;
}
fd . append ( 'iv' , iv ) ;
fd . append ( 'keySize' , keySize ) ;
fd . append ( 'blockSize' , blockSize ) ;
fd . append ( 'data' , blob ) ;
fd . append ( 'saveKey' , saveKey ) ;
fd . append ( 'encrypt' , serverSideEncrypt ) ;
fd . append ( 'encrypt' , ! encrypt ) ;
fd . append ( '__RequestVerificationToken' , $ ( '#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]' ) . val ( ) ) ;
var xhr = new XMLHttpRequest ( ) ;
xhr . upload . addEventListener ( "progress" , uploadProgress . bind ( null , fileID ) , false ) ;
xhr . addEventListener ( "load" , uploadComplete . bind ( null , fileID , key , sav eKey , serverSideE ncrypt) , false ) ;
xhr . upload . addEventListener ( "progress" , uploadProgress . bind ( null , fileID , lastTime , lastData ) , false ) ;
xhr . addEventListener ( "load" , uploadComplete . bind ( null , fileID , key , encrypt ) , false ) ;
xhr . addEventListener ( "error" , uploadFailed . bind ( null , fileID ) , false ) ;
xhr . addEventListener ( "abort" , uploadCanceled . bind ( null , fileID ) , false ) ;
xhr . open ( "POST" , uploadFileURL ) ;
xhr . send ( fd ) ;
}
function uploadProgress ( fileID , evt ) {
function uploadProgress ( fileID , lastTime , lastData , evt ) {
var serverSideEncrypt = $ ( '#serverSideEncrypt' ) . is ( ':checked' ) ;
if ( evt . lengthComputable ) {
var curTime = ( new Date ( ) ) . getTime ( ) ;
var elapsedTime = ( curTime - lastTime ) / 1000 ;
var speed = ( ( evt . loaded - lastData ) / elapsedTime ) ;
lastTime = curTime ;
lastData = evt . loaded ;
var percentComplete = Math . round ( evt . loaded * 100 / evt . total ) ;
if ( serverSideEncrypt && percentComplete == 100 ) {
$ ( '#progress-' + fileID ) . children ( '.progress-bar' ) . css ( 'width' , '100%' ) ;
$ ( '#progress-' + fileID ) . children ( '.progress-bar' ) . html ( 'Encrypting' ) ;
if ( percentComplete == 100 ) {
setProgress ( fileID , 100 , 'progress-bar-success progress-bar-striped active' , '' , 'Processing Upload' ) ;
}
else {
$ ( '#progress-' + fileID ) . children ( '.progress-bar' ) . css ( 'width' , ( percentComplete * ( 2 / 5 ) ) + 60 + '%' ) ;
$ ( '#progress-' + fileID ) . children ( '.progress-bar' ) . html ( percentComplete + '% Uploaded' ) ;
setProgress ( fileID , percentComplete , 'progress-bar-success progress-bar-striped active' , percentComplete + '%' , 'Uploading to Server [' + getReadableBandwidthString ( speed ) + ']' ) ;
}
}
}
function uploadComplete ( fileID , key , sav eKey , serverSideE ncrypt, evt ) {
function uploadComplete ( fileID , key , encrypt , evt ) {
obj = JSON . parse ( evt . target . responseText ) ;
if ( obj . result != null ) {
var name = obj . result . name ;
var fullName = obj . result . url ;
if ( obj . result . key != null )
key = obj . result . key ;
if ( ! saveKey ) {
fullName = fullName + '#' + key ;
}
$ ( '#progress-' + fileID ) . children ( '.progress-bar' ) . css ( 'width' , '100%' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . removeClass ( 'progress-bar-striped' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . removeClass ( 'active' ) ;
$ ( '#progress-' + fileID ) . children ( '.progress-bar' ) . html ( 'Complete' ) ;
$ ( '#upload-link-' + fileID ) . html ( '<p><a href="' + fullName + '" id="full-url-link-' + fileID + '" target="_blank" class="alert-link">' + fullName + '</a></p>' ) ;
var keyBtn = '<div class="col-sm-4 text-center" id="key-link-' + fileID + ' " > \
< button type = "button" class = "btn btn-default btn-sm" id = "save-key-link-' + fileID + '" > Save Key On Server < / b u t t o n > \
< / d i v > ' ;
if ( saveKey ) {
keyBtn = '<div class="col-sm-4 text-center" id="key-link-' + fileID + ' " > \
< button type = "button" class = "btn btn-default btn-sm" id = "remove-key-link-' + fileID + '" > Remove Key From Server < / b u t t o n > \
< / d i v > ' ;
}
$ ( '#link-footer-' + fileID ) . html ( ' \
< div class = "row" > \
' + keyBtn + ' \
< div class = "col-sm-4 text-center" > \
< button type = "button" class = "btn btn-default btn-sm" id = "generate-delete-link-' + fileID + '" > Generate Deletion URL < / b u t t o n > \
< / d i v > \
< div class = "col-sm-4 text-center" > \
< button type = "button" class = "btn btn-default btn-sm" id = "shortenUrl-button-' + fileID + '" > Shorten Url < / b u t t o n > \
< / d i v > \
< / d i v > \
' ) ;
if ( saveKey ) {
linkRemoveKey ( '#remove-key-link-' + fileID + '' , name , key , fileID ) ;
}
else {
linkSaveKey ( '#save-key-link-' + fileID + '' , name , key , fileID ) ;
var itemDiv = $ ( '#upload-panel-' + fileID ) ;
if ( itemDiv ) {
var name = obj . result . name ;
var fullName = obj . result . url ;
if ( encrypt ) {
fullName = fullName + '#' + key ;
}
var contentType = obj . result . contentType ;
var contentLength = obj . result . contentLength ;
// Set progress bar
setProgress ( fileID , 100 , 'progress-bar-success' , '' , 'Complete' ) ;
// Set the panel to success
itemDiv . find ( '.panel' ) . addClass ( 'panel-success' ) ;
// Add the upload details
itemDiv . find ( '#upload-link' ) . attr ( 'href' , fullName ) ;
itemDiv . find ( '#upload-link' ) . text ( fullName ) ;
itemDiv . find ( '#upload-contentType' ) . html ( contentType ) ;
itemDiv . find ( '#upload-contentLength' ) . html ( contentLength ) ;
// Setup the buttons
linkUploadDelete ( itemDiv . find ( '#generate-delete-link' ) , name ) ;
linkShortenUrl ( itemDiv . find ( '#shortenUrl' ) , fileID , fullName ) ;
// Hide the progress bar
itemDiv . find ( '#upload-progress-panel' ) . hide ( ) ;
// Show the details
itemDiv . find ( '#upload-link-panel' ) . show ( ) ;
}
linkUploadDelete ( '#generate-delete-link-' + fileID + '' , name ) ;
linkShortenUrl ( '#shortenUrl-button-' + fileID + '' , fileID , fullName ) ;
}
else
{
$ ( '#progress-' + fileID ) . children ( '.progress-bar' ) . css ( 'width' , '100%' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . removeClass ( 'progress-bar-success' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . removeClass ( 'progress-bar-striped' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . removeClass ( 'active' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . addClass ( 'progress-bar-danger' ) ;
$ ( '#remove-link-' + fileID ) . text ( 'Clear Upload' ) ;
var errorMessage = 'Unable to Upload File' ;
if ( obj . error != null ) {
$ ( '#progress-' + fileID ) . children ( '.progress-bar' ) . html ( obj . error . message ) ;
}
else {
$ ( '#progress-' + fileID ) . children ( '.progress-bar' ) . html ( 'Unable to Upload File' ) ;
errorMessage = obj . error . message ;
}
setProgress ( fileID , 100 , 'progress-bar-danger' , '' , errorMessage ) ;
}
}
function uploadFailed ( fileID , evt ) {
$ ( '#progress-' + fileID ) . children ( '.progress-bar' ) . css ( 'width' , '100%' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . removeClass ( 'progress-bar-success' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . removeClass ( 'progress-bar-striped' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . removeClass ( 'active' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . addClass ( 'progress-bar-danger' ) ;
$ ( '#progress-' + fileID ) . children ( '.progress-bar' ) . html ( 'Upload Failed' ) ;
setProgress ( fileID , 100 , 'progress-bar-danger' , '' , 'Upload Failed' ) ;
$ ( '#upload-panel-' + fileID ) . find ( '.panel' ) . addClass ( 'panel-danger' ) ;
}
function uploadCanceled ( fileID , evt ) {
$ ( '#progress-' + fileID ) . children ( '.progress-bar' ) . css ( 'width' , '100%' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . removeClass ( 'progress-bar-success' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . removeClass ( 'progress-bar-striped' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . removeClass ( 'active' ) ;
$ ( "#progress-" + fileID ) . children ( '.progress-bar' ) . addClass ( 'progress-bar-warning' ) ;
$ ( '#progress-' + fileID ) . children ( '.progress-bar' ) . html ( 'Upload Canceled' ) ;
setProgress ( fileID , 100 , 'progress-bar-warning' , '' , 'Upload Canceled' ) ;
$ ( '#upload-panel-' + fileID ) . find ( '.panel' ) . addClass ( 'panel-warning' ) ;
}
function setProgress ( fileID , percentage , classes , barMessage , title ) {
var progress = $ ( '#upload-panel-' + fileID ) ;
if ( progress !== null ) {
progress . find ( '#progress-bar' ) . css ( 'width' , percentage + '%' ) ;
progress . find ( '#progress-bar' ) . removeClass ( ) ;
progress . find ( '#progress-bar' ) . addClass ( 'progress-bar' ) ;
progress . find ( '#progress-bar' ) . addClass ( classes ) ;
progress . find ( '#progress-bar' ) . html ( barMessage ) ;
progress . find ( '#progress-info' ) . html ( title ) ;
}
}