Index: admin/js/_index.js
===================================================================
--- admin/js/_index.js	(revision 1418)
+++ admin/js/_index.js	(revision 1140)
@@ -61,8 +61,4 @@
 			});
 		}
-		$('#new_cat').toggleWithLegend(
-			$('#new_cat').parent().children().not('#new_cat'),
-			{} // no cookie on new category as we don't use this every day
-		);
 	}
 
Index: admin/js/_media.js
===================================================================
--- admin/js/_media.js	(revision 1234)
+++ admin/js/_media.js	(revision 1325)
@@ -2,4 +2,25 @@
 	if ($('#fileupload').length==0) {
 		return;
+	}
+
+	function enableButton(button) {
+		button.prop('disabled',false).removeClass('disabled');
+	}
+
+	function disableButton(button) {
+		button.prop('disabled',true).addClass('disabled');
+	}
+
+	function displayMessageInQueue(n) {
+		var msg = '';
+		if (n==1) {
+			msg = dotclear.jsUpload.msg.file_in_queue;
+		} else if (n>1) {
+			msg = dotclear.jsUpload.msg.files_in_queue;
+			msg = msg.replace(/%d/,n);
+		} else {
+			msg = dotclear.jsUpload.msg.no_file_in_queue;
+		}
+		$('.queue-message','#fileupload').html(msg);
 	}
 
@@ -10,6 +31,16 @@
 	});
 
-	$('.button.cancel', '#fileupload').click(function(e) {
-		$('.button.cancel, .button.start','#fileupload .fileupload-buttonbar').hide();
+	$('.button.cancel', '#fileupload .fileupload-buttonbar').click(function(e) {
+		$('.button.cancel','#fileupload .fileupload-buttonbar').hide();
+		disableButton($('.button.start','#fileupload .fileupload-buttonbar'));
+		displayMessageInQueue(0);
+	});
+
+	$('.cancel').live('click', function(e) {
+		if ($('.fileupload-ctrl .files .template-upload', '#fileupload').length==0) {
+			$('.button.cancel','#fileupload .fileupload-buttonbar').hide();
+			disableButton($('.button.start','#fileupload .fileupload-buttonbar'));
+		}
+		displayMessageInQueue($('.files .template-upload','#fileupload').length);
 	});
 
@@ -28,5 +59,8 @@
 		disabled: true
 	}).bind('fileuploadadd', function(e, data) {
-		$('.button.cancel, .button.start', '#fileupload .fileupload-buttonbar').show();
+		$('.button.cancel','#fileupload .fileupload-buttonbar').show();
+		enableButton($('.button.start','#fileupload .fileupload-buttonbar'));
+	}).bind('fileuploadadded', function(e, data) {
+		displayMessageInQueue($('.files .template-upload','#fileupload').length);
 	}).bind('fileuploaddone', function(e, data) {
 		if (data.result.files[0].html !==undefined) {
@@ -35,10 +69,12 @@
 		$('.button.clean','#fileupload').show();
 	}).bind('fileuploadalways', function(e, data) {
-	    if ($('.fileupload-ctrl .files .template-upload', '#fileupload').length==0) {
-		$('.button.start, .button.cancel','#fileupload .fileupload-buttonbar').hide();
-	    }
+		displayMessageInQueue($('.files .template-upload','#fileupload').length);
+		if ($('.fileupload-ctrl .files .template-upload','#fileupload').length==0) {
+			$('.button.cancel','#fileupload .fileupload-buttonbar').hide();
+			disableButton($('.button.start','#fileupload .fileupload-buttonbar'));
+		}
 	});
 
-	var $container = $('#add-file-f').parent().parent();
+	var $container = $('#fileupload').parent().parent();
 	var $msg,label;
 
@@ -47,4 +83,6 @@
 		label = dotclear.jsUpload.msg.choose_files;
 		$('#fileupload').fileupload({disabled:false});
+		displayMessageInQueue(0);
+		disableButton($('.button.start','#fileupload .fileupload-buttonbar'));
 	} else {
 		$msg = dotclear.msg.enhanced_uploader_activate;
@@ -61,13 +99,17 @@
 			// We must remove files in table
 			$('.files .upload-file', '#fileupload').remove();
-			$('.button.cancel, .button.start','#fileupload .fileupload-buttonbar').hide();
-			$('.button.start','#fileupload').show();
+			$('.button.cancel,.button.clean','#fileupload .fileupload-buttonbar').hide();
 			$('#fileupload').fileupload({disabled:true});
+			$('.queue-message','#fileupload').html('').hide();
 		} else {
 			$msg = dotclear.msg.enhanced_uploader_disable;
 			label = dotclear.jsUpload.msg.choose_files;
 			$('#upfile').attr('multiple', true);
-			$('.button.start','#fileupload').hide();
+			var startButton = $('.button.start','#fileupload .fileupload-buttonbar');
+			disableButton(startButton);
+			startButton.show();
 			$('#fileupload').fileupload({disabled:false});
+			$('.queue-message','#fileupload').show();
+			displayMessageInQueue(0);
 		}
 		$(this).find('a').text($msg);
@@ -75,5 +117,5 @@
 
 		$container.toggleClass('enhanced_uploader');
-	}).appendTo($('#add-file-f'));
+	}).appendTo($('#fileupload'));
 
 	// Replace remove links by a POST on hidden form
Index: admin/js/_post.js
===================================================================
--- admin/js/_post.js	(revision 1417)
+++ admin/js/_post.js	(revision 1353)
@@ -79,15 +79,7 @@
 		// Get document format and prepare toolbars
 		var formatField = $('#post_format').get(0);
-		var last_post_format = $(formatField).val();
 		$(formatField).change(function() {
-			// Confirm post format change
-			if(window.confirm(dotclear.msg.confirm_change_post_format_noconvert)){
-				excerptTb.switchMode(this.value);
-				contentTb.switchMode(this.value);
-				last_post_format = $(this).val();
-			}else{
-				// Restore last format if change cancelled
-				$(this).val(last_post_format);
-			}
+			excerptTb.switchMode(this.value);
+			contentTb.switchMode(this.value);
 		});
 		
@@ -123,8 +115,4 @@
 			hide: $('#post_notes').val() == ''
 		});
-		$('#new_cat').toggleWithLegend(
-			$('#new_cat').parent().children().not('#new_cat'),
-			{} // no cookie on new category as we don't use this every day
-		);
 		$('#post_lang').parent().toggleWithLegend($('#post_lang'),{
 			cookie: 'dcx_post_lang'
@@ -161,4 +149,5 @@
 		var a = document.createElement('a');
 		a.href = '#';
+		a.className = 'button';
 		$(a).click(function() {
 			var params = {
Index: admin/js/_posts_actions.js
===================================================================
--- admin/js/_posts_actions.js	(revision 1419)
+++ admin/js/_posts_actions.js	(revision 1035)
@@ -6,7 +6,3 @@
 		matchContains: true
 	});
-	$('#new_cat').toggleWithLegend(
-		$('#new_cat').parent().children().not('#new_cat'),
-		{} // no cookie on new category as we don't use this every day
-	);
 });
Index: admin/js/_users_actions.js
===================================================================
--- admin/js/_users_actions.js	(revision 1432)
+++ admin/js/_users_actions.js	(revision 935)
@@ -1,5 +1,4 @@
 jQuery.fn.updatePermissionsForm = function() {
 	return this.each(function() {
-		
 		var perms = {};
 		var re = /^perm\[(.+?)\]\[(.+?)\]$/;
@@ -13,5 +12,4 @@
 				continue;
 			}
-			var prop;
 			prop = e.name.match(re);
 			if (!prop) {
@@ -22,48 +20,35 @@
 			}
 			perms[prop[1]][prop[2]] = e;
-			
-			// select related permissions for admin
-			if (prop[2] == 'admin') {
-				$(e).click(function(){
-					P = this.name.match(re);
-					
-					perms[P[1]]['usage'].checked = this.checked;
-					perms[P[1]]['publish'].checked = this.checked;
-					perms[P[1]]['delete'].checked = this.checked;
-					perms[P[1]]['contentadmin'].checked = this.checked;
-					perms[P[1]]['categories'].checked = this.checked;
-					perms[P[1]]['media'].checked = this.checked;
-					perms[P[1]]['media_admin'].checked = this.checked;
-					perms[P[1]]['usage'].disabled = this.checked;
-					perms[P[1]]['publish'].disabled = this.checked;
-					perms[P[1]]['delete'].disabled = this.checked;
-					perms[P[1]]['contentadmin'].disabled = this.checked;
-					perms[P[1]]['categories'].disabled = this.checked;
-					perms[P[1]]['media'].disabled = this.checked;
-					perms[P[1]]['media_admin'].disabled = this.checked;
-					
-				});
-			// select related permissions for content admin
-			} else if (prop[2] == 'contentadmin') {
-				$(e).click(function(){
-					P = this.name.match(re);
-					
-					perms[P[1]]['usage'].checked = this.checked;
-					perms[P[1]]['publish'].checked = this.checked;
-					perms[P[1]]['delete'].checked = this.checked;
-					perms[P[1]]['usage'].disabled = this.checked;
-					perms[P[1]]['publish'].disabled = this.checked;
-					perms[P[1]]['delete'].disabled = this.checked;
-					
-				});
-			// select related permissions for media admin
-			} else if (prop[2] == 'media_admin') {
-				$(e).click(function(){
-					P = this.name.match(re);
-					
-					perms[P[1]]['media'].checked = this.checked;
-					perms[P[1]]['media'].disabled = this.checked;
-					
-				});
+		}
+		
+		// Update elements status
+		var E;
+		for (blog in perms) {
+			for (perm in perms[blog]) {
+				E = perms[blog][perm];
+				E.onclick = function() {};
+				
+				if (perm == 'admin' && !E.disabled) {
+					perms[blog]['usage'].disabled = E.checked;
+					perms[blog]['publish'].disabled = E.checked;
+					perms[blog]['delete'].disabled = E.checked;
+					perms[blog]['contentadmin'].disabled = E.checked;
+					perms[blog]['categories'].disabled = E.checked;
+					perms[blog]['media'].disabled = E.checked;
+					perms[blog]['media_admin'].disabled = E.checked;
+					E.onclick = function() { $(this.form).updatePermissionsForm(); };
+				} else if (perm == 'contentadmin' && !E.disabled) {
+					perms[blog]['usage'].checked = E.checked;
+					perms[blog]['publish'].checked = E.checked;
+					perms[blog]['delete'].checked = E.checked;
+					perms[blog]['usage'].disabled = E.checked;
+					perms[blog]['publish'].disabled = E.checked;
+					perms[blog]['delete'].disabled = E.checked;
+					E.onclick = function() { $(this.form).updatePermissionsForm(); };
+				} else if (perm == 'media_admin' && !E.disabled) {
+					perms[blog]['media'].checked = E.checked;
+					perms[blog]['media'].disabled = E.checked;
+					E.onclick = function() { $(this.form).updatePermissionsForm(); };
+				}
 			}
 		}
Index: admin/js/common.js
===================================================================
--- admin/js/common.js	(revision 1140)
+++ admin/js/common.js	(revision 1303)
@@ -153,4 +153,5 @@
 			}
 		}
+		$('p#help-button span').text($('#content').hasClass('with-help') ? dotclear.msg.help_hide : dotclear.msg.help);
 		sizeBox();
 		return false;
@@ -196,5 +197,5 @@
 	sizeBox();
 
-	var img = $('<span id="help-button">'+dotclear.msg.help+'</span>');
+	var img = $('<p id="help-button"><span>'+dotclear.msg.help+'</span></p>');
 	var select = $();
 	img.click(function() { return toggle(); });
Index: admin/js/jquery/jquery.pageTabs.js
===================================================================
--- admin/js/jquery/jquery.pageTabs.js	(revision 1223)
+++ admin/js/jquery/jquery.pageTabs.js	(revision 1280)
@@ -39,10 +39,9 @@
 				li = document.createElement('li');
 				a = document.createElement('a');
-				$(a).html(this.title);
+				a.appendChild(document.createTextNode(this.title));
 				this.title = '';
 				a.href = '#';
 				a.fn = This.showDiv;
 				a.index = this.id || i;
-				li.id = "part-tabs-"+a.index;
 				a.obj = This;
 				jQuery(a).click(function() { this.fn.call(this.obj,this.index); return false; });
Index: admin/js/jquery/jquery.pwstrength.js
===================================================================
--- admin/js/jquery/jquery.pwstrength.js	(revision 1371)
+++ 	(revision )
@@ -1,66 +1,0 @@
-/**
- * jquery.pwstrength http://matoilic.github.com/jquery.pwstrength
- *
- * @version v0.1.1
- * @author Mato Ilic <info@matoilic.ch>
- * @copyright 2013 Mato Ilic
- *
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
- */
-;(function($) {
-    $.pwstrength = function(password) {
-        var score = 0, length = password.length, upperCase, lowerCase, digits, nonAlpha;
-        
-        if(length < 5) score += 0;
-        else if(length < 8) score += 5;
-        else if(length < 16) score += 10;
-        else score += 15;
-        
-        lowerCase = password.match(/[a-z]/g);
-        if(lowerCase) score += 1;
-        
-        upperCase = password.match(/[A-Z]/g);
-        if(upperCase) score += 5;
-        
-        if(upperCase && lowerCase) score += 2;
-        
-        digits = password.match(/\d/g);
-        if(digits && digits.length > 1) score += 5;
-        
-        nonAlpha = password.match(/\W/g)
-        if(nonAlpha) score += (nonAlpha.length > 1) ? 15 : 10;
-        
-        if(upperCase && lowerCase && digits && nonAlpha) score += 15;
-
-        if(password.match(/\s/)) score += 10;
-
-        if(score < 15) return 0;
-        if(score < 20) return 1;
-        if(score < 35) return 2;
-        if(score < 50) return 3;
-        return 4;
-    };
-    
-    function updateIndicator(event) {
-        var strength = $.pwstrength($(this).val()), options = event.data, klass;
-        klass = options.classes[strength];
-        
-        options.indicator.removeClass(options.indicator.data('pwclass'));
-        options.indicator.data('pwclass', klass);
-        options.indicator.addClass(klass);
-        options.indicator.find(options.label).html(options.texts[strength]);
-    }
-    
-    $.fn.pwstrength = function(options) {
-        var options = $.extend({
-            label: '.label',
-            classes: ['pw-very-weak', 'pw-weak', 'pw-mediocre', 'pw-strong', 'pw-very-strong'],
-            texts: ['very weak', 'weak', 'mediocre', 'strong', 'very strong']
-        }, options || {});
-        options.indicator = $('#' + this.data('indicator'));
-        
-        return this.keyup(options, updateIndicator);
-    };
-})(jQuery);
Index: admin/js/jsUpload/jquery.fileupload-process.js
===================================================================
--- admin/js/jsUpload/jquery.fileupload-process.js	(revision 1144)
+++ admin/js/jsUpload/jquery.fileupload-process.js	(revision 1320)
@@ -1,4 +1,4 @@
 /*
- * jQuery File Upload Processing Plugin 1.1
+ * jQuery File Upload Processing Plugin 1.2.2
  * https://github.com/blueimp/jQuery-File-Upload
  *
@@ -99,12 +99,18 @@
             var processQueue = [];
             $.each(options.processQueue, function () {
-                var settings = {};
+                var settings = {},
+                    action = this.action,
+                    prefix = this.prefix === true ? action : this.prefix;
                 $.each(this, function (key, value) {
                     if ($.type(value) === 'string' &&
                             value.charAt(0) === '@') {
-                        settings[key] = options[value.slice(1)];
+                        settings[key] = options[
+                            value.slice(1) || (prefix ? prefix +
+                                key.charAt(0).toUpperCase() + key.slice(1) : key)
+                        ];
                     } else {
                         settings[key] = value;
                     }
+
                 });
                 processQueue.push(settings);
@@ -128,5 +134,5 @@
                     this._trigger('processstart');
                 }
-                $.each(data.files, function (index, file) {
+                $.each(data.files, function (index) {
                     var opts = index ? $.extend({}, options) : options,
                         func = function () {
Index: admin/js/jsUpload/jquery.fileupload-ui.js
===================================================================
--- admin/js/jsUpload/jquery.fileupload-ui.js	(revision 1206)
+++ admin/js/jsUpload/jquery.fileupload-ui.js	(revision 1320)
@@ -1,4 +1,4 @@
 /*
- * jQuery File Upload User Interface Plugin 8.2.1
+ * jQuery File Upload User Interface Plugin 8.7.1
  * https://github.com/blueimp/jQuery-File-Upload
  *
@@ -20,5 +20,7 @@
             'jquery',
             'tmpl',
-            './jquery.fileupload-resize',
+            './jquery.fileupload-image',
+            './jquery.fileupload-audio',
+            './jquery.fileupload-video',
             './jquery.fileupload-validate'
         ], factory);
@@ -104,19 +106,7 @@
                     );
                 });
-
-            /*
-             *  
-             *  Activation du bouton si un fichier trouvé
-             */
-                var fileUploadButtonBar = that.element.find('.fileupload-buttonbar');
-                fileUploadButtonBar.find('.start').prop('disabled', false);
-                fileUploadButtonBar.find('.start').removeClass('disabled');
-             /*
-             *
-             */
             },
             // Callback for the start of each file upload request:
             send: function (e, data) {
-                $(this).find('.start').hide();
                 var that = $(this).data('blueimp-fileupload') ||
                         $(this).data('fileupload');
@@ -140,5 +130,4 @@
             // Callback for successful uploads:
             done: function (e, data) {
-
                 var that = $(this).data('blueimp-fileupload') ||
                         $(this).data('fileupload'),
@@ -151,6 +140,6 @@
                     data.context.each(function (index) {
                         var file = files[index] ||
-                                {error: 'Empty file upload result'},
-                            deferred = that._addFinishedDeferreds();
+                                {error: 'Empty file upload result'};
+                        deferred = that._addFinishedDeferreds();
                         that._transition($(this)).done(
                             function () {
@@ -171,6 +160,7 @@
                     });
                 } else {
-                    template = that._renderDownload(files)
-                        .appendTo(that.options.filesContainer);
+                    template = that._renderDownload(files)[
+                        that.options.prependFiles ? 'prependTo' : 'appendTo'
+                    ](that.options.filesContainer);
                     that._forceReflow(template);
                     deferred = that._addFinishedDeferreds();
@@ -227,6 +217,7 @@
                     });
                 } else if (data.errorThrown !== 'abort') {
-                    data.context = that._renderUpload(data.files)
-                        .appendTo(that.options.filesContainer)
+                    data.context = that._renderUpload(data.files)[
+                        that.options.prependFiles ? 'prependTo' : 'appendTo'
+                    ](that.options.filesContainer)
                         .data('data', data);
                     that._forceReflow(data.context);
@@ -281,12 +272,9 @@
             // Callback for uploads start, equivalent to the global ajaxStart event:
             start: function (e) {
-                $(this).find('.start').hide();
                 var that = $(this).data('blueimp-fileupload') ||
-                $(this).data('fileupload');
+                        $(this).data('fileupload');
                 that._resetFinishedDeferreds();
                 that._transition($(this).find('.fileupload-progress')).done(
-
                     function () {
-
                         that._trigger('started', e);
                     }
@@ -295,5 +283,4 @@
             // Callback for uploads stop, equivalent to the global ajaxStop event:
             stop: function (e) {
-                $(this).find('.start').show();
                 var that = $(this).data('blueimp-fileupload') ||
                         $(this).data('fileupload'),
@@ -312,17 +299,4 @@
                     }
                 );
-            /*
-             *  Recherche des fichers restants à uploader
-             *  Désactivation du bouton si plus rien
-             */
-             var filesList = that.options.filesContainer;
-             if(filesList.find('.start').size() == 0) {
-                var fileUploadButtonBar = that.element.find('.fileupload-buttonbar');
-                fileUploadButtonBar.find('.start').prop('disabled', true);
-                fileUploadButtonBar.find('.start').addClass('disabled');
-             }
-            /*
-             *
-             */
             },
             processstart: function () {
@@ -335,7 +309,6 @@
             destroy: function (e, data) {
                 var that = $(this).data('blueimp-fileupload') ||
-                        $(this).data('fileupload');
-                if (data.url) {
-                    $.ajax(data).done(function () {
+                        $(this).data('fileupload'),
+                    removeNode = function () {
                         that._transition(data.context).done(
                             function () {
@@ -344,5 +317,9 @@
                             }
                         );
-                    });
+                    };
+                if (data.url) {
+                    $.ajax(data).done(removeNode);
+                } else {
+                    removeNode();
                 }
             }
@@ -637,4 +614,7 @@
             this._super();
             this._resetFinishedDeferreds();
+            if (!$.support.fileInput) {
+                this._disableFileInputButton();
+            }
         },
 
Index: admin/js/jsUpload/jquery.fileupload.js
===================================================================
--- admin/js/jsUpload/jquery.fileupload.js	(revision 1144)
+++ admin/js/jsUpload/jquery.fileupload.js	(revision 1320)
@@ -1,4 +1,4 @@
 /*
- * jQuery File Upload Plugin 5.31.1
+ * jQuery File Upload Plugin 5.32.2
  * https://github.com/blueimp/jQuery-File-Upload
  *
@@ -11,5 +11,5 @@
 
 /*jslint nomen: true, unparam: true, regexp: true */
-/*global define, window, document, File, Blob, FormData, location */
+/*global define, window, document, location, File, Blob, FormData */
 
 (function (factory) {
@@ -28,4 +28,16 @@
     'use strict';
 
+    // Detect file input support, based on
+    // http://viljamis.com/blog/2012/file-upload-support-on-mobile/
+    $.support.fileInput = !(new RegExp(
+        // Handle devices which give false positives for the feature detection:
+        '(Android (1\\.[0156]|2\\.[01]))' +
+            '|(Windows Phone (OS 7|8\\.0))|(XBLWP)|(ZuneWP)|(WPDesktop)' +
+            '|(w(eb)?OSBrowser)|(webOS)' +
+            '|(Kindle/(1\\.0|2\\.[05]|3\\.0))'
+    ).test(window.navigator.userAgent) ||
+        // Feature detection for all other devices:
+        $('<input type="file">').prop('disabled'));
+
     // The FileReader API is not actually used, but works as feature detection,
     // as e.g. Safari supports XHR file uploads via the FormData API,
@@ -33,4 +45,8 @@
     $.support.xhrFileUpload = !!(window.XMLHttpRequestUpload && window.FileReader);
     $.support.xhrFormDataFileUpload = !!window.FormData;
+
+    // Detect support for Blob slicing (required for chunked uploads):
+    $.support.blobSlice = window.Blob && (Blob.prototype.slice ||
+        Blob.prototype.webkitSlice || Blob.prototype.mozSlice);
 
     // The fileupload widget listens for change events on file input fields defined
@@ -145,11 +161,14 @@
             // widget (via file input selection, drag & drop, paste or add API call).
             // If the singleFileUploads option is enabled, this callback will be
-            // called once for each file in the selection for XHR file uplaods, else
+            // called once for each file in the selection for XHR file uploads, else
             // once for each file selection.
+            //
             // The upload starts when the submit method is invoked on the data parameter.
             // The data object contains a files property holding the added files
-            // and allows to override plugin options as well as define ajax settings.
+            // and allows you to override plugin options as well as define ajax settings.
+            //
             // Listeners for this callback can also be bound the following way:
             // .bind('fileuploadadd', func);
+            //
             // data.submit() returns a Promise object and allows to attach additional
             // handlers using jQuery's Deferred callbacks:
@@ -233,4 +252,9 @@
             'forceIframeTransport'
         ],
+
+        _blobSlice: $.support.blobSlice && function () {
+            var slice = this.slice || this.webkitSlice || this.mozSlice;
+            return slice.apply(this, arguments);
+        },
 
         _BitrateTimer: function () {
@@ -380,7 +404,9 @@
                 options.headers['Content-Range'] = options.contentRange;
             }
-            if (!multipart) {
+            if (!multipart || options.blob || !this._isInstanceOf('File', file)) {
                 options.headers['Content-Disposition'] = 'attachment; filename="' +
                     encodeURI(file.name) + '"';
+            }
+            if (!multipart) {
                 options.contentType = file.type;
                 options.data = options.blob || file;
@@ -415,6 +441,4 @@
                     }
                     if (options.blob) {
-                        options.headers['Content-Disposition'] = 'attachment; filename="' +
-                            encodeURI(file.name) + '"';
                         formData.append(paramName, options.blob, file.name);
                     } else {
@@ -440,4 +464,5 @@
 
         _initIframeSettings: function (options) {
+            var targetHost = $('<a></a>').prop('href', options.url).prop('host');
             // Setting the dataType to iframe enables the iframe transport:
             options.dataType = 'iframe ' + (options.dataType || '');
@@ -445,6 +470,5 @@
             options.formData = this._getFormData(options);
             // Add redirect url to form data on cross-domain uploads:
-            if (options.redirect && $('<a></a>').prop('href', options.url)
-                    .prop('host') !== location.host) {
+            if (options.redirect && targetHost && targetHost !== location.host) {
                 options.formData.push({
                     name: options.redirectParamName || 'redirect',
@@ -628,10 +652,11 @@
         // upload requests:
         _chunkedUpload: function (options, testOnly) {
+            options.uploadedBytes = options.uploadedBytes || 0;
             var that = this,
                 file = options.files[0],
                 fs = file.size,
-                ub = options.uploadedBytes = options.uploadedBytes || 0,
+                ub = options.uploadedBytes,
                 mcs = options.maxChunkSize || fs,
-                slice = file.slice || file.webkitSlice || file.mozSlice,
+                slice = this._blobSlice,
                 dfd = $.Deferred(),
                 promise = dfd.promise(),
@@ -851,5 +876,6 @@
                     pipe = slot.pipe(send);
                 } else {
-                    pipe = (this._sequence = this._sequence.pipe(send, send));
+                    this._sequence = this._sequence.pipe(send, send);
+                    pipe = this._sequence;
                 }
                 // Return the piped Promise object, enhanced with an abort method,
@@ -1101,7 +1127,7 @@
 
         _onDrop: function (e) {
+            e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;
             var that = this,
-                dataTransfer = e.dataTransfer = e.originalEvent &&
-                    e.originalEvent.dataTransfer,
+                dataTransfer = e.dataTransfer,
                 data = {};
             if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {
@@ -1117,6 +1143,6 @@
 
         _onDragOver: function (e) {
-            var dataTransfer = e.dataTransfer = e.originalEvent &&
-                e.originalEvent.dataTransfer;
+            e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;
+            var dataTransfer = e.dataTransfer;
             if (dataTransfer) {
                 if (this._trigger('dragover', e) === false) {
@@ -1140,7 +1166,9 @@
                 });
             }
-            this._on(this.options.fileInput, {
-                change: this._onChange
-            });
+            if ($.support.fileInput) {
+                this._on(this.options.fileInput, {
+                    change: this._onChange
+                });
+            }
         },
 
@@ -1276,4 +1304,8 @@
                                 return;
                             }
+                            if (!files.length) {
+                                dfd.reject();
+                                return;
+                            }
                             data.files = files;
                             jqXHR = that._onSend(null, data).then(
Index: admin/js/jsUpload/jquery.iframe-transport.js
===================================================================
--- admin/js/jsUpload/jquery.iframe-transport.js	(revision 1144)
+++ admin/js/jsUpload/jquery.iframe-transport.js	(revision 1320)
@@ -1,4 +1,4 @@
 /*
- * jQuery Iframe Transport Plugin 1.6.2
+ * jQuery Iframe Transport Plugin 1.7
  * https://github.com/blueimp/jQuery-File-Upload
  *
@@ -171,5 +171,13 @@
 
     // The iframe transport returns the iframe content document as response.
-    // The following adds converters from iframe to text, json, html, and script:
+    // The following adds converters from iframe to text, json, html, xml
+    // and script.
+    // Please note that the Content-Type for JSON responses has to be text/plain
+    // or text/html, if the browser doesn't include application/json in the
+    // Accept header, else IE will show a download dialog.
+    // The Content-Type for XML responses on the other hand has to be always
+    // application/xml or text/xml, so IE properly parses the XML response.
+    // See also
+    // https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#content-type-negotiation
     $.ajaxSetup({
         converters: {
@@ -182,4 +190,10 @@
             'iframe html': function (iframe) {
                 return iframe && $(iframe[0].body).html();
+            },
+            'iframe xml': function (iframe) {
+                var xmlDoc = iframe && iframe[0];
+                return xmlDoc && $.isXMLDoc(xmlDoc) ? xmlDoc :
+                        $.parseXML((xmlDoc.XMLDocument && xmlDoc.XMLDocument.xml) ||
+                            $(xmlDoc.body).html());
             },
             'iframe script': function (iframe) {
Index: admin/js/prelude.js
===================================================================
--- admin/js/prelude.js	(revision 447)
+++ admin/js/prelude.js	(revision 1446)
@@ -6,5 +6,6 @@
 			aElts[i].className="hidden";
 			aElts[i].onfocus=function() {
-				this.className="";
+				$('#prelude a').removeClass('hidden');
+				$('#main-menu').css('padding-top', '4.5em');
 			}
 		}
@@ -19,2 +20,7 @@
 }
 addLoadEvent(aFocus);
+
+// init
+$(function() {
+	$('#main-menu').css('padding-top', '.5em');
+});
