Index: .hgignore
===================================================================
--- .hgignore	(revision 1171)
+++ .hgignore	(revision 1011)
Index: .hgsubstate
===================================================================
--- .hgsubstate	(revision 1225)
+++ .hgsubstate	(revision 1102)
@@ -1,1 +1,1 @@
-e2e1a2c966318f4c5ea67f3c3de72ae0ac79b333 inc/libs/clearbricks
+789e7f2b4844160f4dc7d2795cfa1e6f4fd53a5c inc/libs/clearbricks
Index: .hgtags
===================================================================
--- .hgtags	(revision 1219)
+++ .hgtags	(revision 871)
@@ -12,3 +12,2 @@
 6fce226121140735a51a8f447c80f1dacd2974ea 2.4.4
 514d5121a12586b7ff320924d44028b677a01020 2.4.4
-baf879af43beea9764d920c2facd7226e90c5cf3 2.5.1
Index: CHANGELOG
===================================================================
--- CHANGELOG	(revision 1216)
+++ CHANGELOG	(revision 1114)
@@ -1,11 +1,2 @@
-Dotclear 2.5.1 - 2013-07-20
-===========================================================
-* Security fix: Replacement of swfupload.swf by a jQuery plugin
-* Security enhancement: Strenghened lists display
-* Thumbnails quality improved
-* Minor enhancements
-* Various bug fixes
-* Various cosmetic adjustments
-
 Dotclear 2.5.0 - 2013-03-12
 ===========================================================
Index: admin/auth.php
===================================================================
--- admin/auth.php	(revision 1179)
+++ admin/auth.php	(revision 794)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/blog.php
===================================================================
--- admin/blog.php	(revision 1179)
+++ admin/blog.php	(revision 565)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/blog_del.php
===================================================================
--- admin/blog_del.php	(revision 1179)
+++ admin/blog_del.php	(revision 500)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/blog_pref.php
===================================================================
--- admin/blog_pref.php	(revision 1179)
+++ admin/blog_pref.php	(revision 1073)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/blog_theme.php
===================================================================
--- admin/blog_theme.php	(revision 1179)
+++ admin/blog_theme.php	(revision 907)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/blogs.php
===================================================================
--- admin/blogs.php	(revision 1179)
+++ admin/blogs.php	(revision 907)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/categories.php
===================================================================
--- admin/categories.php	(revision 1179)
+++ admin/categories.php	(revision 1030)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/category.php
===================================================================
--- admin/category.php	(revision 1179)
+++ admin/category.php	(revision 907)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/comment.php
===================================================================
--- admin/comment.php	(revision 1179)
+++ admin/comment.php	(revision 907)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/comments.php
===================================================================
--- admin/comments.php	(revision 1179)
+++ admin/comments.php	(revision 1054)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -225,11 +225,13 @@
 	'</form>';
 	
-	$spam_count = $core->blog->getComments(array('comment_status'=>-2),true)->f(0);
-	if ($spam_count > 0) {
+	if (!$with_spam) {
+
+		$spam_count = $core->blog->getComments(array('comment_status'=>-2),true)->f(0);
 		
-		echo 
-			'<form action="comments.php" method="post" class="fieldset">';
-
-		if (!$with_spam || ($status != -2)) {
+		if ($spam_count > 0) {
+			
+			echo 
+				'<form action="comments.php" method="post" class="fieldset">';
+
 			if ($spam_count == 1) {
 				echo '<p>'.sprintf(__('You have one spam comments.'),'<strong>'.$spam_count.'</strong>').' '.
@@ -239,14 +241,14 @@
 				'<a href="comments.php?status=-2">'.__('Show them.').'</a></p>';
 			}
+			
+			echo
+				$core->formNonce().
+				'<input name="delete_all_spam" class="delete" type="submit" value="'.__('Delete all spams').'" /></p>';
+
+			# --BEHAVIOR-- adminCommentsSpamForm
+			$core->callBehavior('adminCommentsSpamForm',$core);
+
+			echo '</form>';
 		}
-		
-		echo
-			$core->formNonce().
-			'<input name="delete_all_spam" class="delete" type="submit" value="'.__('Delete all spams').'" /></p>';
-
-		# --BEHAVIOR-- adminCommentsSpamForm
-		$core->callBehavior('adminCommentsSpamForm',$core);
-
-		echo '</form>';
 	}
 	
Index: admin/comments_actions.php
===================================================================
--- admin/comments_actions.php	(revision 1179)
+++ admin/comments_actions.php	(revision 1041)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/index.php
===================================================================
--- admin/index.php	(revision 1179)
+++ admin/index.php	(revision 1077)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/install/check.php
===================================================================
--- admin/install/check.php	(revision 1179)
+++ admin/install/check.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/install/index.php
===================================================================
--- admin/install/index.php	(revision 1179)
+++ admin/install/index.php	(revision 557)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -198,5 +198,5 @@
 		# Add user interface options
 		$core->auth->user_prefs->addWorkspace('interface');
-		$core->auth->user_prefs->interface->put('enhanceduploader',true,'boolean','',null,true);
+		$core->auth->user_prefs->interface->put('enhanceduploader',false,'boolean','',null,true);
 
 		# Add default favorites
Index: admin/install/wizard.php
===================================================================
--- admin/install/wizard.php	(revision 1179)
+++ admin/install/wizard.php	(revision 858)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/js/_blog_pref.js
===================================================================
--- admin/js/_blog_pref.js	(revision 1136)
+++ admin/js/_blog_pref.js	(revision 175)
@@ -10,5 +10,5 @@
 	$("p#urlwarning").remove();
 	if (errorMsg != '') {
-		$("#blog_url").parents('p').after('<p id="urlwarning" class="warning">'+errorMsg+'</p>');
+		$("#blog_url").parents('p').before('<p id="urlwarning" class="error">'+errorMsg+'</p>');
 	}
 }
Index: admin/js/_index.js
===================================================================
--- admin/js/_index.js	(revision 1140)
+++ admin/js/_index.js	(revision 454)
@@ -66,4 +66,4 @@
 	$('#quick h3').toggleWithLegend($('#quick').children().not('h3'),{
 		cookie: 'dcx_quick_entry'
-	});
+	}, positionFooter);
 });
Index: admin/js/_media.js
===================================================================
--- admin/js/_media.js	(revision 1191)
+++ admin/js/_media.js	(revision 1039)
@@ -1,85 +1,8 @@
 $(function() {
-	if ($('#fileupload').length==0) {
-		return;
-	}
-
-	$('.button.add').click(function(e) {
-		// Use the native click() of the file input.
-		$('#upfile').click();
-		e.preventDefault();
-	});
-
-	$('.button.cancel', '#fileupload').click(function(e) {
-		$('.button.cancel, .button.start','#fileupload .fileupload-buttonbar').hide();
-	});
-
-	$('.button.clean', '#fileupload').click(function(e) {
-		$('.fileupload-ctrl .files .template-download', '#fileupload').slideUp(500, function() {
-			$(this).remove();
-		});
-		$(this).hide();
-		e.preventDefault();
-	});
-
-	$('#fileupload').fileupload({
-		url: $('#fileupload').attr('action'),
-		autoUpload: false,
-		sequentialUploads: true,
-		disabled: true
-	}).bind('fileuploadadd', function(e, data) {
-		$('.button.cancel, .button.start', '#fileupload .fileupload-buttonbar').show();
-	}).bind('fileuploaddone', function(e, data) {
-		if (data.result.files[0].html !==undefined) {
-			$('.media-list p.clear').before(data.result.files[0].html);
-		}
-		$('.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();
-	    }
-	});
-
-	var $container = $('#fileupload').parent().parent();
-	var $msg,label;
-
-	if ($container.hasClass('enhanced_uploader')) {
-		$msg = dotclear.msg.enhanced_uploader_disable;
-		label = dotclear.jsUpload.msg.choose_files;
-		$('#fileupload').fileupload({disabled:false});
-	} else {
-		$msg = dotclear.msg.enhanced_uploader_activate;
-		label = dotclear.jsUpload.msg.choose_file;
-	}
-
-	$('<p class="clear"><a class="enhanced-toggle" href="#">' + $msg + '</a></p>').click( function() {
-		if ($container.hasClass('enhanced_uploader')) {
-			$msg = dotclear.msg.enhanced_uploader_activate;
-			label = dotclear.jsUpload.msg.choose_file;
-			$('#upfile').attr('multiple', false);
-
-			// when a user has clicked enhanced_uploader, and has added files
-			// We must remove files in table
-			$('.files .upload-file', '#fileupload').remove();
-			$('.button.cancel, .button.start','#fileupload .fileupload-buttonbar').hide();
-			$('.button.start','#fileupload').show();
-			$('#fileupload').fileupload({disabled:true});
-		} else {
-			$msg = dotclear.msg.enhanced_uploader_disable;
-			label = dotclear.jsUpload.msg.choose_files;
-			$('#upfile').attr('multiple', true);
-			$('.button.start','#fileupload').hide();
-			$('#fileupload').fileupload({disabled:false});
-		}
-		$(this).find('a').text($msg);
-		$('.add-label', '#fileupload').text(label);
-
-		$container.toggleClass('enhanced_uploader');
-	}).appendTo($('#fileupload'));
-
 	// Replace remove links by a POST on hidden form
 	fileRemoveAct();
-
+	
 	function fileRemoveAct() {
-		$('a.media-remove').live('click', function() {
+		$('a.media-remove').click(function() {
 			var m_name = $(this).parents('ul').find('li:first>a').text();
 			if (window.confirm(dotclear.msg.confirm_delete_media.replace('%s',m_name))) {
@@ -92,3 +15,77 @@
 		});
 	}
+	
+	if (!$.browser.opera) {
+		var upldr = $('<a href="#" id="cu-enable">' + dotclear.msg.activate_enhanced_uploader + '</a>').click( function() {
+			candyUploadInit();
+			return false;
+		});
+		$('#media-upload').append($('<div></div>').append(upldr));
+		if ((dotclear.candyUpload_force_init == '1') || (($.cookie('dc_candy_upl') == 1))) {
+			candyUploadInit();
+		}
+	}
+	
+	function candyUploadInit()
+	{
+		var candy_upload_success = false;
+		var candy_upload_form_url = $('#media-upload').attr('action') + '&file_sort=date-desc&d=' + $('#media-upload input[name=d]').val();
+		var candy_upload_limit = $('#media-upload input[name=MAX_FILE_SIZE]').val();
+		$('#media-upload').candyUpload({
+			upload_url: dotclear.candyUpload.base_url + '/media.php',
+			flash_movie: dotclear.candyUpload.movie_url,
+			file_size_limit: candy_upload_limit + 'b',
+			params: 'swfupload=1&amp;' + dotclear.candyUpload.params,
+			
+			callbacks: {
+				createControls: function() {
+					var _this = this;
+					this.ctrl.btn_browse.hide();
+					this.ctrl.msg.html(dotclear.msg.load_enhanced_uploader);
+					var l = $('<a href="#">' + dotclear.msg.disable_enhanced_uploader + '</a>').click(function() {
+						_this.upldr.destroy();
+						_this.ctrl.block.empty().remove();
+						$('#media-upload').show();
+						delete _this;
+						$.cookie('dc_candy_upl','',{expires:-1});
+						return false;
+					});
+					this.ctrl.disable = $('<div class="cu-disable"></div>').append(l).appendTo(this.ctrl.block);
+				},
+				flashReady: function() {
+					var _this = this;
+					this.ctrl.msg.fadeOut('fast',function() {
+						$(this).text(_this.locales.no_file_in_queue).fadeIn('fast');
+						_this.ctrl.btn_browse.fadeIn('fast',function() {
+							_this.upldr.container.children().css({
+								width: $('.cu-btn-browse').width(),
+								height: $('.cu-btn-browse').height()
+							});
+						});
+					});
+				},
+				uploadSuccess: function(o,data) {
+					if (data == 'ok') {
+						candy_upload_success = true;
+						this.fileMsg(o.id,this.locales.file_uploaded);
+					} else {
+						this.fileErrorMsg(o.id,data);
+					}
+					
+					// uploads finished and at least one success
+					if (candy_upload_success && $('div.cu-file:has(span.cu-filecancel a)',this.ctrl.files).length == 0) {
+						$.cookie('dc_candy_upl','1',{expires: 30});
+						$.get(candy_upload_form_url,function(data) {
+							var media = $('div.media-list');
+							media.after($('div.media-list',data)).remove();
+							fileRemoveAct();
+						});
+					}
+				},
+				fileQueued: function() {
+					positionFooter();
+				}
+			}
+		});
+	}
 });
Index: admin/js/_post.js
===================================================================
--- admin/js/_post.js	(revision 1140)
+++ admin/js/_post.js	(revision 740)
@@ -8,5 +8,5 @@
 	$(img).css('cursor','pointer');
 	img.line = line;
-	img.onclick = function() { dotclear.viewCommentContent(this,this.line); };
+	img.onclick = function() { dotclear.viewCommentContent(this,this.line); positionFooter(); };
 	
 	td.insertBefore(img,td.firstChild);
Index: admin/js/common.js
===================================================================
--- admin/js/common.js	(revision 1140)
+++ admin/js/common.js	(revision 1002)
@@ -84,9 +84,9 @@
 			$(i).get(0).src = p.img_on_src;
 			$(i).get(0).alt = p.img_on_alt;
-			target.hide(speed);
+			target.hide(speed, positionFooter);
 		} else {
 			$(i).get(0).src = p.img_off_src;
 			$(i).get(0).alt = p.img_off_alt;
-			target.show(speed);
+			target.show(speed, positionFooter);
 			if (p.fn) {
 				p.fn.apply(target);
@@ -122,5 +122,5 @@
 		$(ctarget).css('cursor','pointer');
 		$(ctarget).click(function() {
-			toggle(i,p.speed);
+			toggle(i,p.speed, positionFooter);
 			return false;
 		});
@@ -315,4 +315,10 @@
 	}
 };
+
+/* Sticky footer
+-------------------------------------------------------- */
+function positionFooter() {
+	$('#footer').constantfooter();
+}
 
 /* On document ready
@@ -359,4 +365,8 @@
 		return true;
 	});
+
+	// Sticky footer
+	positionFooter();
+	$(window).resize(positionFooter);
 });
 
Index: admin/js/jquery/jquery.candyUpload.js
===================================================================
--- admin/js/jquery/jquery.candyUpload.js	(revision 536)
+++ admin/js/jquery/jquery.candyUpload.js	(revision 536)
@@ -0,0 +1,644 @@
+(function($) {
+	// We need to create a global SWFUpload object to store instances
+	window.SWFUpload = {
+		instances: new Array(),
+		movieCount: 0,
+		version: "2.2.0 Beta 2",
+		QUEUE_ERROR: {
+			QUEUE_LIMIT_EXCEEDED:	-100,
+			FILE_EXCEEDS_SIZE_LIMIT:	-110,
+			ZERO_BYTE_FILE:		-120,
+			INVALID_FILETYPE:		-130
+		},
+		UPLOAD_ERROR: {
+			HTTP_ERROR:				-200,
+			MISSING_UPLOAD_URL:			-210,
+			IO_ERROR:					-220,
+			SECURITY_ERROR:			-230,
+			UPLOAD_LIMIT_EXCEEDED:		-240,
+			UPLOAD_FAILED:				-250,
+			SPECIFIED_FILE_ID_NOT_FOUND:	-260,
+			FILE_VALIDATION_FAILED:		-270,
+			FILE_CANCELLED:			-280,
+			UPLOAD_STOPPED:			-290
+		},
+		FILE_STATUS: {
+			QUEUED:		-1,
+			IN_PROGRESS:	-2,
+			ERROR:		-3,
+			COMPLETE:		-4,
+			CANCELLED:	-5
+		},
+		BUTTON_ACTION: {
+			SELECT_FILE:	-100,
+			SELECT_FILES:	-110,
+			START_UPLOAD:	-120
+		},
+		CURSOR: {
+			ARROW:	-1,
+			HAND:	-2
+		},
+		WINDOW_MODE: {
+			WINDOW:		'window',
+			TRANSPARENT:	'transparent',
+			OPAQUE:		'opaque'
+		}
+	};
+	
+	$.uploader = function(settings,callbacks) {
+		return new $._uploader(settings,callbacks);
+	};
+	
+	$._uploader = function(settings,callbacks) {
+		var defaults = {
+			debug: false,
+			upload_url: '',
+			flash_movie: '',
+			movie_name: null,
+			params: null,
+			use_query_string: null,
+			requeue_on_error: false,
+			file_types: '*.*',
+			file_types_description: 'All files',
+			file_size_limit: 0,
+			file_upload_limit: 0,
+			file_queue_limit: -1,
+			target_element: null
+		};
+		this.params = $.extend(defaults,settings);
+		
+		var default_callbacks = {
+			flashReady: function() {},
+			fileDialogComplete: function() {},
+			fileDialogStart: function() {},
+			fileQueued: function() {},
+			fileQueueError: function() {},
+			uploadStart: function() {},
+			uploadProgress: function() {},
+			uploadError: function() {},
+			uploadSuccess: function() {},
+			uploadComplete: function() {},
+			debug: function() {}
+		};
+		this.callbacks = $.extend(default_callbacks,callbacks);
+		
+		return this.build();
+	};
+	
+	$._uploader.prototype = {
+		log: function(msg) {
+			if (!this.params.debug) { return; }
+			try {
+				console.log(msg);
+			} catch(e) {}
+		},
+		
+		/* Constructor */
+		build: function(settings) {
+			if (!this.params.upload_url || !this.params.movie_name) {
+				throw('Configuration error. Please make sure you specified movie_name and upload_url options.');
+			}
+			
+			if ($.browser.opera) {
+				return this;
+			}
+			
+			// Get a real bytes size limit (if we want to reuse it somewhere)
+			this.params.file_size_limit = this.getFileSizeLimit(this.params.file_size_limit);
+			
+			// Flash vars
+			var fv = new Array();
+			this.addFlashVar(fv,'debugEnabled',this.params.debug);
+			this.addFlashVar(fv,'movieName',this.params.movie_name);
+			this.addFlashVar(fv,'uploadURL',this.params.upload_url);
+			this.addFlashVar(fv,'fileTypes',this.params.file_types);
+			this.addFlashVar(fv,'fileTypesDescription',this.params.file_types_description);
+			this.addFlashVar(fv,'params',this.params.params);
+			this.addFlashVar(fv,'fileSizeLimit',this.params.file_size_limit + 'b');
+			this.addFlashVar(fv,'fileUploadLimit',this.params.file_upload_limit);
+			this.addFlashVar(fv,'fileQueueLimit',this.params.file_queue_limit);
+			this.addFlashVar(fv,'requeueOnError',this.params.requeue_on_error);
+			this.addFlashVar(fv,'buttonImageURL','');
+			this.addFlashVar(fv,'buttonWidth',500);
+			this.addFlashVar(fv,'buttonHeight',500);
+			this.addFlashVar(fv,'buttonText','');
+			this.addFlashVar(fv,'buttonTextTopPadding',0);
+			this.addFlashVar(fv,'buttonTextLeftPadding',0);
+			this.addFlashVar(fv,'buttonTextStyle','');
+			this.addFlashVar(fv,'buttonAction',this.params.upload_limit == 1 ? -100 : -110);
+			this.addFlashVar(fv,'buttonDisabled',false);
+			this.addFlashVar(fv,'buttonCursor',-2);
+			this.addFlashVar(fv,'button_window_mode','window');
+			
+			// Create SWFUpload Instance
+			this.flashBind();
+			
+			// Flash object
+			var flash =
+			'<object id="' + this.params.movie_name + '" data="' + this.params.flash_movie + '" ' +
+			'type="application/x-shockwave-flash" width="10" height="10">' +
+			'<param name="movie" value="' + this.params.flash_movie + '" />'+
+			'<param name="wmode" value="transparent" />'+
+			'<param name="menu" value="false" />'+
+			'<param name="allowScriptAccess" value="always" />'+
+			'<param name="flashvars" value="' + fv.join('&amp;') + '" />'+
+			'</object>';
+			
+			// Flash container
+			this.container = $('<span></span>');
+			if (this.params.target_element == null) {
+				this.container.css({
+					display: 'block',
+					position: 'absolute',
+					left: $(document).scrollLeft()+'px',
+					top: $(document).scrollTop()+'px',
+					width: '30px',
+					height: '30px',
+					background: '#f00'
+				});
+				
+				$('body').append(this.container);
+			} else {
+				$(this.params.target_element).append(this.container);
+				this.container.css({
+					display: 'block',
+					position: 'absolute',
+					top: 0,
+					left: 0,
+					zIndex: 1
+				});
+			}
+			this.container[0].innerHTML = flash;
+			this.movie = document.getElementById(this.params.movie_name);
+			
+			return this;
+		},
+		
+		addFlashVar: function(fv,n,v) {
+			if (v != null) {
+				fv.push(n + '=' + encodeURIComponent(v));
+			}
+		},
+		
+		// Bind flash events to callbacks.events
+		flashBind: function() {
+			_this = this;
+			var events = {
+				flashReady: function() {
+					if (window[_this.params.movie_name] == undefined) {
+						window[_this.params.movie_name] = _this.movie;
+					}
+					_this.flashBindEvent('flashReady',arguments);
+				},
+				fileDialogComplete: function() { _this.flashBindEvent('fileDialogComplete',arguments); },
+				fileDialogStart: function() { _this.flashBindEvent('fileDialogStart',arguments); },
+				fileQueued: function(file_object) { _this.flashBindEvent('fileQueued',arguments); },
+				fileQueueError: function(file_object,error_code,error_msg) { _this.flashBindEvent('fileQueueError',arguments); },
+				uploadStart: function() { _this.flashBindEvent('uploadStart',arguments); },
+				uploadProgress: function() { _this.flashBindEvent('uploadProgress',arguments); },
+				uploadError: function() { _this.flashBindEvent('uploadError',arguments); },
+				uploadSuccess: function() { _this.flashBindEvent('uploadSuccess',arguments); },
+				uploadComplete: function() { _this.flashBindEvent('uploadComplete',arguments); },
+				debug: function() { _this.flashBindEvent('debug',arguments); }
+			};
+			window.SWFUpload.instances[this.params.movie_name] = events;
+			window.SWFUpload.movieCount++;
+		},
+		
+		// Each flash event is called as callbacks.events([arg],...) with this = uploader object
+		flashEventQueue: [],
+		flashBindEvent: function(evt,a) {
+			a = a || new Array();
+			
+			var _this = this;
+			if ($.isFunction(this.callbacks[evt])) {
+				// Queue the event
+				this.flashEventQueue.push(function () {
+						this.callbacks[evt].apply(this,a);
+				});
+				
+				// Execute the next queued event
+				setTimeout(function () {
+					_this.flashExecuteNextEvent();
+				},0);
+			} else if (this.callbacks[evt] !== null) {
+				throw 'Event handler ' + evt + ' is unknown or is not a function';
+			}
+
+		},
+		flashExecuteNextEvent: function() {
+			var f = this.flashEventQueue ? this.flashEventQueue.shift() : null;
+			if ($.isFunction(f)) {
+				f.apply(this);
+			}
+		},
+		
+		destroy: function() {
+			try {
+				this.StopUpload();
+				$(this.movie).remove();
+				SWFUpload.instances[this.params.movie_name] = null;
+				SWFUpload.movieCount--;
+				delete SWFUpload.instances[this.movieName];
+				delete window[this.movieName];
+				
+				return true;
+			} catch(e) {
+				return false;
+			}
+		},
+		
+		// Flash uploader functions
+		StartUpload: function(file_id) {
+			return this.movie.StartUpload(file_id);
+		},
+		ReturnUploadStart: function(value) {
+			return this.movie.ReturnUploadStart(value);
+		},
+		StopUpload: function() {
+			return this.movie.StopUpload();
+		},
+		CancelUpload: function(file_id) {
+			return this.movie.CancelUpload(file_id);
+		},
+		GetStats: function() {
+			return this.movie.GetStats();
+		},
+		SetStats: function(stats) {
+			return this.movie.SetStats(stats);
+		},
+		GetFile: function(file_id) {
+			return this.movie.GetFile(file_id);
+		},
+		GetFileByIndex: function(file_index) {
+			return this.movie.GetFileByIndex(file_index);
+		},
+		
+		// Size formater, that's better
+		getFileSizeLimit: function(size) {
+			var value = 0;
+			var unit = 'kb';
+			
+			size = $.trim(size.toLowerCase());
+			
+			var values = size.match(/^\d+/);
+			if (values != null && values.length > 0) {
+				value = parseInt(values[0]);
+			}
+			
+			var units = size.match(/(b|kb|mb|gb)/);
+			if (units != null && units.length > 0) {
+				unit = units[0];
+			}
+			
+			var multiplier = 1024;
+			if (unit === "b") {
+				multiplier = 1;
+			} else if (unit === "mb") {
+				multiplier = 1048576;
+			} else if (unit === "gb") {
+				multiplier = 1073741824;
+			}
+			
+			return value * multiplier;
+		}
+	};
+})(jQuery);
+
+(function($) {
+	$.fn.candyUpload = function(settings,callbacks) {
+		new $._candyUpload(this,settings,callbacks);
+		return this;
+	};
+	
+	$._candyUpload = function(target,settings,callbacks) {
+		var defaults = {
+			debug: false,
+			upload_url: '',
+			params: null,
+			flash_movie: '',
+			file_types: '*.*',
+			file_types_description: 'All files',
+			file_size_limit: 0,
+			file_upload_limit: 0,
+			file_queue_limit: -1,
+			
+			callbacks: {} // Put here all callbacks you want, named as in $.uploader events
+		};
+		this.params = $.extend(defaults,settings);
+		this.params.movie_name = 'SWFU-' + (window.SWFUpload.instances.length + 1);
+		this.target = target;
+		
+		// Create controls
+		this.createControls();
+		
+		this.target.hide().after(this.ctrl.block).hide();
+		this.params.target_element = this.ctrl.btn_browse.parent().get(0);
+		
+		// Uploader init
+		var _this = this;
+		this.upldr = $.uploader(this.params,{
+			debug: function(msg) {
+				$('body').append('<pre class="debug">' + msg + '</pre>');
+				_this.bindEvent('debug',arguments);
+			},
+			flashReady: function() {
+				_this.initControls(this);
+				_this.bindEvent('flashReady',arguments);
+				
+				this.movie.style.width = _this.ctrl.btn_browse.width()+'px';
+				this.movie.style.height = _this.ctrl.btn_browse.height()+'px';
+			},
+			fileDialogComplete: function(num_ref_files,num_queue_files) {
+				_this.bindEvent('fileDialogComplete',arguments);
+			},
+			fileDialogStart: function() {
+				_this.bindEvent('fileQueued',arguments);
+			},
+			fileQueued: function(o) {
+				_this.appendFile(this,o);
+				_this.refreshControls(this);
+				_this.bindEvent('fileQueued',arguments);
+			},
+			fileQueueError: function(o,code,msg) {
+				var codes = window.SWFUpload.QUEUE_ERROR;
+				switch (code) {
+					case codes.QUEUE_LIMIT_EXCEEDED:
+						_this.queueErrorMsg(_this.locales.limit_exceeded);
+						break;
+					case codes.FILE_EXCEEDS_SIZE_LIMIT:
+						_this.queueErrorMsg(_this.locales.size_limit_exceeded);
+						break;
+					case codes.ZERO_BYTE_FILE:
+					case codes.INVALID_FILETYPE:
+						_this.queueErrorMsg(msg);
+						break;
+				}
+				_this.bindEvent('fileQueueError',arguments);
+			},
+			uploadStart: function() {
+				this.ReturnUploadStart(true);
+				_this.bindEvent('uploadStart',arguments);
+			},
+			uploadProgress: function(o,bytes,total) {
+				_this.fileProgressBar(o.id,bytes,total);
+				_this.bindEvent('uploadProgress',arguments);
+			},
+			uploadError: function(o,code,msg) {
+				var codes = window.SWFUpload.UPLOAD_ERROR;
+				switch (code) {
+					case codes.FILE_CANCELLED:
+						_this.fileErrorMsg(o.id,_this.locales.canceled);
+						break;
+					case codes.HTTP_ERROR:
+						_this.fileErrorMsg(o.id,_this.locales.http_error + ' ' + msg);
+						break;
+					case codes.MISSING_UPLOAD_URL:
+					case codes.IO_ERROR:
+					case codes.SECURITY_ERROR:
+					case codes.UPLOAD_LIMIT_EXCEEDED:
+					case codes.UPLOAD_FAILED:
+					case codes.SPECIFIED_FILE_ID_NOT_FOUND:
+					case codes.FILE_VALIDATION_FAILED:
+					case codes.FILE_CANCELLED:
+					case codes.UPLOAD_STOPPED:
+						_this.fileErrorMsg(o.id,_this.locales.error + ' ' + msg);
+						break;
+				}
+				_this.refreshControls(this);
+				_this.removeFileCancel(o);
+				_this.bindEvent('uploadError',arguments);
+			},
+			uploadSuccess: function(o,data) {
+				_this.fileProgressBar(o.id,1,1);
+				_this.refreshControls(this);
+				_this.removeFileCancel(o);
+				_this.bindEvent('uploadSuccess',arguments);
+			},
+			uploadComplete: function(o) {
+				// Once completed, start next queued upload
+				this.StartUpload();
+				_this.refreshControls(this);
+				_this.bindEvent('uploadComplete',arguments);
+			}
+		});
+	};
+	
+	$._candyUpload.prototype = {
+		locales: {
+			max_file_size: 'Maximum file size allowed:',
+			limit_exceeded: 'Limit exceeded.',
+			size_limit_exceeded: 'File size exceeds allowed limit.',
+			canceled: 'Canceled.',
+			http_error: 'HTTP Error:',
+			error: 'Error:',
+			choose_file: 'Choose file',
+			choose_files: 'Choose files',
+			cancel: 'Cancel',
+			clean: 'Clean',
+			upload: 'Upload',
+			no_file_in_queue: 'No file in queue.',
+			file_in_queue: '1 file in queue.',
+			files_in_queue: '%d files in queue.',
+			queue_error: 'Queue error:'
+		},
+		ctrl: {
+			block: $('<div class="cu-ctrl"></div>'),
+			files: null
+		},
+		
+		createControls: function() {
+			this.ctrl.btn_browse = $('<a href="#" class="button">&nbsp;</a>').click(function() {
+				return false;
+			});
+			
+			this.ctrl.btn_cancel = $('<a href="#" class="button">' + this.locales.cancel + '</a>').click(function() {
+				return false;
+			});
+			
+			this.ctrl.btn_clean = $('<a href="#" class="button">' + this.locales.clean + '</a>').click(function() {
+				return false;
+			});
+			
+			this.ctrl.btn_upload = $('<a href="#" class="button">' + this.locales.upload + '</a>').click(function() {
+				return false;
+			});
+			
+			this.ctrl.msg = $('<div class="cu-msg">' + this.locales.no_file_in_queue + '</div>').appendTo(this.ctrl.block);
+			
+			var btn = $('<div class="cu-btn"></div>').appendTo(this.ctrl.block);
+			var brw = $('<span class="cu-btn-browse"></span>').append(this.ctrl.btn_browse).appendTo(btn);
+			$('<span class="cu-btn-upload"></span>').append(this.ctrl.btn_upload).appendTo(btn).hide();
+			$('<span class="cu-btn-cancel"></span>').append(this.ctrl.btn_cancel).appendTo(btn).hide();
+			$('<span class="cu-btn-clean"></span>').append(this.ctrl.btn_clean).appendTo(btn).hide();
+			
+			this.bindEvent('createControls');
+		},
+		
+		initControls: function(upldr) {
+			if (this.params.file_queue_limit == 1) {
+				this.ctrl.btn_browse.text(this.locales.choose_file);
+			} else {
+				this.ctrl.btn_browse.text(this.locales.choose_files);
+			}
+			
+			var _this = this;
+			
+			this.ctrl.btn_cancel.click(function() {
+				_this.cancelQueue(upldr);
+				return false;
+			});
+			
+			this.ctrl.btn_clean.click(function() {
+				_this.cleanQueue(upldr);
+				return false;
+			});
+			
+			this.ctrl.btn_upload.click(function() {
+				_this.uploadQueue(upldr);
+				return false;
+			});
+			
+			var size = this.formatSize(upldr.params.file_size_limit);
+			$('<p class="cu-maxsize form-note info">' + this.locales.max_file_size + ' ' + size + '</p>').appendTo(this.ctrl.block);
+		},
+		
+		refreshControls: function(upldr) {
+			if (!this.ctrl.files || this.ctrl.files.length == 0) {
+				return;
+			}
+			
+			var stats = upldr.GetStats();
+			
+			if (stats.files_queued > 0) {
+				this.ctrl.btn_cancel.parent().show();
+				this.ctrl.btn_upload.parent().show();
+				if (this.params.file_queue_limit > 0 && this.params.file_queue_limit == stats.files_queued) {
+					this.ctrl.btn_browse.hide();
+				} else {
+					this.ctrl.btn_browse.show();
+				}
+				if (stats.files_queued > 1) {
+					var msg = this.locales.files_in_queue.replace(/%d/,stats.files_queued);
+				} else {
+					var msg = this.locales.file_in_queue;
+				}
+			} else {
+				this.ctrl.btn_browse.show();
+				this.ctrl.btn_cancel.parent().hide();
+				this.ctrl.btn_upload.parent().hide();
+				var msg = this.locales.no_file_in_queue;
+			}
+			
+			this.ctrl.msg.removeClass('cu-error').text(msg);
+			
+			if (stats.successful_uploads > 0 || stats.upload_errors > 0 || stats.upload_cancelled > 0) {
+				this.ctrl.btn_clean.parent().show();
+			} else {
+				this.ctrl.btn_clean.parent().hide();
+			}
+		},
+		
+		removeFileCancel: function(o) {
+			$('#' + o.id + ' span.cu-filecancel',this.ctrl.files).remove();
+		},
+		
+		appendFile: function(upldr,o) {
+			if (!this.ctrl.files) {
+				this.ctrl.files = $('<div class="cu-files"></div>');
+				this.ctrl.msg.after(this.ctrl.files);
+			}
+			
+			var fileblock = $('<div class="cu-file" id="' + o.id + '">' +
+					'<div class="cu-fileinfo"><span class="cu-filename">' + o.name + '</span> ' + 
+					'<span class="cu-filesize">(' + this.formatSize(o.size) + ')</span> ' +
+					'<span class="cu-filecancel"><a href="#">cancel</a> </span> ' +
+					'<span class="cu-filemsg"></span>' +
+					'</div>');
+			
+			$('span.cu-filecancel a',fileblock).click(function() {
+				upldr.CancelUpload(o.id);
+				return false;
+			});
+			this.ctrl.files.append(fileblock);
+		},
+		
+		fileProgressBar: function(file_id,bytes,total) {
+			var bar = $('#' + file_id + ' div.cu-progress>div',this.ctrl.files);
+			if (bar.length == 0) {
+				$('#' + file_id,this.ctrl.files).append('<div class="cu-progress"><div>&nbsp;</div></div>');
+				bar = $('#' + file_id + ' div.cu-progress>div',this.ctrl.files);
+			}
+			
+			var percent = Math.round((bytes * 100) / total);
+			bar.css('width',percent+'%').text(percent + '%');
+		},
+		
+		fileMsg: function(file_id,msg,error) {
+			error = error || false;
+			var span = $('#' + file_id + ' span.cu-filemsg',this.ctrl.files).attr('class','cu-filemsg');
+			if (error) {
+				span.addClass('cu-error');
+			}
+			span.text(msg);
+		},
+		
+		fileErrorMsg: function(file_id,msg) {
+			this.fileMsg(file_id,msg,true);
+		},
+		
+		cancelQueue: function(upldr) {
+			if (!this.ctrl.files || this.ctrl.files.length == 0) {
+				return;
+			}
+			
+			this.ctrl.files.children('div').each(function() {
+				upldr.CancelUpload(this.id);
+			});
+		},
+		
+		uploadQueue: function(upldr) {
+			if (!this.ctrl.files || this.ctrl.files.length == 0) {
+				return;
+			}
+			
+			upldr.StartUpload();
+		},
+		
+		cleanQueue: function(upldr) {
+			var _this = this;
+			var e = $('div.cu-file',this.ctrl.files).not(':has(span.cu-filecancel a)');
+			
+			e.filter(':last').slideUp(200,function() {
+				$(this).remove();
+				if (e.length == 1) {
+					upldr.SetStats({successful_uploads:0, upload_errors:0, upload_cancelled:0});
+					_this.refreshControls(upldr);
+				} else if (e.length > 1) {
+					_this.cleanQueue(upldr);
+				}
+			});
+		},
+		
+		queueErrorMsg: function(msg) {
+			this.ctrl.msg.addClass('cu-error').text(this.locales.queue_error + ' ' + msg);
+		},
+		
+		formatSize: function(s) {
+			var a_size = Array('B', 'KB', 'MB', 'GB', 'TB');
+			var i_index = 0;
+			while (s > 1024) {
+				i_index++;
+				s/=1024;
+			}
+			return (Math.round(s * 100) /100) + ' ' + a_size[i_index];
+		},
+		
+		bindEvent: function(evt,a) {
+			if (this.params.callbacks[evt] != undefined && $.isFunction(this.params.callbacks[evt])) {
+				a = a || new Array();
+				this.params.callbacks[evt].apply(this,a);
+			}
+		}
+	};
+})(jQuery);
Index: admin/js/jquery/jquery.constantfooter.js
===================================================================
--- admin/js/jquery/jquery.constantfooter.js	(revision 983)
+++ admin/js/jquery/jquery.constantfooter.js	(revision 983)
@@ -0,0 +1,66 @@
+(function($)
+{
+	// This script was written by Steve Fenton
+	// http://www.stevefenton.co.uk/Content/Jquery-Constant-Footer/
+	// Feel free to use this jQuery Plugin
+	// Version: 3.0.3 - modified by DC Team
+    // Contributions by: 
+	
+	var classModifier = "";
+	
+	// Add padding to the bottom of the document so it can be scrolled past the footer
+	function PadDocument() {
+		var paddingRequired = $("." + classModifier).height();
+		$("#" + classModifier + "padding").css({ paddingTop: paddingRequired+"px"});
+	}
+	
+	$.fn.constantfooter = function (settings) {
+	
+		var config = {
+			classmodifier: "constantfooter",
+			opacity: 0.8,
+			showclose: false,
+			closebutton: "[x]"
+		};
+		
+		if (settings) {
+			$.extend(config, settings);
+		}
+
+		return this.each(function () {
+			
+			classModifier = config.classmodifier;
+			
+			// Make sure opacity is a number between 0.1 and 1
+			var opacity = parseFloat(config.opacity);
+			if (opacity > 1) {
+				opacity = 1;
+			} else if (opacity < 0.1) {
+				opacity = 0.1;
+			}
+			
+			$This = $(this);
+
+			// Hide it
+			$This.hide().addClass(classModifier).css({ position: "fixed", bottom: "0px", left: "0px", width: "100%" })
+			
+			// Show a close button if required
+			if (config.showclose) {
+				$(this).prepend("<div style=\"float: right;\" class=\"" + classModifier + "close\">" + config.closebutton + "</div>");
+				$("." + classModifier + "close").css({ cursor: "pointer" });
+				$("." + classModifier + "close").click( function () {
+					$(this).parent().fadeOut();
+					window.clearTimeout(feedTimer);
+				});
+			}
+			
+			// $This.append("<div class=\"content\"></div>");
+
+			// Show it
+			$This.fadeTo(1000, opacity);
+			
+			// Pad the bottom of the document
+			PadDocument();
+		});
+	};
+})(jQuery);
Index: admin/js/jquery/jquery.pageTabs.js
===================================================================
--- admin/js/jquery/jquery.pageTabs.js	(revision 1223)
+++ admin/js/jquery/jquery.pageTabs.js	(revision 297)
@@ -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; });
@@ -73,9 +72,9 @@
 		this.divs.each(function() {
 			if ((this.id != '' && this.id == index) || i == index) {
-				jQuery(this).show(0);
+				jQuery(this).show(0, positionFooter);
 				This.items[i].className = This.params.listClassName+'-active';
 				to_trigger = i;
 			} else {
-				jQuery(this).hide(0);
+				jQuery(this).hide(0, positionFooter);
 				This.items[i].className = '';
 			}
Index: dmin/js/jsUpload/jquery.fileupload-process.js
===================================================================
--- admin/js/jsUpload/jquery.fileupload-process.js	(revision 1144)
+++ 	(revision )
@@ -1,158 +1,0 @@
-/*
- * jQuery File Upload Processing Plugin 1.1
- * https://github.com/blueimp/jQuery-File-Upload
- *
- * Copyright 2012, Sebastian Tschan
- * https://blueimp.net
- *
- * Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
- */
-
-/*jslint nomen: true, unparam: true */
-/*global define, window */
-
-(function (factory) {
-    'use strict';
-    if (typeof define === 'function' && define.amd) {
-        // Register as an anonymous AMD module:
-        define([
-            'jquery',
-            './jquery.fileupload'
-        ], factory);
-    } else {
-        // Browser globals:
-        factory(
-            window.jQuery
-        );
-    }
-}(function ($) {
-    'use strict';
-
-    var originalAdd = $.blueimp.fileupload.prototype.options.add;
-
-    // The File Upload Processing plugin extends the fileupload widget
-    // with file processing functionality:
-    $.widget('blueimp.fileupload', $.blueimp.fileupload, {
-
-        options: {
-            // The list of processing actions:
-            processQueue: [
-                /*
-                {
-                    action: 'log',
-                    type: 'debug'
-                }
-                */
-            ],
-            add: function (e, data) {
-                var $this = $(this);
-                data.process(function () {
-                    return $this.fileupload('process', data);
-                });
-                originalAdd.call(this, e, data);
-            }
-        },
-
-        processActions: {
-            /*
-            log: function (data, options) {
-                console[options.type](
-                    'Processing "' + data.files[data.index].name + '"'
-                );
-            }
-            */
-        },
-
-        _processFile: function (data) {
-            var that = this,
-                dfd = $.Deferred().resolveWith(that, [data]),
-                chain = dfd.promise();
-            this._trigger('process', null, data);
-            $.each(data.processQueue, function (i, settings) {
-                var func = function (data) {
-                    return that.processActions[settings.action].call(
-                        that,
-                        data,
-                        settings
-                    );
-                };
-                chain = chain.pipe(func, settings.always && func);
-            });
-            chain
-                .done(function () {
-                    that._trigger('processdone', null, data);
-                    that._trigger('processalways', null, data);
-                })
-                .fail(function () {
-                    that._trigger('processfail', null, data);
-                    that._trigger('processalways', null, data);
-                });
-            return chain;
-        },
-
-        // Replaces the settings of each processQueue item that
-        // are strings starting with an "@", using the remaining
-        // substring as key for the option map,
-        // e.g. "@autoUpload" is replaced with options.autoUpload:
-        _transformProcessQueue: function (options) {
-            var processQueue = [];
-            $.each(options.processQueue, function () {
-                var settings = {};
-                $.each(this, function (key, value) {
-                    if ($.type(value) === 'string' &&
-                            value.charAt(0) === '@') {
-                        settings[key] = options[value.slice(1)];
-                    } else {
-                        settings[key] = value;
-                    }
-                });
-                processQueue.push(settings);
-            });
-            options.processQueue = processQueue;
-        },
-
-        // Returns the number of files currently in the processsing queue:
-        processing: function () {
-            return this._processing;
-        },
-
-        // Processes the files given as files property of the data parameter,
-        // returns a Promise object that allows to bind callbacks:
-        process: function (data) {
-            var that = this,
-                options = $.extend({}, this.options, data);
-            if (options.processQueue && options.processQueue.length) {
-                this._transformProcessQueue(options);
-                if (this._processing === 0) {
-                    this._trigger('processstart');
-                }
-                $.each(data.files, function (index, file) {
-                    var opts = index ? $.extend({}, options) : options,
-                        func = function () {
-                            return that._processFile(opts);
-                        };
-                    opts.index = index;
-                    that._processing += 1;
-                    that._processingQueue = that._processingQueue.pipe(func, func)
-                        .always(function () {
-                            that._processing -= 1;
-                            if (that._processing === 0) {
-                                that._trigger('processstop');
-                            }
-                        });
-                });
-            }
-            return this._processingQueue;
-        },
-
-        _create: function () {
-            this._super();
-            this._processing = 0;
-            this._processingQueue = $.Deferred().resolveWith(this)
-                .promise();
-        }
-
-    });
-
-}));
Index: dmin/js/jsUpload/jquery.fileupload-resize.js
===================================================================
--- admin/js/jsUpload/jquery.fileupload-resize.js	(revision 1144)
+++ 	(revision )
@@ -1,212 +1,0 @@
-/*
- * jQuery File Upload Image Resize Plugin 1.1.2
- * https://github.com/blueimp/jQuery-File-Upload
- *
- * Copyright 2013, Sebastian Tschan
- * https://blueimp.net
- *
- * Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
- */
-
-/*jslint nomen: true, unparam: true, regexp: true */
-/*global define, window */
-
-(function (factory) {
-    'use strict';
-    if (typeof define === 'function' && define.amd) {
-        // Register as an anonymous AMD module:
-        define([
-            'jquery',
-            'load-image',
-            'canvas-to-blob',
-            './jquery.fileupload-process'
-        ], factory);
-    } else {
-        // Browser globals:
-        factory(
-            window.jQuery,
-            window.loadImage
-        );
-    }
-}(function ($, loadImage) {
-    'use strict';
-
-    // Prepend to the default processQueue:
-    $.blueimp.fileupload.prototype.options.processQueue.unshift(
-        {
-            action: 'loadImage',
-            fileTypes: '@loadImageFileTypes',
-            maxFileSize: '@loadImageMaxFileSize',
-            noRevoke: '@loadImageNoRevoke',
-            disabled: '@disableImageLoad'
-        },
-        {
-            action: 'resizeImage',
-            maxWidth: '@imageMaxWidth',
-            maxHeight: '@imageMaxHeight',
-            minWidth: '@imageMinWidth',
-            minHeight: '@imageMinHeight',
-            crop: '@imageCrop',
-            disabled: '@disableImageResize'
-        },
-        {
-            action: 'saveImage',
-            disabled: '@disableImageResize'
-        },
-        {
-            action: 'resizeImage',
-            maxWidth: '@previewMaxWidth',
-            maxHeight: '@previewMaxHeight',
-            minWidth: '@previewMinWidth',
-            minHeight: '@previewMinHeight',
-            crop: '@previewCrop',
-            canvas: '@previewAsCanvas',
-            disabled: '@disableImagePreview'
-        },
-        {
-            action: 'setImage',
-            // The name of the property the resized image
-            // is saved as on the associated file object:
-            name: 'preview',
-            disabled: '@disableImagePreview'
-        }
-    );
-
-    // The File Upload Resize plugin extends the fileupload widget
-    // with image resize functionality:
-    $.widget('blueimp.fileupload', $.blueimp.fileupload, {
-
-        options: {
-            // The regular expression for the types of images to load:
-            // matched against the file type:
-            loadImageFileTypes: /^image\/(gif|jpeg|png)$/,
-            // The maximum file size of images to load:
-            loadImageMaxFileSize: 5000000, // 5MB
-            // The maximum width of resized images:
-            imageMaxWidth: 1920,
-            // The maximum height of resized images:
-            imageMaxHeight: 1080,
-            // Define if resized images should be cropped or only scaled:
-            imageCrop: false,
-            // Disable the resize image functionality by default:
-            disableImageResize: true,
-            // The maximum width of the preview images:
-            previewMaxWidth: 80,
-            // The maximum height of the preview images:
-            previewMaxHeight: 80,
-            // Define if preview images should be cropped or only scaled:
-            previewCrop: false,
-            // Define if preview images should be resized as canvas elements:
-            previewAsCanvas: true
-        },
-
-        processActions: {
-
-            // Loads the image given via data.files and data.index
-            // as img element if the browser supports canvas.
-            // Accepts the options fileTypes (regular expression)
-            // and maxFileSize (integer) to limit the files to load:
-            loadImage: function (data, options) {
-                if (options.disabled) {
-                    return data;
-                }
-                var that = this,
-                    file = data.files[data.index],
-                    dfd = $.Deferred();
-                if (($.type(options.maxFileSize) === 'number' &&
-                            file.size > options.maxFileSize) ||
-                        (options.fileTypes &&
-                            !options.fileTypes.test(file.type)) ||
-                        !loadImage(
-                            file,
-                            function (img) {
-                                if (!img.src) {
-                                    return dfd.rejectWith(that, [data]);
-                                }
-                                data.img = img;
-                                dfd.resolveWith(that, [data]);
-                            },
-                            options
-                        )) {
-                    dfd.rejectWith(that, [data]);
-                }
-                return dfd.promise();
-            },
-
-            // Resizes the image given as data.canvas or data.img
-            // and updates data.canvas or data.img with the resized image.
-            // Accepts the options maxWidth, maxHeight, minWidth,
-            // minHeight, canvas and crop:
-            resizeImage: function (data, options) {
-                options = $.extend({canvas: true}, options);
-                var img = (options.canvas && data.canvas) || data.img,
-                    canvas;
-                if (img && !options.disabled) {
-                    canvas = loadImage.scale(img, options);
-                    if (canvas && (canvas.width !== img.width ||
-                            canvas.height !== img.height)) {
-                        data[canvas.getContext ? 'canvas' : 'img'] = canvas;
-                    }
-                }
-                return data;
-            },
-
-            // Saves the processed image given as data.canvas
-            // inplace at data.index of data.files:
-            saveImage: function (data, options) {
-                if (!data.canvas || options.disabled) {
-                    return data;
-                }
-                var that = this,
-                    file = data.files[data.index],
-                    name = file.name,
-                    dfd = $.Deferred(),
-                    callback = function (blob) {
-                        if (!blob.name) {
-                            if (file.type === blob.type) {
-                                blob.name = file.name;
-                            } else if (file.name) {
-                                blob.name = file.name.replace(
-                                    /\..+$/,
-                                    '.' + blob.type.substr(6)
-                                );
-                            }
-                        }
-                        // Store the created blob at the position
-                        // of the original file in the files list:
-                        data.files[data.index] = blob;
-                        dfd.resolveWith(that, [data]);
-                    };
-                // Use canvas.mozGetAsFile directly, to retain the filename, as
-                // Gecko doesn't support the filename option for FormData.append:
-                if (data.canvas.mozGetAsFile) {
-                    callback(data.canvas.mozGetAsFile(
-                        (/^image\/(jpeg|png)$/.test(file.type) && name) ||
-                            ((name && name.replace(/\..+$/, '')) ||
-                                'blob') + '.png',
-                        file.type
-                    ));
-                } else if (data.canvas.toBlob) {
-                    data.canvas.toBlob(callback, file.type);
-                } else {
-                    return data;
-                }
-                return dfd.promise();
-            },
-
-            // Sets the resized version of the image as a property of the
-            // file object, must be called after "saveImage":
-            setImage: function (data, options) {
-                var img = data.canvas || data.img;
-                if (img && !options.disabled) {
-                    data.files[data.index][options.name] = img;
-                }
-                return data;
-            }
-
-        }
-
-    });
-
-}));
Index: dmin/js/jsUpload/jquery.fileupload-ui.js
===================================================================
--- admin/js/jsUpload/jquery.fileupload-ui.js	(revision 1206)
+++ 	(revision )
@@ -1,663 +1,0 @@
-/*
- * jQuery File Upload User Interface Plugin 8.2.1
- * https://github.com/blueimp/jQuery-File-Upload
- *
- * Copyright 2010, Sebastian Tschan
- * https://blueimp.net
- *
- * Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
- */
-
-/*jslint nomen: true, unparam: true, regexp: true */
-/*global define, window, URL, webkitURL, FileReader */
-
-(function (factory) {
-    'use strict';
-    if (typeof define === 'function' && define.amd) {
-        // Register as an anonymous AMD module:
-        define([
-            'jquery',
-            'tmpl',
-            './jquery.fileupload-resize',
-            './jquery.fileupload-validate'
-        ], factory);
-    } else {
-        // Browser globals:
-        factory(
-            window.jQuery,
-            window.tmpl
-        );
-    }
-}(function ($, tmpl, loadImage) {
-    'use strict';
-
-    $.blueimp.fileupload.prototype._specialOptions.push(
-        'filesContainer',
-        'uploadTemplateId',
-        'downloadTemplateId'
-    );
-
-    // The UI version extends the file upload widget
-    // and adds complete user interface interaction:
-    $.widget('blueimp.fileupload', $.blueimp.fileupload, {
-
-        options: {
-            // By default, files added to the widget are uploaded as soon
-            // as the user clicks on the start buttons. To enable automatic
-            // uploads, set the following option to true:
-            autoUpload: false,
-            // The ID of the upload template:
-            uploadTemplateId: 'template-upload',
-            // The ID of the download template:
-            downloadTemplateId: 'template-download',
-            // The container for the list of files. If undefined, it is set to
-            // an element with class "files" inside of the widget element:
-            filesContainer: undefined,
-            // By default, files are appended to the files container.
-            // Set the following option to true, to prepend files instead:
-            prependFiles: false,
-            // The expected data type of the upload response, sets the dataType
-            // option of the $.ajax upload requests:
-            dataType: 'json',
-
-            // Function returning the current number of files,
-            // used by the maxNumberOfFiles validation:
-            getNumberOfFiles: function () {
-                return this.filesContainer.children().length;
-            },
-
-            // Callback to retrieve the list of files from the server response:
-            getFilesFromResponse: function (data) {
-                if (data.result && $.isArray(data.result.files)) {
-                    return data.result.files;
-                }
-                return [];
-            },
-
-            // The add callback is invoked as soon as files are added to the fileupload
-            // widget (via file input selection, drag & drop or add API call).
-            // See the basic file upload widget for more information:
-            add: function (e, data) {
-                var $this = $(this),
-                    that = $this.data('blueimp-fileupload') ||
-                        $this.data('fileupload'),
-                    options = that.options,
-                    files = data.files;
-                data.process(function () {
-                    return $this.fileupload('process', data);
-                }).always(function () {
-                    data.context = that._renderUpload(files).data('data', data);
-                    that._renderPreviews(data);
-                    options.filesContainer[
-                        options.prependFiles ? 'prepend' : 'append'
-                    ](data.context);
-                    that._forceReflow(data.context);
-                    that._transition(data.context).done(
-                        function () {
-                            if ((that._trigger('added', e, data) !== false) &&
-                                    (options.autoUpload || data.autoUpload) &&
-                                    data.autoUpload !== false && !data.files.error) {
-                                data.submit();
-                            }
-                        }
-                    );
-                });
-
-            /*
-             *  
-             *  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');
-                if (data.context && data.dataType &&
-                        data.dataType.substr(0, 6) === 'iframe') {
-                    // Iframe Transport does not support progress events.
-                    // In lack of an indeterminate progress bar, we set
-                    // the progress to 100%, showing the full animated bar:
-                    data.context
-                        .find('.progress').addClass(
-                            !$.support.transition && 'progress-animated'
-                        )
-                        .attr('aria-valuenow', 100)
-                        .find('.bar').css(
-                            'width',
-                            '100%'
-                        );
-                }
-                return that._trigger('sent', e, data);
-            },
-            // Callback for successful uploads:
-            done: function (e, data) {
-
-                var that = $(this).data('blueimp-fileupload') ||
-                        $(this).data('fileupload'),
-                    getFilesFromResponse = data.getFilesFromResponse ||
-                        that.options.getFilesFromResponse,
-                    files = getFilesFromResponse(data),
-                    template,
-                    deferred;
-                if (data.context) {
-                    data.context.each(function (index) {
-                        var file = files[index] ||
-                                {error: 'Empty file upload result'},
-                            deferred = that._addFinishedDeferreds();
-                        that._transition($(this)).done(
-                            function () {
-                                var node = $(this);
-                                template = that._renderDownload([file])
-                                    .replaceAll(node);
-                                that._forceReflow(template);
-                                that._transition(template).done(
-                                    function () {
-                                        data.context = $(this);
-                                        that._trigger('completed', e, data);
-                                        that._trigger('finished', e, data);
-                                        deferred.resolve();
-                                    }
-                                );
-                            }
-                        );
-                    });
-                } else {
-                    template = that._renderDownload(files)
-                        .appendTo(that.options.filesContainer);
-                    that._forceReflow(template);
-                    deferred = that._addFinishedDeferreds();
-                    that._transition(template).done(
-                        function () {
-                            data.context = $(this);
-                            that._trigger('completed', e, data);
-                            that._trigger('finished', e, data);
-                            deferred.resolve();
-                        }
-                    );
-                }
-            },
-            // Callback for failed (abort or error) uploads:
-            fail: function (e, data) {
-                var that = $(this).data('blueimp-fileupload') ||
-                        $(this).data('fileupload'),
-                    template,
-                    deferred;
-                if (data.context) {
-                    data.context.each(function (index) {
-                        if (data.errorThrown !== 'abort') {
-                            var file = data.files[index];
-                            file.error = file.error || data.errorThrown ||
-                                true;
-                            deferred = that._addFinishedDeferreds();
-                            that._transition($(this)).done(
-                                function () {
-                                    var node = $(this);
-                                    template = that._renderDownload([file])
-                                        .replaceAll(node);
-                                    that._forceReflow(template);
-                                    that._transition(template).done(
-                                        function () {
-                                            data.context = $(this);
-                                            that._trigger('failed', e, data);
-                                            that._trigger('finished', e, data);
-                                            deferred.resolve();
-                                        }
-                                    );
-                                }
-                            );
-                        } else {
-                            deferred = that._addFinishedDeferreds();
-                            that._transition($(this)).done(
-                                function () {
-                                    $(this).remove();
-                                    that._trigger('failed', e, data);
-                                    that._trigger('finished', e, data);
-                                    deferred.resolve();
-                                }
-                            );
-                        }
-                    });
-                } else if (data.errorThrown !== 'abort') {
-                    data.context = that._renderUpload(data.files)
-                        .appendTo(that.options.filesContainer)
-                        .data('data', data);
-                    that._forceReflow(data.context);
-                    deferred = that._addFinishedDeferreds();
-                    that._transition(data.context).done(
-                        function () {
-                            data.context = $(this);
-                            that._trigger('failed', e, data);
-                            that._trigger('finished', e, data);
-                            deferred.resolve();
-                        }
-                    );
-                } else {
-                    that._trigger('failed', e, data);
-                    that._trigger('finished', e, data);
-                    that._addFinishedDeferreds().resolve();
-                }
-            },
-            // Callback for upload progress events:
-            progress: function (e, data) {
-                if (data.context) {
-                    var progress = Math.floor(data.loaded / data.total * 100);
-                    data.context.find('.progress')
-                        .attr('aria-valuenow', progress)
-                        .find('.bar').css(
-                            'width',
-                            progress + '%'
-                        );
-                }
-            },
-            // Callback for global upload progress events:
-            progressall: function (e, data) {
-                var $this = $(this),
-                    progress = Math.floor(data.loaded / data.total * 100),
-                    globalProgressNode = $this.find('.fileupload-progress'),
-                    extendedProgressNode = globalProgressNode
-                        .find('.progress-extended');
-                if (extendedProgressNode.length) {
-                    extendedProgressNode.html(
-                        ($this.data('blueimp-fileupload') || $this.data('fileupload'))
-                            ._renderExtendedProgress(data)
-                    );
-                }
-                globalProgressNode
-                    .find('.progress')
-                    .attr('aria-valuenow', progress)
-                    .find('.bar').css(
-                        'width',
-                        progress + '%'
-                    );
-            },
-            // 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');
-                that._resetFinishedDeferreds();
-                that._transition($(this).find('.fileupload-progress')).done(
-
-                    function () {
-
-                        that._trigger('started', e);
-                    }
-                );
-            },
-            // 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'),
-                    deferred = that._addFinishedDeferreds();
-                $.when.apply($, that._getFinishedDeferreds())
-                    .done(function () {
-                        that._trigger('stopped', e);
-                    });
-                that._transition($(this).find('.fileupload-progress')).done(
-                    function () {
-                        $(this).find('.progress')
-                            .attr('aria-valuenow', '0')
-                            .find('.bar').css('width', '0%');
-                        $(this).find('.progress-extended').html('&nbsp;');
-                        deferred.resolve();
-                    }
-                );
-            /*
-             *  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 () {
-                $(this).addClass('fileupload-processing');
-            },
-            processstop: function () {
-                $(this).removeClass('fileupload-processing');
-            },
-            // Callback for file deletion:
-            destroy: function (e, data) {
-                var that = $(this).data('blueimp-fileupload') ||
-                        $(this).data('fileupload');
-                if (data.url) {
-                    $.ajax(data).done(function () {
-                        that._transition(data.context).done(
-                            function () {
-                                $(this).remove();
-                                that._trigger('destroyed', e, data);
-                            }
-                        );
-                    });
-                }
-            }
-        },
-
-        _resetFinishedDeferreds: function () {
-            this._finishedUploads = [];
-        },
-
-        _addFinishedDeferreds: function (deferred) {
-            if (!deferred) {
-                deferred = $.Deferred();
-            }
-            this._finishedUploads.push(deferred);
-            return deferred;
-        },
-
-        _getFinishedDeferreds: function () {
-            return this._finishedUploads;
-        },
-
-        // Link handler, that allows to download files
-        // by drag & drop of the links to the desktop:
-        _enableDragToDesktop: function () {
-            var link = $(this),
-                url = link.prop('href'),
-                name = link.prop('download'),
-                type = 'application/octet-stream';
-            link.bind('dragstart', function (e) {
-                try {
-                    e.originalEvent.dataTransfer.setData(
-                        'DownloadURL',
-                        [type, name, url].join(':')
-                    );
-                } catch (ignore) {}
-            });
-        },
-
-        _formatFileSize: function (bytes) {
-            if (typeof bytes !== 'number') {
-                return '';
-            }
-            if (bytes >= 1000000000) {
-                return (bytes / 1000000000).toFixed(2) + ' GB';
-            }
-            if (bytes >= 1000000) {
-                return (bytes / 1000000).toFixed(2) + ' MB';
-            }
-            return (bytes / 1000).toFixed(2) + ' KB';
-        },
-
-        _formatBitrate: function (bits) {
-            if (typeof bits !== 'number') {
-                return '';
-            }
-            if (bits >= 1000000000) {
-                return (bits / 1000000000).toFixed(2) + ' Gbit/s';
-            }
-            if (bits >= 1000000) {
-                return (bits / 1000000).toFixed(2) + ' Mbit/s';
-            }
-            if (bits >= 1000) {
-                return (bits / 1000).toFixed(2) + ' kbit/s';
-            }
-            return bits.toFixed(2) + ' bit/s';
-        },
-
-        _formatTime: function (seconds) {
-            var date = new Date(seconds * 1000),
-                days = Math.floor(seconds / 86400);
-            days = days ? days + 'd ' : '';
-            return days +
-                ('0' + date.getUTCHours()).slice(-2) + ':' +
-                ('0' + date.getUTCMinutes()).slice(-2) + ':' +
-                ('0' + date.getUTCSeconds()).slice(-2);
-        },
-
-        _formatPercentage: function (floatValue) {
-            return (floatValue * 100).toFixed(2) + ' %';
-        },
-
-        _renderExtendedProgress: function (data) {
-            return this._formatBitrate(data.bitrate) + ' | ' +
-                this._formatTime(
-                    (data.total - data.loaded) * 8 / data.bitrate
-                ) + ' | ' +
-                this._formatPercentage(
-                    data.loaded / data.total
-                ) + ' | ' +
-                this._formatFileSize(data.loaded) + ' / ' +
-                this._formatFileSize(data.total);
-        },
-
-        _renderTemplate: function (func, files) {
-            if (!func) {
-                return $();
-            }
-            var result = func({
-                files: files,
-                formatFileSize: this._formatFileSize,
-                options: this.options
-            });
-            if (result instanceof $) {
-                return result;
-            }
-            return $(this.options.templatesContainer).html(result).children();
-        },
-
-        _renderPreviews: function (data) {
-            data.context.find('.preview').each(function (index, elm) {
-                $(elm).append(data.files[index].preview);
-            });
-        },
-
-        _renderUpload: function (files) {
-            return this._renderTemplate(
-                this.options.uploadTemplate,
-                files
-            );
-        },
-
-        _renderDownload: function (files) {
-            return this._renderTemplate(
-                this.options.downloadTemplate,
-                files
-            ).find('a[download]').each(this._enableDragToDesktop).end();
-        },
-
-        _startHandler: function (e) {
-            e.preventDefault();
-            var button = $(e.currentTarget),
-                template = button.closest('.template-upload'),
-                data = template.data('data');
-            if (data && data.submit && !data.jqXHR && data.submit()) {
-                button.prop('disabled', true);
-            }
-        },
-
-        _cancelHandler: function (e) {
-            e.preventDefault();
-            var template = $(e.currentTarget).closest('.template-upload'),
-                data = template.data('data') || {};
-            if (!data.jqXHR) {
-                data.errorThrown = 'abort';
-                this._trigger('fail', e, data);
-            } else {
-                data.jqXHR.abort();
-            }
-        },
-
-        _deleteHandler: function (e) {
-            e.preventDefault();
-            var button = $(e.currentTarget);
-            this._trigger('destroy', e, $.extend({
-                context: button.closest('.template-download'),
-                type: 'DELETE'
-            }, button.data()));
-        },
-
-        _forceReflow: function (node) {
-            return $.support.transition && node.length &&
-                node[0].offsetWidth;
-        },
-
-        _transition: function (node) {
-            var dfd = $.Deferred();
-            if ($.support.transition && node.hasClass('fade') && node.is(':visible')) {
-                node.bind(
-                    $.support.transition.end,
-                    function (e) {
-                        // Make sure we don't respond to other transitions events
-                        // in the container element, e.g. from button elements:
-                        if (e.target === node[0]) {
-                            node.unbind($.support.transition.end);
-                            dfd.resolveWith(node);
-                        }
-                    }
-                ).toggleClass('in');
-            } else {
-                node.toggleClass('in');
-                dfd.resolveWith(node);
-            }
-            return dfd;
-        },
-
-        _initButtonBarEventHandlers: function () {
-            var fileUploadButtonBar = this.element.find('.fileupload-buttonbar'),
-                filesList = this.options.filesContainer;
-            this._on(fileUploadButtonBar.find('.start'), {
-                click: function (e) {
-                    e.preventDefault();
-                    filesList.find('.start').click();
-                }
-            });
-            this._on(fileUploadButtonBar.find('.cancel'), {
-                click: function (e) {
-                    e.preventDefault();
-                    filesList.find('.cancel').click();
-                }
-            });
-            this._on(fileUploadButtonBar.find('.delete'), {
-                click: function (e) {
-                    e.preventDefault();
-                    filesList.find('.toggle:checked')
-                        .closest('.template-download')
-                        .find('.delete').click();
-                    fileUploadButtonBar.find('.toggle')
-                        .prop('checked', false);
-                }
-            });
-            this._on(fileUploadButtonBar.find('.toggle'), {
-                change: function (e) {
-                    filesList.find('.toggle').prop(
-                        'checked',
-                        $(e.currentTarget).is(':checked')
-                    );
-                }
-            });
-        },
-
-        _destroyButtonBarEventHandlers: function () {
-            this._off(
-                this.element.find('.fileupload-buttonbar')
-                    .find('.start, .cancel, .delete'),
-                'click'
-            );
-            this._off(
-                this.element.find('.fileupload-buttonbar .toggle'),
-                'change.'
-            );
-        },
-
-        _initEventHandlers: function () {
-            this._super();
-            this._on(this.options.filesContainer, {
-                'click .start': this._startHandler,
-                'click .cancel': this._cancelHandler,
-                'click .delete': this._deleteHandler
-            });
-            this._initButtonBarEventHandlers();
-        },
-
-        _destroyEventHandlers: function () {
-            this._destroyButtonBarEventHandlers();
-            this._off(this.options.filesContainer, 'click');
-            this._super();
-        },
-
-        _enableFileInputButton: function () {
-            this.element.find('.fileinput-button input')
-                .prop('disabled', false)
-                .parent().removeClass('disabled');
-        },
-
-        _disableFileInputButton: function () {
-            this.element.find('.fileinput-button input')
-                .prop('disabled', true)
-                .parent().addClass('disabled');
-        },
-
-        _initTemplates: function () {
-            var options = this.options;
-            options.templatesContainer = this.document[0].createElement(
-                options.filesContainer.prop('nodeName')
-            );
-            if (tmpl) {
-                if (options.uploadTemplateId) {
-                    options.uploadTemplate = tmpl(options.uploadTemplateId);
-                }
-                if (options.downloadTemplateId) {
-                    options.downloadTemplate = tmpl(options.downloadTemplateId);
-                }
-            }
-        },
-
-        _initFilesContainer: function () {
-            var options = this.options;
-            if (options.filesContainer === undefined) {
-                options.filesContainer = this.element.find('.files');
-            } else if (!(options.filesContainer instanceof $)) {
-                options.filesContainer = $(options.filesContainer);
-            }
-        },
-
-        _initSpecialOptions: function () {
-            this._super();
-            this._initFilesContainer();
-            this._initTemplates();
-        },
-
-        _create: function () {
-            this._super();
-            this._resetFinishedDeferreds();
-        },
-
-        enable: function () {
-            var wasDisabled = false;
-            if (this.options.disabled) {
-                wasDisabled = true;
-            }
-            this._super();
-            if (wasDisabled) {
-                this.element.find('input, button').prop('disabled', false);
-                this._enableFileInputButton();
-            }
-        },
-
-        disable: function () {
-            if (!this.options.disabled) {
-                this.element.find('input, button').prop('disabled', true);
-                this._disableFileInputButton();
-            }
-            this._super();
-        }
-
-    });
-
-}));
Index: dmin/js/jsUpload/jquery.fileupload.js
===================================================================
--- admin/js/jsUpload/jquery.fileupload.js	(revision 1144)
+++ 	(revision )
@@ -1,1301 +1,0 @@
-/*
- * jQuery File Upload Plugin 5.31.1
- * https://github.com/blueimp/jQuery-File-Upload
- *
- * Copyright 2010, Sebastian Tschan
- * https://blueimp.net
- *
- * Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
- */
-
-/*jslint nomen: true, unparam: true, regexp: true */
-/*global define, window, document, File, Blob, FormData, location */
-
-(function (factory) {
-    'use strict';
-    if (typeof define === 'function' && define.amd) {
-        // Register as an anonymous AMD module:
-        define([
-            'jquery',
-            'jquery.ui.widget'
-        ], factory);
-    } else {
-        // Browser globals:
-        factory(window.jQuery);
-    }
-}(function ($) {
-    'use strict';
-
-    // The FileReader API is not actually used, but works as feature detection,
-    // as e.g. Safari supports XHR file uploads via the FormData API,
-    // but not non-multipart XHR file uploads:
-    $.support.xhrFileUpload = !!(window.XMLHttpRequestUpload && window.FileReader);
-    $.support.xhrFormDataFileUpload = !!window.FormData;
-
-    // The fileupload widget listens for change events on file input fields defined
-    // via fileInput setting and paste or drop events of the given dropZone.
-    // In addition to the default jQuery Widget methods, the fileupload widget
-    // exposes the "add" and "send" methods, to add or directly send files using
-    // the fileupload API.
-    // By default, files added via file input selection, paste, drag & drop or
-    // "add" method are uploaded immediately, but it is possible to override
-    // the "add" callback option to queue file uploads.
-    $.widget('blueimp.fileupload', {
-
-        options: {
-            // The drop target element(s), by the default the complete document.
-            // Set to null to disable drag & drop support:
-            dropZone: $(document),
-            // The paste target element(s), by the default the complete document.
-            // Set to null to disable paste support:
-            pasteZone: $(document),
-            // The file input field(s), that are listened to for change events.
-            // If undefined, it is set to the file input fields inside
-            // of the widget element on plugin initialization.
-            // Set to null to disable the change listener.
-            fileInput: undefined,
-            // By default, the file input field is replaced with a clone after
-            // each input field change event. This is required for iframe transport
-            // queues and allows change events to be fired for the same file
-            // selection, but can be disabled by setting the following option to false:
-            replaceFileInput: true,
-            // The parameter name for the file form data (the request argument name).
-            // If undefined or empty, the name property of the file input field is
-            // used, or "files[]" if the file input name property is also empty,
-            // can be a string or an array of strings:
-            paramName: undefined,
-            // By default, each file of a selection is uploaded using an individual
-            // request for XHR type uploads. Set to false to upload file
-            // selections in one request each:
-            singleFileUploads: true,
-            // To limit the number of files uploaded with one XHR request,
-            // set the following option to an integer greater than 0:
-            limitMultiFileUploads: undefined,
-            // Set the following option to true to issue all file upload requests
-            // in a sequential order:
-            sequentialUploads: false,
-            // To limit the number of concurrent uploads,
-            // set the following option to an integer greater than 0:
-            limitConcurrentUploads: undefined,
-            // Set the following option to true to force iframe transport uploads:
-            forceIframeTransport: false,
-            // Set the following option to the location of a redirect url on the
-            // origin server, for cross-domain iframe transport uploads:
-            redirect: undefined,
-            // The parameter name for the redirect url, sent as part of the form
-            // data and set to 'redirect' if this option is empty:
-            redirectParamName: undefined,
-            // Set the following option to the location of a postMessage window,
-            // to enable postMessage transport uploads:
-            postMessage: undefined,
-            // By default, XHR file uploads are sent as multipart/form-data.
-            // The iframe transport is always using multipart/form-data.
-            // Set to false to enable non-multipart XHR uploads:
-            multipart: true,
-            // To upload large files in smaller chunks, set the following option
-            // to a preferred maximum chunk size. If set to 0, null or undefined,
-            // or the browser does not support the required Blob API, files will
-            // be uploaded as a whole.
-            maxChunkSize: undefined,
-            // When a non-multipart upload or a chunked multipart upload has been
-            // aborted, this option can be used to resume the upload by setting
-            // it to the size of the already uploaded bytes. This option is most
-            // useful when modifying the options object inside of the "add" or
-            // "send" callbacks, as the options are cloned for each file upload.
-            uploadedBytes: undefined,
-            // By default, failed (abort or error) file uploads are removed from the
-            // global progress calculation. Set the following option to false to
-            // prevent recalculating the global progress data:
-            recalculateProgress: true,
-            // Interval in milliseconds to calculate and trigger progress events:
-            progressInterval: 100,
-            // Interval in milliseconds to calculate progress bitrate:
-            bitrateInterval: 500,
-            // By default, uploads are started automatically when adding files:
-            autoUpload: true,
-
-            // Error and info messages:
-            messages: {
-                uploadedBytes: 'Uploaded bytes exceed file size'
-            },
-
-            // Translation function, gets the message key to be translated
-            // and an object with context specific data as arguments:
-            i18n: function (message, context) {
-                message = this.messages[message] || message.toString();
-                if (context) {
-                    $.each(context, function (key, value) {
-                        message = message.replace('{' + key + '}', value);
-                    });
-                }
-                return message;
-            },
-
-            // Additional form data to be sent along with the file uploads can be set
-            // using this option, which accepts an array of objects with name and
-            // value properties, a function returning such an array, a FormData
-            // object (for XHR file uploads), or a simple object.
-            // The form of the first fileInput is given as parameter to the function:
-            formData: function (form) {
-                return form.serializeArray();
-            },
-
-            // The add callback is invoked as soon as files are added to the fileupload
-            // 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
-            // 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.
-            // 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:
-            // data.submit().done(func).fail(func).always(func);
-            add: function (e, data) {
-                if (data.autoUpload || (data.autoUpload !== false &&
-                        $(this).fileupload('option', 'autoUpload'))) {
-                    data.process().done(function () {
-                        data.submit();
-                    });
-                }
-            },
-
-            // Other callbacks:
-
-            // Callback for the submit event of each file upload:
-            // submit: function (e, data) {}, // .bind('fileuploadsubmit', func);
-
-            // Callback for the start of each file upload request:
-            // send: function (e, data) {}, // .bind('fileuploadsend', func);
-
-            // Callback for successful uploads:
-            // done: function (e, data) {}, // .bind('fileuploaddone', func);
-
-            // Callback for failed (abort or error) uploads:
-            // fail: function (e, data) {}, // .bind('fileuploadfail', func);
-
-            // Callback for completed (success, abort or error) requests:
-            // always: function (e, data) {}, // .bind('fileuploadalways', func);
-
-            // Callback for upload progress events:
-            // progress: function (e, data) {}, // .bind('fileuploadprogress', func);
-
-            // Callback for global upload progress events:
-            // progressall: function (e, data) {}, // .bind('fileuploadprogressall', func);
-
-            // Callback for uploads start, equivalent to the global ajaxStart event:
-            // start: function (e) {}, // .bind('fileuploadstart', func);
-
-            // Callback for uploads stop, equivalent to the global ajaxStop event:
-            // stop: function (e) {}, // .bind('fileuploadstop', func);
-
-            // Callback for change events of the fileInput(s):
-            // change: function (e, data) {}, // .bind('fileuploadchange', func);
-
-            // Callback for paste events to the pasteZone(s):
-            // paste: function (e, data) {}, // .bind('fileuploadpaste', func);
-
-            // Callback for drop events of the dropZone(s):
-            // drop: function (e, data) {}, // .bind('fileuploaddrop', func);
-
-            // Callback for dragover events of the dropZone(s):
-            // dragover: function (e) {}, // .bind('fileuploaddragover', func);
-
-            // Callback for the start of each chunk upload request:
-            // chunksend: function (e, data) {}, // .bind('fileuploadchunksend', func);
-
-            // Callback for successful chunk uploads:
-            // chunkdone: function (e, data) {}, // .bind('fileuploadchunkdone', func);
-
-            // Callback for failed (abort or error) chunk uploads:
-            // chunkfail: function (e, data) {}, // .bind('fileuploadchunkfail', func);
-
-            // Callback for completed (success, abort or error) chunk upload requests:
-            // chunkalways: function (e, data) {}, // .bind('fileuploadchunkalways', func);
-
-            // The plugin options are used as settings object for the ajax calls.
-            // The following are jQuery ajax settings required for the file uploads:
-            processData: false,
-            contentType: false,
-            cache: false
-        },
-
-        // A list of options that require reinitializing event listeners and/or
-        // special initialization code:
-        _specialOptions: [
-            'fileInput',
-            'dropZone',
-            'pasteZone',
-            'multipart',
-            'forceIframeTransport'
-        ],
-
-        _BitrateTimer: function () {
-            this.timestamp = ((Date.now) ? Date.now() : (new Date()).getTime());
-            this.loaded = 0;
-            this.bitrate = 0;
-            this.getBitrate = function (now, loaded, interval) {
-                var timeDiff = now - this.timestamp;
-                if (!this.bitrate || !interval || timeDiff > interval) {
-                    this.bitrate = (loaded - this.loaded) * (1000 / timeDiff) * 8;
-                    this.loaded = loaded;
-                    this.timestamp = now;
-                }
-                return this.bitrate;
-            };
-        },
-
-        _isXHRUpload: function (options) {
-            return !options.forceIframeTransport &&
-                ((!options.multipart && $.support.xhrFileUpload) ||
-                $.support.xhrFormDataFileUpload);
-        },
-
-        _getFormData: function (options) {
-            var formData;
-            if (typeof options.formData === 'function') {
-                return options.formData(options.form);
-            }
-            if ($.isArray(options.formData)) {
-                return options.formData;
-            }
-            if ($.type(options.formData) === 'object') {
-                formData = [];
-                $.each(options.formData, function (name, value) {
-                    formData.push({name: name, value: value});
-                });
-                return formData;
-            }
-            return [];
-        },
-
-        _getTotal: function (files) {
-            var total = 0;
-            $.each(files, function (index, file) {
-                total += file.size || 1;
-            });
-            return total;
-        },
-
-        _initProgressObject: function (obj) {
-            var progress = {
-                loaded: 0,
-                total: 0,
-                bitrate: 0
-            };
-            if (obj._progress) {
-                $.extend(obj._progress, progress);
-            } else {
-                obj._progress = progress;
-            }
-        },
-
-        _initResponseObject: function (obj) {
-            var prop;
-            if (obj._response) {
-                for (prop in obj._response) {
-                    if (obj._response.hasOwnProperty(prop)) {
-                        delete obj._response[prop];
-                    }
-                }
-            } else {
-                obj._response = {};
-            }
-        },
-
-        _onProgress: function (e, data) {
-            if (e.lengthComputable) {
-                var now = ((Date.now) ? Date.now() : (new Date()).getTime()),
-                    loaded;
-                if (data._time && data.progressInterval &&
-                        (now - data._time < data.progressInterval) &&
-                        e.loaded !== e.total) {
-                    return;
-                }
-                data._time = now;
-                loaded = Math.floor(
-                    e.loaded / e.total * (data.chunkSize || data._progress.total)
-                ) + (data.uploadedBytes || 0);
-                // Add the difference from the previously loaded state
-                // to the global loaded counter:
-                this._progress.loaded += (loaded - data._progress.loaded);
-                this._progress.bitrate = this._bitrateTimer.getBitrate(
-                    now,
-                    this._progress.loaded,
-                    data.bitrateInterval
-                );
-                data._progress.loaded = data.loaded = loaded;
-                data._progress.bitrate = data.bitrate = data._bitrateTimer.getBitrate(
-                    now,
-                    loaded,
-                    data.bitrateInterval
-                );
-                // Trigger a custom progress event with a total data property set
-                // to the file size(s) of the current upload and a loaded data
-                // property calculated accordingly:
-                this._trigger('progress', e, data);
-                // Trigger a global progress event for all current file uploads,
-                // including ajax calls queued for sequential file uploads:
-                this._trigger('progressall', e, this._progress);
-            }
-        },
-
-        _initProgressListener: function (options) {
-            var that = this,
-                xhr = options.xhr ? options.xhr() : $.ajaxSettings.xhr();
-            // Accesss to the native XHR object is required to add event listeners
-            // for the upload progress event:
-            if (xhr.upload) {
-                $(xhr.upload).bind('progress', function (e) {
-                    var oe = e.originalEvent;
-                    // Make sure the progress event properties get copied over:
-                    e.lengthComputable = oe.lengthComputable;
-                    e.loaded = oe.loaded;
-                    e.total = oe.total;
-                    that._onProgress(e, options);
-                });
-                options.xhr = function () {
-                    return xhr;
-                };
-            }
-        },
-
-        _isInstanceOf: function (type, obj) {
-            // Cross-frame instanceof check
-            return Object.prototype.toString.call(obj) === '[object ' + type + ']';
-        },
-
-        _initXHRData: function (options) {
-            var that = this,
-                formData,
-                file = options.files[0],
-                // Ignore non-multipart setting if not supported:
-                multipart = options.multipart || !$.support.xhrFileUpload,
-                paramName = options.paramName[0];
-            options.headers = options.headers || {};
-            if (options.contentRange) {
-                options.headers['Content-Range'] = options.contentRange;
-            }
-            if (!multipart) {
-                options.headers['Content-Disposition'] = 'attachment; filename="' +
-                    encodeURI(file.name) + '"';
-                options.contentType = file.type;
-                options.data = options.blob || file;
-            } else if ($.support.xhrFormDataFileUpload) {
-                if (options.postMessage) {
-                    // window.postMessage does not allow sending FormData
-                    // objects, so we just add the File/Blob objects to
-                    // the formData array and let the postMessage window
-                    // create the FormData object out of this array:
-                    formData = this._getFormData(options);
-                    if (options.blob) {
-                        formData.push({
-                            name: paramName,
-                            value: options.blob
-                        });
-                    } else {
-                        $.each(options.files, function (index, file) {
-                            formData.push({
-                                name: options.paramName[index] || paramName,
-                                value: file
-                            });
-                        });
-                    }
-                } else {
-                    if (that._isInstanceOf('FormData', options.formData)) {
-                        formData = options.formData;
-                    } else {
-                        formData = new FormData();
-                        $.each(this._getFormData(options), function (index, field) {
-                            formData.append(field.name, field.value);
-                        });
-                    }
-                    if (options.blob) {
-                        options.headers['Content-Disposition'] = 'attachment; filename="' +
-                            encodeURI(file.name) + '"';
-                        formData.append(paramName, options.blob, file.name);
-                    } else {
-                        $.each(options.files, function (index, file) {
-                            // This check allows the tests to run with
-                            // dummy objects:
-                            if (that._isInstanceOf('File', file) ||
-                                    that._isInstanceOf('Blob', file)) {
-                                formData.append(
-                                    options.paramName[index] || paramName,
-                                    file,
-                                    file.name
-                                );
-                            }
-                        });
-                    }
-                }
-                options.data = formData;
-            }
-            // Blob reference is not needed anymore, free memory:
-            options.blob = null;
-        },
-
-        _initIframeSettings: function (options) {
-            // Setting the dataType to iframe enables the iframe transport:
-            options.dataType = 'iframe ' + (options.dataType || '');
-            // The iframe transport accepts a serialized array as form data:
-            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) {
-                options.formData.push({
-                    name: options.redirectParamName || 'redirect',
-                    value: options.redirect
-                });
-            }
-        },
-
-        _initDataSettings: function (options) {
-            if (this._isXHRUpload(options)) {
-                if (!this._chunkedUpload(options, true)) {
-                    if (!options.data) {
-                        this._initXHRData(options);
-                    }
-                    this._initProgressListener(options);
-                }
-                if (options.postMessage) {
-                    // Setting the dataType to postmessage enables the
-                    // postMessage transport:
-                    options.dataType = 'postmessage ' + (options.dataType || '');
-                }
-            } else {
-                this._initIframeSettings(options);
-            }
-        },
-
-        _getParamName: function (options) {
-            var fileInput = $(options.fileInput),
-                paramName = options.paramName;
-            if (!paramName) {
-                paramName = [];
-                fileInput.each(function () {
-                    var input = $(this),
-                        name = input.prop('name') || 'files[]',
-                        i = (input.prop('files') || [1]).length;
-                    while (i) {
-                        paramName.push(name);
-                        i -= 1;
-                    }
-                });
-                if (!paramName.length) {
-                    paramName = [fileInput.prop('name') || 'files[]'];
-                }
-            } else if (!$.isArray(paramName)) {
-                paramName = [paramName];
-            }
-            return paramName;
-        },
-
-        _initFormSettings: function (options) {
-            // Retrieve missing options from the input field and the
-            // associated form, if available:
-            if (!options.form || !options.form.length) {
-                options.form = $(options.fileInput.prop('form'));
-                // If the given file input doesn't have an associated form,
-                // use the default widget file input's form:
-                if (!options.form.length) {
-                    options.form = $(this.options.fileInput.prop('form'));
-                }
-            }
-            options.paramName = this._getParamName(options);
-            if (!options.url) {
-                options.url = options.form.prop('action') || location.href;
-            }
-            // The HTTP request method must be "POST" or "PUT":
-            options.type = (options.type || options.form.prop('method') || '')
-                .toUpperCase();
-            if (options.type !== 'POST' && options.type !== 'PUT' &&
-                    options.type !== 'PATCH') {
-                options.type = 'POST';
-            }
-            if (!options.formAcceptCharset) {
-                options.formAcceptCharset = options.form.attr('accept-charset');
-            }
-        },
-
-        _getAJAXSettings: function (data) {
-            var options = $.extend({}, this.options, data);
-            this._initFormSettings(options);
-            this._initDataSettings(options);
-            return options;
-        },
-
-        // jQuery 1.6 doesn't provide .state(),
-        // while jQuery 1.8+ removed .isRejected() and .isResolved():
-        _getDeferredState: function (deferred) {
-            if (deferred.state) {
-                return deferred.state();
-            }
-            if (deferred.isResolved()) {
-                return 'resolved';
-            }
-            if (deferred.isRejected()) {
-                return 'rejected';
-            }
-            return 'pending';
-        },
-
-        // Maps jqXHR callbacks to the equivalent
-        // methods of the given Promise object:
-        _enhancePromise: function (promise) {
-            promise.success = promise.done;
-            promise.error = promise.fail;
-            promise.complete = promise.always;
-            return promise;
-        },
-
-        // Creates and returns a Promise object enhanced with
-        // the jqXHR methods abort, success, error and complete:
-        _getXHRPromise: function (resolveOrReject, context, args) {
-            var dfd = $.Deferred(),
-                promise = dfd.promise();
-            context = context || this.options.context || promise;
-            if (resolveOrReject === true) {
-                dfd.resolveWith(context, args);
-            } else if (resolveOrReject === false) {
-                dfd.rejectWith(context, args);
-            }
-            promise.abort = dfd.promise;
-            return this._enhancePromise(promise);
-        },
-
-        // Adds convenience methods to the data callback argument:
-        _addConvenienceMethods: function (e, data) {
-            var that = this,
-                getPromise = function (data) {
-                    return $.Deferred().resolveWith(that, [data]).promise();
-                };
-            data.process = function (resolveFunc, rejectFunc) {
-                if (resolveFunc || rejectFunc) {
-                    data._processQueue = this._processQueue =
-                        (this._processQueue || getPromise(this))
-                            .pipe(resolveFunc, rejectFunc);
-                }
-                return this._processQueue || getPromise(this);
-            };
-            data.submit = function () {
-                if (this.state() !== 'pending') {
-                    data.jqXHR = this.jqXHR =
-                        (that._trigger('submit', e, this) !== false) &&
-                        that._onSend(e, this);
-                }
-                return this.jqXHR || that._getXHRPromise();
-            };
-            data.abort = function () {
-                if (this.jqXHR) {
-                    return this.jqXHR.abort();
-                }
-                return that._getXHRPromise();
-            };
-            data.state = function () {
-                if (this.jqXHR) {
-                    return that._getDeferredState(this.jqXHR);
-                }
-                if (this._processQueue) {
-                    return that._getDeferredState(this._processQueue);
-                }
-            };
-            data.progress = function () {
-                return this._progress;
-            };
-            data.response = function () {
-                return this._response;
-            };
-        },
-
-        // Parses the Range header from the server response
-        // and returns the uploaded bytes:
-        _getUploadedBytes: function (jqXHR) {
-            var range = jqXHR.getResponseHeader('Range'),
-                parts = range && range.split('-'),
-                upperBytesPos = parts && parts.length > 1 &&
-                    parseInt(parts[1], 10);
-            return upperBytesPos && upperBytesPos + 1;
-        },
-
-        // Uploads a file in multiple, sequential requests
-        // by splitting the file up in multiple blob chunks.
-        // If the second parameter is true, only tests if the file
-        // should be uploaded in chunks, but does not invoke any
-        // upload requests:
-        _chunkedUpload: function (options, testOnly) {
-            var that = this,
-                file = options.files[0],
-                fs = file.size,
-                ub = options.uploadedBytes = options.uploadedBytes || 0,
-                mcs = options.maxChunkSize || fs,
-                slice = file.slice || file.webkitSlice || file.mozSlice,
-                dfd = $.Deferred(),
-                promise = dfd.promise(),
-                jqXHR,
-                upload;
-            if (!(this._isXHRUpload(options) && slice && (ub || mcs < fs)) ||
-                    options.data) {
-                return false;
-            }
-            if (testOnly) {
-                return true;
-            }
-            if (ub >= fs) {
-                file.error = options.i18n('uploadedBytes');
-                return this._getXHRPromise(
-                    false,
-                    options.context,
-                    [null, 'error', file.error]
-                );
-            }
-            // The chunk upload method:
-            upload = function () {
-                // Clone the options object for each chunk upload:
-                var o = $.extend({}, options),
-                    currentLoaded = o._progress.loaded;
-                o.blob = slice.call(
-                    file,
-                    ub,
-                    ub + mcs,
-                    file.type
-                );
-                // Store the current chunk size, as the blob itself
-                // will be dereferenced after data processing:
-                o.chunkSize = o.blob.size;
-                // Expose the chunk bytes position range:
-                o.contentRange = 'bytes ' + ub + '-' +
-                    (ub + o.chunkSize - 1) + '/' + fs;
-                // Process the upload data (the blob and potential form data):
-                that._initXHRData(o);
-                // Add progress listeners for this chunk upload:
-                that._initProgressListener(o);
-                jqXHR = ((that._trigger('chunksend', null, o) !== false && $.ajax(o)) ||
-                        that._getXHRPromise(false, o.context))
-                    .done(function (result, textStatus, jqXHR) {
-                        ub = that._getUploadedBytes(jqXHR) ||
-                            (ub + o.chunkSize);
-                        // Create a progress event if no final progress event
-                        // with loaded equaling total has been triggered
-                        // for this chunk:
-                        if (currentLoaded + o.chunkSize - o._progress.loaded) {
-                            that._onProgress($.Event('progress', {
-                                lengthComputable: true,
-                                loaded: ub - o.uploadedBytes,
-                                total: ub - o.uploadedBytes
-                            }), o);
-                        }
-                        options.uploadedBytes = o.uploadedBytes = ub;
-                        o.result = result;
-                        o.textStatus = textStatus;
-                        o.jqXHR = jqXHR;
-                        that._trigger('chunkdone', null, o);
-                        that._trigger('chunkalways', null, o);
-                        if (ub < fs) {
-                            // File upload not yet complete,
-                            // continue with the next chunk:
-                            upload();
-                        } else {
-                            dfd.resolveWith(
-                                o.context,
-                                [result, textStatus, jqXHR]
-                            );
-                        }
-                    })
-                    .fail(function (jqXHR, textStatus, errorThrown) {
-                        o.jqXHR = jqXHR;
-                        o.textStatus = textStatus;
-                        o.errorThrown = errorThrown;
-                        that._trigger('chunkfail', null, o);
-                        that._trigger('chunkalways', null, o);
-                        dfd.rejectWith(
-                            o.context,
-                            [jqXHR, textStatus, errorThrown]
-                        );
-                    });
-            };
-            this._enhancePromise(promise);
-            promise.abort = function () {
-                return jqXHR.abort();
-            };
-            upload();
-            return promise;
-        },
-
-        _beforeSend: function (e, data) {
-            if (this._active === 0) {
-                // the start callback is triggered when an upload starts
-                // and no other uploads are currently running,
-                // equivalent to the global ajaxStart event:
-                this._trigger('start');
-                // Set timer for global bitrate progress calculation:
-                this._bitrateTimer = new this._BitrateTimer();
-                // Reset the global progress values:
-                this._progress.loaded = this._progress.total = 0;
-                this._progress.bitrate = 0;
-            }
-            // Make sure the container objects for the .response() and
-            // .progress() methods on the data object are available
-            // and reset to their initial state:
-            this._initResponseObject(data);
-            this._initProgressObject(data);
-            data._progress.loaded = data.loaded = data.uploadedBytes || 0;
-            data._progress.total = data.total = this._getTotal(data.files) || 1;
-            data._progress.bitrate = data.bitrate = 0;
-            this._active += 1;
-            // Initialize the global progress values:
-            this._progress.loaded += data.loaded;
-            this._progress.total += data.total;
-        },
-
-        _onDone: function (result, textStatus, jqXHR, options) {
-            var total = options._progress.total,
-                response = options._response;
-            if (options._progress.loaded < total) {
-                // Create a progress event if no final progress event
-                // with loaded equaling total has been triggered:
-                this._onProgress($.Event('progress', {
-                    lengthComputable: true,
-                    loaded: total,
-                    total: total
-                }), options);
-            }
-            response.result = options.result = result;
-            response.textStatus = options.textStatus = textStatus;
-            response.jqXHR = options.jqXHR = jqXHR;
-            this._trigger('done', null, options);
-        },
-
-        _onFail: function (jqXHR, textStatus, errorThrown, options) {
-            var response = options._response;
-            if (options.recalculateProgress) {
-                // Remove the failed (error or abort) file upload from
-                // the global progress calculation:
-                this._progress.loaded -= options._progress.loaded;
-                this._progress.total -= options._progress.total;
-            }
-            response.jqXHR = options.jqXHR = jqXHR;
-            response.textStatus = options.textStatus = textStatus;
-            response.errorThrown = options.errorThrown = errorThrown;
-            this._trigger('fail', null, options);
-        },
-
-        _onAlways: function (jqXHRorResult, textStatus, jqXHRorError, options) {
-            // jqXHRorResult, textStatus and jqXHRorError are added to the
-            // options object via done and fail callbacks
-            this._trigger('always', null, options);
-        },
-
-        _onSend: function (e, data) {
-            if (!data.submit) {
-                this._addConvenienceMethods(e, data);
-            }
-            var that = this,
-                jqXHR,
-                aborted,
-                slot,
-                pipe,
-                options = that._getAJAXSettings(data),
-                send = function () {
-                    that._sending += 1;
-                    // Set timer for bitrate progress calculation:
-                    options._bitrateTimer = new that._BitrateTimer();
-                    jqXHR = jqXHR || (
-                        ((aborted || that._trigger('send', e, options) === false) &&
-                        that._getXHRPromise(false, options.context, aborted)) ||
-                        that._chunkedUpload(options) || $.ajax(options)
-                    ).done(function (result, textStatus, jqXHR) {
-                        that._onDone(result, textStatus, jqXHR, options);
-                    }).fail(function (jqXHR, textStatus, errorThrown) {
-                        that._onFail(jqXHR, textStatus, errorThrown, options);
-                    }).always(function (jqXHRorResult, textStatus, jqXHRorError) {
-                        that._onAlways(
-                            jqXHRorResult,
-                            textStatus,
-                            jqXHRorError,
-                            options
-                        );
-                        that._sending -= 1;
-                        that._active -= 1;
-                        if (options.limitConcurrentUploads &&
-                                options.limitConcurrentUploads > that._sending) {
-                            // Start the next queued upload,
-                            // that has not been aborted:
-                            var nextSlot = that._slots.shift();
-                            while (nextSlot) {
-                                if (that._getDeferredState(nextSlot) === 'pending') {
-                                    nextSlot.resolve();
-                                    break;
-                                }
-                                nextSlot = that._slots.shift();
-                            }
-                        }
-                        if (that._active === 0) {
-                            // The stop callback is triggered when all uploads have
-                            // been completed, equivalent to the global ajaxStop event:
-                            that._trigger('stop');
-                        }
-                    });
-                    return jqXHR;
-                };
-            this._beforeSend(e, options);
-            if (this.options.sequentialUploads ||
-                    (this.options.limitConcurrentUploads &&
-                    this.options.limitConcurrentUploads <= this._sending)) {
-                if (this.options.limitConcurrentUploads > 1) {
-                    slot = $.Deferred();
-                    this._slots.push(slot);
-                    pipe = slot.pipe(send);
-                } else {
-                    pipe = (this._sequence = this._sequence.pipe(send, send));
-                }
-                // Return the piped Promise object, enhanced with an abort method,
-                // which is delegated to the jqXHR object of the current upload,
-                // and jqXHR callbacks mapped to the equivalent Promise methods:
-                pipe.abort = function () {
-                    aborted = [undefined, 'abort', 'abort'];
-                    if (!jqXHR) {
-                        if (slot) {
-                            slot.rejectWith(options.context, aborted);
-                        }
-                        return send();
-                    }
-                    return jqXHR.abort();
-                };
-                return this._enhancePromise(pipe);
-            }
-            return send();
-        },
-
-        _onAdd: function (e, data) {
-            var that = this,
-                result = true,
-                options = $.extend({}, this.options, data),
-                limit = options.limitMultiFileUploads,
-                paramName = this._getParamName(options),
-                paramNameSet,
-                paramNameSlice,
-                fileSet,
-                i;
-            if (!(options.singleFileUploads || limit) ||
-                    !this._isXHRUpload(options)) {
-                fileSet = [data.files];
-                paramNameSet = [paramName];
-            } else if (!options.singleFileUploads && limit) {
-                fileSet = [];
-                paramNameSet = [];
-                for (i = 0; i < data.files.length; i += limit) {
-                    fileSet.push(data.files.slice(i, i + limit));
-                    paramNameSlice = paramName.slice(i, i + limit);
-                    if (!paramNameSlice.length) {
-                        paramNameSlice = paramName;
-                    }
-                    paramNameSet.push(paramNameSlice);
-                }
-            } else {
-                paramNameSet = paramName;
-            }
-            data.originalFiles = data.files;
-            $.each(fileSet || data.files, function (index, element) {
-                var newData = $.extend({}, data);
-                newData.files = fileSet ? element : [element];
-                newData.paramName = paramNameSet[index];
-                that._initResponseObject(newData);
-                that._initProgressObject(newData);
-                that._addConvenienceMethods(e, newData);
-                result = that._trigger('add', e, newData);
-                return result;
-            });
-            return result;
-        },
-
-        _replaceFileInput: function (input) {
-            var inputClone = input.clone(true);
-            $('<form></form>').append(inputClone)[0].reset();
-            // Detaching allows to insert the fileInput on another form
-            // without loosing the file input value:
-            input.after(inputClone).detach();
-            // Avoid memory leaks with the detached file input:
-            $.cleanData(input.unbind('remove'));
-            // Replace the original file input element in the fileInput
-            // elements set with the clone, which has been copied including
-            // event handlers:
-            this.options.fileInput = this.options.fileInput.map(function (i, el) {
-                if (el === input[0]) {
-                    return inputClone[0];
-                }
-                return el;
-            });
-            // If the widget has been initialized on the file input itself,
-            // override this.element with the file input clone:
-            if (input[0] === this.element[0]) {
-                this.element = inputClone;
-            }
-        },
-
-        _handleFileTreeEntry: function (entry, path) {
-            var that = this,
-                dfd = $.Deferred(),
-                errorHandler = function (e) {
-                    if (e && !e.entry) {
-                        e.entry = entry;
-                    }
-                    // Since $.when returns immediately if one
-                    // Deferred is rejected, we use resolve instead.
-                    // This allows valid files and invalid items
-                    // to be returned together in one set:
-                    dfd.resolve([e]);
-                },
-                dirReader;
-            path = path || '';
-            if (entry.isFile) {
-                if (entry._file) {
-                    // Workaround for Chrome bug #149735
-                    entry._file.relativePath = path;
-                    dfd.resolve(entry._file);
-                } else {
-                    entry.file(function (file) {
-                        file.relativePath = path;
-                        dfd.resolve(file);
-                    }, errorHandler);
-                }
-            } else if (entry.isDirectory) {
-                dirReader = entry.createReader();
-                dirReader.readEntries(function (entries) {
-                    that._handleFileTreeEntries(
-                        entries,
-                        path + entry.name + '/'
-                    ).done(function (files) {
-                        dfd.resolve(files);
-                    }).fail(errorHandler);
-                }, errorHandler);
-            } else {
-                // Return an empy list for file system items
-                // other than files or directories:
-                dfd.resolve([]);
-            }
-            return dfd.promise();
-        },
-
-        _handleFileTreeEntries: function (entries, path) {
-            var that = this;
-            return $.when.apply(
-                $,
-                $.map(entries, function (entry) {
-                    return that._handleFileTreeEntry(entry, path);
-                })
-            ).pipe(function () {
-                return Array.prototype.concat.apply(
-                    [],
-                    arguments
-                );
-            });
-        },
-
-        _getDroppedFiles: function (dataTransfer) {
-            dataTransfer = dataTransfer || {};
-            var items = dataTransfer.items;
-            if (items && items.length && (items[0].webkitGetAsEntry ||
-                    items[0].getAsEntry)) {
-                return this._handleFileTreeEntries(
-                    $.map(items, function (item) {
-                        var entry;
-                        if (item.webkitGetAsEntry) {
-                            entry = item.webkitGetAsEntry();
-                            if (entry) {
-                                // Workaround for Chrome bug #149735:
-                                entry._file = item.getAsFile();
-                            }
-                            return entry;
-                        }
-                        return item.getAsEntry();
-                    })
-                );
-            }
-            return $.Deferred().resolve(
-                $.makeArray(dataTransfer.files)
-            ).promise();
-        },
-
-        _getSingleFileInputFiles: function (fileInput) {
-            fileInput = $(fileInput);
-            var entries = fileInput.prop('webkitEntries') ||
-                    fileInput.prop('entries'),
-                files,
-                value;
-            if (entries && entries.length) {
-                return this._handleFileTreeEntries(entries);
-            }
-            files = $.makeArray(fileInput.prop('files'));
-            if (!files.length) {
-                value = fileInput.prop('value');
-                if (!value) {
-                    return $.Deferred().resolve([]).promise();
-                }
-                // If the files property is not available, the browser does not
-                // support the File API and we add a pseudo File object with
-                // the input value as name with path information removed:
-                files = [{name: value.replace(/^.*\\/, '')}];
-            } else if (files[0].name === undefined && files[0].fileName) {
-                // File normalization for Safari 4 and Firefox 3:
-                $.each(files, function (index, file) {
-                    file.name = file.fileName;
-                    file.size = file.fileSize;
-                });
-            }
-            return $.Deferred().resolve(files).promise();
-        },
-
-        _getFileInputFiles: function (fileInput) {
-            if (!(fileInput instanceof $) || fileInput.length === 1) {
-                return this._getSingleFileInputFiles(fileInput);
-            }
-            return $.when.apply(
-                $,
-                $.map(fileInput, this._getSingleFileInputFiles)
-            ).pipe(function () {
-                return Array.prototype.concat.apply(
-                    [],
-                    arguments
-                );
-            });
-        },
-
-        _onChange: function (e) {
-            var that = this,
-                data = {
-                    fileInput: $(e.target),
-                    form: $(e.target.form)
-                };
-            this._getFileInputFiles(data.fileInput).always(function (files) {
-                data.files = files;
-                if (that.options.replaceFileInput) {
-                    that._replaceFileInput(data.fileInput);
-                }
-                if (that._trigger('change', e, data) !== false) {
-                    that._onAdd(e, data);
-                }
-            });
-        },
-
-        _onPaste: function (e) {
-            var items = e.originalEvent && e.originalEvent.clipboardData &&
-                    e.originalEvent.clipboardData.items,
-                data = {files: []};
-            if (items && items.length) {
-                $.each(items, function (index, item) {
-                    var file = item.getAsFile && item.getAsFile();
-                    if (file) {
-                        data.files.push(file);
-                    }
-                });
-                if (this._trigger('paste', e, data) === false ||
-                        this._onAdd(e, data) === false) {
-                    return false;
-                }
-            }
-        },
-
-        _onDrop: function (e) {
-            var that = this,
-                dataTransfer = e.dataTransfer = e.originalEvent &&
-                    e.originalEvent.dataTransfer,
-                data = {};
-            if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {
-                e.preventDefault();
-                this._getDroppedFiles(dataTransfer).always(function (files) {
-                    data.files = files;
-                    if (that._trigger('drop', e, data) !== false) {
-                        that._onAdd(e, data);
-                    }
-                });
-            }
-        },
-
-        _onDragOver: function (e) {
-            var dataTransfer = e.dataTransfer = e.originalEvent &&
-                e.originalEvent.dataTransfer;
-            if (dataTransfer) {
-                if (this._trigger('dragover', e) === false) {
-                    return false;
-                }
-                if ($.inArray('Files', dataTransfer.types) !== -1) {
-                    dataTransfer.dropEffect = 'copy';
-                    e.preventDefault();
-                }
-            }
-        },
-
-        _initEventHandlers: function () {
-            if (this._isXHRUpload(this.options)) {
-                this._on(this.options.dropZone, {
-                    dragover: this._onDragOver,
-                    drop: this._onDrop
-                });
-                this._on(this.options.pasteZone, {
-                    paste: this._onPaste
-                });
-            }
-            this._on(this.options.fileInput, {
-                change: this._onChange
-            });
-        },
-
-        _destroyEventHandlers: function () {
-            this._off(this.options.dropZone, 'dragover drop');
-            this._off(this.options.pasteZone, 'paste');
-            this._off(this.options.fileInput, 'change');
-        },
-
-        _setOption: function (key, value) {
-            var reinit = $.inArray(key, this._specialOptions) !== -1;
-            if (reinit) {
-                this._destroyEventHandlers();
-            }
-            this._super(key, value);
-            if (reinit) {
-                this._initSpecialOptions();
-                this._initEventHandlers();
-            }
-        },
-
-        _initSpecialOptions: function () {
-            var options = this.options;
-            if (options.fileInput === undefined) {
-                options.fileInput = this.element.is('input[type="file"]') ?
-                        this.element : this.element.find('input[type="file"]');
-            } else if (!(options.fileInput instanceof $)) {
-                options.fileInput = $(options.fileInput);
-            }
-            if (!(options.dropZone instanceof $)) {
-                options.dropZone = $(options.dropZone);
-            }
-            if (!(options.pasteZone instanceof $)) {
-                options.pasteZone = $(options.pasteZone);
-            }
-        },
-
-        _getRegExp: function (str) {
-            var parts = str.split('/'),
-                modifiers = parts.pop();
-            parts.shift();
-            return new RegExp(parts.join('/'), modifiers);
-        },
-
-        _isRegExpOption: function (key, value) {
-            return key !== 'url' && $.type(value) === 'string' &&
-                /^\/.*\/[igm]{0,3}$/.test(value);
-        },
-
-        _initDataAttributes: function () {
-            var that = this,
-                options = this.options;
-            // Initialize options set via HTML5 data-attributes:
-            $.each(
-                $(this.element[0].cloneNode(false)).data(),
-                function (key, value) {
-                    if (that._isRegExpOption(key, value)) {
-                        value = that._getRegExp(value);
-                    }
-                    options[key] = value;
-                }
-            );
-        },
-
-        _create: function () {
-            this._initDataAttributes();
-            this._initSpecialOptions();
-            this._slots = [];
-            this._sequence = this._getXHRPromise(true);
-            this._sending = this._active = 0;
-            this._initProgressObject(this);
-            this._initEventHandlers();
-        },
-
-        // This method is exposed to the widget API and allows to query
-        // the number of active uploads:
-        active: function () {
-            return this._active;
-        },
-
-        // This method is exposed to the widget API and allows to query
-        // the widget upload progress.
-        // It returns an object with loaded, total and bitrate properties
-        // for the running uploads:
-        progress: function () {
-            return this._progress;
-        },
-
-        // This method is exposed to the widget API and allows adding files
-        // using the fileupload API. The data parameter accepts an object which
-        // must have a files property and can contain additional options:
-        // .fileupload('add', {files: filesList});
-        add: function (data) {
-            var that = this;
-            if (!data || this.options.disabled) {
-                return;
-            }
-            if (data.fileInput && !data.files) {
-                this._getFileInputFiles(data.fileInput).always(function (files) {
-                    data.files = files;
-                    that._onAdd(null, data);
-                });
-            } else {
-                data.files = $.makeArray(data.files);
-                this._onAdd(null, data);
-            }
-        },
-
-        // This method is exposed to the widget API and allows sending files
-        // using the fileupload API. The data parameter accepts an object which
-        // must have a files or fileInput property and can contain additional options:
-        // .fileupload('send', {files: filesList});
-        // The method returns a Promise object for the file upload call.
-        send: function (data) {
-            if (data && !this.options.disabled) {
-                if (data.fileInput && !data.files) {
-                    var that = this,
-                        dfd = $.Deferred(),
-                        promise = dfd.promise(),
-                        jqXHR,
-                        aborted;
-                    promise.abort = function () {
-                        aborted = true;
-                        if (jqXHR) {
-                            return jqXHR.abort();
-                        }
-                        dfd.reject(null, 'abort', 'abort');
-                        return promise;
-                    };
-                    this._getFileInputFiles(data.fileInput).always(
-                        function (files) {
-                            if (aborted) {
-                                return;
-                            }
-                            data.files = files;
-                            jqXHR = that._onSend(null, data).then(
-                                function (result, textStatus, jqXHR) {
-                                    dfd.resolve(result, textStatus, jqXHR);
-                                },
-                                function (jqXHR, textStatus, errorThrown) {
-                                    dfd.reject(jqXHR, textStatus, errorThrown);
-                                }
-                            );
-                        }
-                    );
-                    return this._enhancePromise(promise);
-                }
-                data.files = $.makeArray(data.files);
-                if (data.files.length) {
-                    return this._onSend(null, data);
-                }
-            }
-            return this._getXHRPromise(false, data && data.context);
-        }
-
-    });
-
-}));
Index: dmin/js/jsUpload/jquery.iframe-transport.js
===================================================================
--- admin/js/jsUpload/jquery.iframe-transport.js	(revision 1144)
+++ 	(revision )
@@ -1,191 +1,0 @@
-/*
- * jQuery Iframe Transport Plugin 1.6.2
- * https://github.com/blueimp/jQuery-File-Upload
- *
- * Copyright 2011, Sebastian Tschan
- * https://blueimp.net
- *
- * Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
- */
-
-/*jslint unparam: true, nomen: true */
-/*global define, window, document */
-
-(function (factory) {
-    'use strict';
-    if (typeof define === 'function' && define.amd) {
-        // Register as an anonymous AMD module:
-        define(['jquery'], factory);
-    } else {
-        // Browser globals:
-        factory(window.jQuery);
-    }
-}(function ($) {
-    'use strict';
-
-    // Helper variable to create unique names for the transport iframes:
-    var counter = 0;
-
-    // The iframe transport accepts three additional options:
-    // options.fileInput: a jQuery collection of file input fields
-    // options.paramName: the parameter name for the file form data,
-    //  overrides the name property of the file input field(s),
-    //  can be a string or an array of strings.
-    // options.formData: an array of objects with name and value properties,
-    //  equivalent to the return data of .serializeArray(), e.g.:
-    //  [{name: 'a', value: 1}, {name: 'b', value: 2}]
-    $.ajaxTransport('iframe', function (options) {
-        if (options.async) {
-            var form,
-                iframe,
-                addParamChar;
-            return {
-                send: function (_, completeCallback) {
-                    form = $('<form style="display:none;"></form>');
-                    form.attr('accept-charset', options.formAcceptCharset);
-                    addParamChar = /\?/.test(options.url) ? '&' : '?';
-                    // XDomainRequest only supports GET and POST:
-                    if (options.type === 'DELETE') {
-                        options.url = options.url + addParamChar + '_method=DELETE';
-                        options.type = 'POST';
-                    } else if (options.type === 'PUT') {
-                        options.url = options.url + addParamChar + '_method=PUT';
-                        options.type = 'POST';
-                    } else if (options.type === 'PATCH') {
-                        options.url = options.url + addParamChar + '_method=PATCH';
-                        options.type = 'POST';
-                    }
-                    // javascript:false as initial iframe src
-                    // prevents warning popups on HTTPS in IE6.
-                    // IE versions below IE8 cannot set the name property of
-                    // elements that have already been added to the DOM,
-                    // so we set the name along with the iframe HTML markup:
-                    counter += 1;
-                    iframe = $(
-                        '<iframe src="javascript:false;" name="iframe-transport-' +
-                            counter + '"></iframe>'
-                    ).bind('load', function () {
-                        var fileInputClones,
-                            paramNames = $.isArray(options.paramName) ?
-                                    options.paramName : [options.paramName];
-                        iframe
-                            .unbind('load')
-                            .bind('load', function () {
-                                var response;
-                                // Wrap in a try/catch block to catch exceptions thrown
-                                // when trying to access cross-domain iframe contents:
-                                try {
-                                    response = iframe.contents();
-                                    // Google Chrome and Firefox do not throw an
-                                    // exception when calling iframe.contents() on
-                                    // cross-domain requests, so we unify the response:
-                                    if (!response.length || !response[0].firstChild) {
-                                        throw new Error();
-                                    }
-                                } catch (e) {
-                                    response = undefined;
-                                }
-                                // The complete callback returns the
-                                // iframe content document as response object:
-                                completeCallback(
-                                    200,
-                                    'success',
-                                    {'iframe': response}
-                                );
-                                // Fix for IE endless progress bar activity bug
-                                // (happens on form submits to iframe targets):
-                                $('<iframe src="javascript:false;"></iframe>')
-                                    .appendTo(form);
-                                window.setTimeout(function () {
-                                    // Removing the form in a setTimeout call
-                                    // allows Chrome's developer tools to display
-                                    // the response result
-                                    form.remove();
-                                }, 0);
-                            });
-                        form
-                            .prop('target', iframe.prop('name'))
-                            .prop('action', options.url)
-                            .prop('method', options.type);
-                        if (options.formData) {
-                            $.each(options.formData, function (index, field) {
-                                $('<input type="hidden"/>')
-                                    .prop('name', field.name)
-                                    .val(field.value)
-                                    .appendTo(form);
-                            });
-                        }
-                        if (options.fileInput && options.fileInput.length &&
-                                options.type === 'POST') {
-                            fileInputClones = options.fileInput.clone();
-                            // Insert a clone for each file input field:
-                            options.fileInput.after(function (index) {
-                                return fileInputClones[index];
-                            });
-                            if (options.paramName) {
-                                options.fileInput.each(function (index) {
-                                    $(this).prop(
-                                        'name',
-                                        paramNames[index] || options.paramName
-                                    );
-                                });
-                            }
-                            // Appending the file input fields to the hidden form
-                            // removes them from their original location:
-                            form
-                                .append(options.fileInput)
-                                .prop('enctype', 'multipart/form-data')
-                                // enctype must be set as encoding for IE:
-                                .prop('encoding', 'multipart/form-data');
-                        }
-                        form.submit();
-                        // Insert the file input fields at their original location
-                        // by replacing the clones with the originals:
-                        if (fileInputClones && fileInputClones.length) {
-                            options.fileInput.each(function (index, input) {
-                                var clone = $(fileInputClones[index]);
-                                $(input).prop('name', clone.prop('name'));
-                                clone.replaceWith(input);
-                            });
-                        }
-                    });
-                    form.append(iframe).appendTo(document.body);
-                },
-                abort: function () {
-                    if (iframe) {
-                        // javascript:false as iframe src aborts the request
-                        // and prevents warning popups on HTTPS in IE6.
-                        // concat is used to avoid the "Script URL" JSLint error:
-                        iframe
-                            .unbind('load')
-                            .prop('src', 'javascript'.concat(':false;'));
-                    }
-                    if (form) {
-                        form.remove();
-                    }
-                }
-            };
-        }
-    });
-
-    // The iframe transport returns the iframe content document as response.
-    // The following adds converters from iframe to text, json, html, and script:
-    $.ajaxSetup({
-        converters: {
-            'iframe text': function (iframe) {
-                return iframe && $(iframe[0].body).text();
-            },
-            'iframe json': function (iframe) {
-                return iframe && $.parseJSON($(iframe[0].body).text());
-            },
-            'iframe html': function (iframe) {
-                return iframe && $(iframe[0].body).html();
-            },
-            'iframe script': function (iframe) {
-                return iframe && $.globalEval($(iframe[0].body).text());
-            }
-        }
-    });
-
-}));
Index: dmin/js/jsUpload/load-image.js
===================================================================
--- admin/js/jsUpload/load-image.js	(revision 1144)
+++ 	(revision )
@@ -1,381 +1,0 @@
-/*
- * JavaScript Load Image 1.6
- * https://github.com/blueimp/JavaScript-Load-Image
- *
- * Copyright 2011, Sebastian Tschan
- * https://blueimp.net
- *
- * iOS image scaling fixes based on
- * https://github.com/stomita/ios-imagefile-megapixel
- *
- * Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
- */
-
-/*jslint nomen: true, bitwise: true */
-/*global window, document, URL, webkitURL, Blob, File, FileReader, define */
-
-(function ($) {
-    'use strict';
-
-    // Loads an image for a given File object.
-    // Invokes the callback with an img or optional canvas
-    // element (if supported by the browser) as parameter:
-    var loadImage = function (file, callback, options) {
-            var img = document.createElement('img'),
-                url,
-                oUrl;
-            img.onerror = callback;
-            img.onload = function () {
-                if (oUrl && !(options && options.noRevoke)) {
-                    loadImage.revokeObjectURL(oUrl);
-                }
-                if (callback) {
-                    callback(loadImage.scale(img, options));
-                }
-            };
-            if (loadImage.isInstanceOf('Blob', file) ||
-                    // Files are also Blob instances, but some browsers
-                    // (Firefox 3.6) support the File API but not Blobs:
-                    loadImage.isInstanceOf('File', file)) {
-                url = oUrl = loadImage.createObjectURL(file);
-                // Store the file type for resize processing:
-                img._type = file.type;
-            } else if (typeof file === 'string') {
-                url = file;
-                if (options && options.crossOrigin) {
-                    img.crossOrigin = options.crossOrigin;
-                }
-            } else {
-                return false;
-            }
-            if (url) {
-                img.src = url;
-                return img;
-            }
-            return loadImage.readFile(file, function (e) {
-                var target = e.target;
-                if (target && target.result) {
-                    img.src = target.result;
-                } else {
-                    if (callback) {
-                        callback(e);
-                    }
-                }
-            });
-        },
-        // The check for URL.revokeObjectURL fixes an issue with Opera 12,
-        // which provides URL.createObjectURL but doesn't properly implement it:
-        urlAPI = (window.createObjectURL && window) ||
-            (window.URL && URL.revokeObjectURL && URL) ||
-            (window.webkitURL && webkitURL);
-
-    loadImage.isInstanceOf = function (type, obj) {
-        // Cross-frame instanceof check
-        return Object.prototype.toString.call(obj) === '[object ' + type + ']';
-    };
-
-    // Transform image orientation based on the given EXIF orientation data:
-    loadImage.transformCoordinates = function (canvas, orientation) {
-        var ctx = canvas.getContext('2d'),
-            width = canvas.width,
-            height = canvas.height;
-        if (orientation > 4) {
-            canvas.width = height;
-            canvas.height = width;
-        }
-        switch (orientation) {
-        case 2:
-            // horizontal flip
-            ctx.translate(width, 0);
-            ctx.scale(-1, 1);
-            break;
-        case 3:
-            // 180 rotate left
-            ctx.translate(width, height);
-            ctx.rotate(Math.PI);
-            break;
-        case 4:
-            // vertical flip
-            ctx.translate(0, height);
-            ctx.scale(1, -1);
-            break;
-        case 5:
-            // vertical flip + 90 rotate right
-            ctx.rotate(0.5 * Math.PI);
-            ctx.scale(1, -1);
-            break;
-        case 6:
-            // 90 rotate right
-            ctx.rotate(0.5 * Math.PI);
-            ctx.translate(0, -height);
-            break;
-        case 7:
-            // horizontal flip + 90 rotate right
-            ctx.rotate(0.5 * Math.PI);
-            ctx.translate(width, -height);
-            ctx.scale(-1, 1);
-            break;
-        case 8:
-            // 90 rotate left
-            ctx.rotate(-0.5 * Math.PI);
-            ctx.translate(-width, 0);
-            break;
-        }
-    };
-
-    // Detects subsampling in JPEG images:
-    loadImage.detectSubsampling = function (img) {
-        var canvas,
-            context;
-        if (img.width * img.height > 1024 * 1024) { // only consider mexapixel images
-            canvas = document.createElement('canvas');
-            canvas.width = canvas.height = 1;
-            context = canvas.getContext('2d');
-            context.drawImage(img, -img.width + 1, 0);
-            // subsampled image becomes half smaller in rendering size.
-            // check alpha channel value to confirm image is covering edge pixel or not.
-            // if alpha value is 0 image is not covering, hence subsampled.
-            return context.getImageData(0, 0, 1, 1).data[3] === 0;
-        }
-        return false;
-    };
-
-    // Detects vertical squash in JPEG images:
-    loadImage.detectVerticalSquash = function (img, correctedHeight) {
-        var canvas = document.createElement('canvas'),
-            context = canvas.getContext('2d'),
-            data,
-            sy,
-            ey,
-            py,
-            alpha;
-        canvas.width = 1;
-        canvas.height = correctedHeight;
-        context.drawImage(img, 0, 0);
-        data = context.getImageData(0, 0, 1, correctedHeight).data;
-        // search image edge pixel position in case it is squashed vertically:
-        sy = 0;
-        ey = correctedHeight;
-        py = correctedHeight;
-        while (py > sy) {
-            alpha = data[(py - 1) * 4 + 3];
-            if (alpha === 0) {
-                ey = py;
-            } else {
-                sy = py;
-            }
-            py = (ey + sy) >> 1;
-        }
-        return (py / correctedHeight) || 1;
-    };
-
-    // Renders image to canvas while working around iOS image scaling bugs:
-    // https://github.com/blueimp/JavaScript-Load-Image/issues/13
-    loadImage.renderImageToCanvas = function (
-        canvas,
-        img,
-        sourceX,
-        sourceY,
-        sourceWidth,
-        sourceHeight,
-        destX,
-        destY,
-        destWidth,
-        destHeight
-    ) {
-        var context = canvas.getContext('2d'),
-            tmpCanvas = document.createElement('canvas'),
-            tileSize = tmpCanvas.width = tmpCanvas.height = 1024,
-            tmpContext = tmpCanvas.getContext('2d'),
-            vertSquashRatio,
-            tileX,
-            tileY;
-        context.save();
-        if (loadImage.detectSubsampling(img)) {
-            sourceWidth /= 2;
-            sourceHeight /= 2;
-        }
-        vertSquashRatio = loadImage.detectVerticalSquash(img, sourceHeight);
-        destWidth = Math.ceil(tileSize * destWidth / sourceWidth);
-        destHeight = Math.ceil(
-            tileSize * destHeight / sourceHeight / vertSquashRatio
-        );
-        destY = 0;
-        tileY = 0;
-        while (tileY < sourceHeight) {
-            destX = 0;
-            tileX = 0;
-            while (tileX < sourceWidth) {
-                tmpContext.clearRect(0, 0, tileSize, tileSize);
-                tmpContext.drawImage(
-                    img,
-                    sourceX,
-                    sourceY,
-                    sourceWidth,
-                    sourceHeight,
-                    -tileX,
-                    -tileY,
-                    sourceWidth,
-                    sourceHeight
-                );
-                context.drawImage(
-                    tmpCanvas,
-                    0,
-                    0,
-                    tileSize,
-                    tileSize,
-                    destX,
-                    destY,
-                    destWidth,
-                    destHeight
-                );
-                tileX += tileSize;
-                destX += destWidth;
-            }
-            tileY += tileSize;
-            destY += destHeight;
-        }
-        context.restore();
-    };
-
-    // Scales the given image (img or canvas HTML element)
-    // using the given options.
-    // Returns a canvas object if the browser supports canvas
-    // and the canvas or crop option is true or a canvas object
-    // is passed as image, else the scaled image:
-    loadImage.scale = function (img, options) {
-        options = options || {};
-        var canvas = document.createElement('canvas'),
-            useCanvas = img.getContext ||
-                ((options.canvas || options.crop || options.orientation) &&
-                    canvas.getContext),
-            width = img.width,
-            height = img.height,
-            sourceWidth = width,
-            sourceHeight = height,
-            sourceX = 0,
-            sourceY = 0,
-            destX = 0,
-            destY = 0,
-            maxWidth,
-            maxHeight,
-            minWidth,
-            minHeight,
-            destWidth,
-            destHeight,
-            scale;
-        if (useCanvas && options.orientation > 4) {
-            maxWidth = options.maxHeight;
-            maxHeight = options.maxWidth;
-            minWidth = options.minHeight;
-            minHeight = options.minWidth;
-        } else {
-            maxWidth = options.maxWidth;
-            maxHeight = options.maxHeight;
-            minWidth = options.minWidth;
-            minHeight = options.minHeight;
-        }
-        if (useCanvas && maxWidth && maxHeight && options.crop) {
-            destWidth = maxWidth;
-            destHeight = maxHeight;
-            if (width / height < maxWidth / maxHeight) {
-                sourceHeight = maxHeight * width / maxWidth;
-                sourceY = (height - sourceHeight) / 2;
-            } else {
-                sourceWidth = maxWidth * height / maxHeight;
-                sourceX = (width - sourceWidth) / 2;
-            }
-        } else {
-            destWidth = width;
-            destHeight = height;
-            scale = Math.max(
-                (minWidth || destWidth) / destWidth,
-                (minHeight || destHeight) / destHeight
-            );
-            if (scale > 1) {
-                destWidth = Math.ceil(destWidth * scale);
-                destHeight = Math.ceil(destHeight * scale);
-            }
-            scale = Math.min(
-                (maxWidth || destWidth) / destWidth,
-                (maxHeight || destHeight) / destHeight
-            );
-            if (scale < 1) {
-                destWidth = Math.ceil(destWidth * scale);
-                destHeight = Math.ceil(destHeight * scale);
-            }
-        }
-        if (useCanvas) {
-            canvas.width = destWidth;
-            canvas.height = destHeight;
-            loadImage.transformCoordinates(
-                canvas,
-                options.orientation
-            );
-            if (img._type === 'image/jpeg') {
-                loadImage.renderImageToCanvas(
-                    canvas,
-                    img,
-                    sourceX,
-                    sourceY,
-                    sourceWidth,
-                    sourceHeight,
-                    destX,
-                    destY,
-                    destWidth,
-                    destHeight
-                );
-            } else {
-                canvas.getContext('2d').drawImage(
-                    img,
-                    sourceX,
-                    sourceY,
-                    sourceWidth,
-                    sourceHeight,
-                    destX,
-                    destY,
-                    destWidth,
-                    destHeight
-                );
-            }
-            return canvas;
-        }
-        img.width = destWidth;
-        img.height = destHeight;
-        return img;
-    };
-
-    loadImage.createObjectURL = function (file) {
-        return urlAPI ? urlAPI.createObjectURL(file) : false;
-    };
-
-    loadImage.revokeObjectURL = function (url) {
-        return urlAPI ? urlAPI.revokeObjectURL(url) : false;
-    };
-
-    // Loads a given File object via FileReader interface,
-    // invokes the callback with the event object (load or error).
-    // The result can be read via event.target.result:
-    loadImage.readFile = function (file, callback, method) {
-        if (window.FileReader && FileReader.prototype.readAsDataURL) {
-            var fileReader = new FileReader();
-            fileReader.onload = fileReader.onerror = callback;
-            method = method || 'readAsDataURL';
-            if (!fileReader[method]) {
-                return false;
-            }
-            fileReader[method](file);
-            return fileReader;
-        }
-        return false;
-    };
-
-    if (typeof define === 'function' && define.amd) {
-        define(function () {
-            return loadImage;
-        });
-    } else {
-        $.loadImage = loadImage;
-    }
-}(this));
Index: dmin/js/jsUpload/tmpl.js
===================================================================
--- admin/js/jsUpload/tmpl.js	(revision 1144)
+++ 	(revision )
@@ -1,86 +1,0 @@
-/*
- * JavaScript Templates 2.1.0
- * https://github.com/blueimp/JavaScript-Templates
- *
- * Copyright 2011, Sebastian Tschan
- * https://blueimp.net
- *
- * Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
- *
- * Inspired by John Resig's JavaScript Micro-Templating:
- * http://ejohn.org/blog/javascript-micro-templating/
- */
-
-/*jslint evil: true, regexp: true */
-/*global document, define */
-
-(function ($) {
-    "use strict";
-    var tmpl = function (str, data) {
-        var f = !/[^\w\-\.:]/.test(str) ? tmpl.cache[str] = tmpl.cache[str] ||
-                tmpl(tmpl.load(str)) :
-                    new Function(
-                        tmpl.arg + ',tmpl',
-                        "var _e=tmpl.encode" + tmpl.helper + ",_s='" +
-                            str.replace(tmpl.regexp, tmpl.func) +
-                            "';return _s;"
-                    );
-        return data ? f(data, tmpl) : function (data) {
-            return f(data, tmpl);
-        };
-    };
-    tmpl.cache = {};
-    tmpl.load = function (id) {
-        return document.getElementById(id).innerHTML;
-    };
-    tmpl.regexp = /([\s'\\])(?![^%]*%\})|(?:\{%(=|#)([\s\S]+?)%\})|(\{%)|(%\})/g;
-    tmpl.func = function (s, p1, p2, p3, p4, p5) {
-        if (p1) { // whitespace, quote and backspace in interpolation context
-            return {
-                "\n": "\\n",
-                "\r": "\\r",
-                "\t": "\\t",
-                " " : " "
-            }[s] || "\\" + s;
-        }
-        if (p2) { // interpolation: {%=prop%}, or unescaped: {%#prop%}
-            if (p2 === "=") {
-                return "'+_e(" + p3 + ")+'";
-            }
-            return "'+(" + p3 + "||'')+'";
-        }
-        if (p4) { // evaluation start tag: {%
-            return "';";
-        }
-        if (p5) { // evaluation end tag: %}
-            return "_s+='";
-        }
-    };
-    tmpl.encReg = /[<>&"'\x00]/g;
-    tmpl.encMap = {
-        "<"   : "&lt;",
-        ">"   : "&gt;",
-        "&"   : "&amp;",
-        "\""  : "&quot;",
-        "'"   : "&#39;"
-    };
-    tmpl.encode = function (s) {
-        return String(s || "").replace(
-            tmpl.encReg,
-            function (c) {
-                return tmpl.encMap[c] || "";
-            }
-        );
-    };
-    tmpl.arg = "o";
-    tmpl.helper = ",print=function(s,e){_s+=e&&(s||'')||_e(s);}" +
-        ",include=function(s,d){_s+=tmpl(s,d);}";
-    if (typeof define === "function" && define.amd) {
-        define(function () {
-            return tmpl;
-        });
-    } else {
-        $.tmpl = tmpl;
-    }
-}(this));
Index: dmin/js/jsUpload/vendor/jquery.ui.widget.js
===================================================================
--- admin/js/jsUpload/vendor/jquery.ui.widget.js	(revision 1144)
+++ 	(revision )
@@ -1,530 +1,0 @@
-/*
- * jQuery UI Widget 1.10.1+amd
- * https://github.com/blueimp/jQuery-File-Upload
- *
- * Copyright 2013 jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- * http://api.jqueryui.com/jQuery.widget/
- */
-
-(function (factory) {
-    if (typeof define === "function" && define.amd) {
-        // Register as an anonymous AMD module:
-        define(["jquery"], factory);
-    } else {
-        // Browser globals:
-        factory(jQuery);
-    }
-}(function( $, undefined ) {
-
-var uuid = 0,
-	slice = Array.prototype.slice,
-	_cleanData = $.cleanData;
-$.cleanData = function( elems ) {
-	for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
-		try {
-			$( elem ).triggerHandler( "remove" );
-		// http://bugs.jquery.com/ticket/8235
-		} catch( e ) {}
-	}
-	_cleanData( elems );
-};
-
-$.widget = function( name, base, prototype ) {
-	var fullName, existingConstructor, constructor, basePrototype,
-		// proxiedPrototype allows the provided prototype to remain unmodified
-		// so that it can be used as a mixin for multiple widgets (#8876)
-		proxiedPrototype = {},
-		namespace = name.split( "." )[ 0 ];
-
-	name = name.split( "." )[ 1 ];
-	fullName = namespace + "-" + name;
-
-	if ( !prototype ) {
-		prototype = base;
-		base = $.Widget;
-	}
-
-	// create selector for plugin
-	$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
-		return !!$.data( elem, fullName );
-	};
-
-	$[ namespace ] = $[ namespace ] || {};
-	existingConstructor = $[ namespace ][ name ];
-	constructor = $[ namespace ][ name ] = function( options, element ) {
-		// allow instantiation without "new" keyword
-		if ( !this._createWidget ) {
-			return new constructor( options, element );
-		}
-
-		// allow instantiation without initializing for simple inheritance
-		// must use "new" keyword (the code above always passes args)
-		if ( arguments.length ) {
-			this._createWidget( options, element );
-		}
-	};
-	// extend with the existing constructor to carry over any static properties
-	$.extend( constructor, existingConstructor, {
-		version: prototype.version,
-		// copy the object used to create the prototype in case we need to
-		// redefine the widget later
-		_proto: $.extend( {}, prototype ),
-		// track widgets that inherit from this widget in case this widget is
-		// redefined after a widget inherits from it
-		_childConstructors: []
-	});
-
-	basePrototype = new base();
-	// we need to make the options hash a property directly on the new instance
-	// otherwise we'll modify the options hash on the prototype that we're
-	// inheriting from
-	basePrototype.options = $.widget.extend( {}, basePrototype.options );
-	$.each( prototype, function( prop, value ) {
-		if ( !$.isFunction( value ) ) {
-			proxiedPrototype[ prop ] = value;
-			return;
-		}
-		proxiedPrototype[ prop ] = (function() {
-			var _super = function() {
-					return base.prototype[ prop ].apply( this, arguments );
-				},
-				_superApply = function( args ) {
-					return base.prototype[ prop ].apply( this, args );
-				};
-			return function() {
-				var __super = this._super,
-					__superApply = this._superApply,
-					returnValue;
-
-				this._super = _super;
-				this._superApply = _superApply;
-
-				returnValue = value.apply( this, arguments );
-
-				this._super = __super;
-				this._superApply = __superApply;
-
-				return returnValue;
-			};
-		})();
-	});
-	constructor.prototype = $.widget.extend( basePrototype, {
-		// TODO: remove support for widgetEventPrefix
-		// always use the name + a colon as the prefix, e.g., draggable:start
-		// don't prefix for widgets that aren't DOM-based
-		widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name
-	}, proxiedPrototype, {
-		constructor: constructor,
-		namespace: namespace,
-		widgetName: name,
-		widgetFullName: fullName
-	});
-
-	// If this widget is being redefined then we need to find all widgets that
-	// are inheriting from it and redefine all of them so that they inherit from
-	// the new version of this widget. We're essentially trying to replace one
-	// level in the prototype chain.
-	if ( existingConstructor ) {
-		$.each( existingConstructor._childConstructors, function( i, child ) {
-			var childPrototype = child.prototype;
-
-			// redefine the child widget using the same prototype that was
-			// originally used, but inherit from the new version of the base
-			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
-		});
-		// remove the list of existing child constructors from the old constructor
-		// so the old child constructors can be garbage collected
-		delete existingConstructor._childConstructors;
-	} else {
-		base._childConstructors.push( constructor );
-	}
-
-	$.widget.bridge( name, constructor );
-};
-
-$.widget.extend = function( target ) {
-	var input = slice.call( arguments, 1 ),
-		inputIndex = 0,
-		inputLength = input.length,
-		key,
-		value;
-	for ( ; inputIndex < inputLength; inputIndex++ ) {
-		for ( key in input[ inputIndex ] ) {
-			value = input[ inputIndex ][ key ];
-			if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
-				// Clone objects
-				if ( $.isPlainObject( value ) ) {
-					target[ key ] = $.isPlainObject( target[ key ] ) ?
-						$.widget.extend( {}, target[ key ], value ) :
-						// Don't extend strings, arrays, etc. with objects
-						$.widget.extend( {}, value );
-				// Copy everything else by reference
-				} else {
-					target[ key ] = value;
-				}
-			}
-		}
-	}
-	return target;
-};
-
-$.widget.bridge = function( name, object ) {
-	var fullName = object.prototype.widgetFullName || name;
-	$.fn[ name ] = function( options ) {
-		var isMethodCall = typeof options === "string",
-			args = slice.call( arguments, 1 ),
-			returnValue = this;
-
-		// allow multiple hashes to be passed on init
-		options = !isMethodCall && args.length ?
-			$.widget.extend.apply( null, [ options ].concat(args) ) :
-			options;
-
-		if ( isMethodCall ) {
-			this.each(function() {
-				var methodValue,
-					instance = $.data( this, fullName );
-				if ( !instance ) {
-					return $.error( "cannot call methods on " + name + " prior to initialization; " +
-						"attempted to call method '" + options + "'" );
-				}
-				if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
-					return $.error( "no such method '" + options + "' for " + name + " widget instance" );
-				}
-				methodValue = instance[ options ].apply( instance, args );
-				if ( methodValue !== instance && methodValue !== undefined ) {
-					returnValue = methodValue && methodValue.jquery ?
-						returnValue.pushStack( methodValue.get() ) :
-						methodValue;
-					return false;
-				}
-			});
-		} else {
-			this.each(function() {
-				var instance = $.data( this, fullName );
-				if ( instance ) {
-					instance.option( options || {} )._init();
-				} else {
-					$.data( this, fullName, new object( options, this ) );
-				}
-			});
-		}
-
-		return returnValue;
-	};
-};
-
-$.Widget = function( /* options, element */ ) {};
-$.Widget._childConstructors = [];
-
-$.Widget.prototype = {
-	widgetName: "widget",
-	widgetEventPrefix: "",
-	defaultElement: "<div>",
-	options: {
-		disabled: false,
-
-		// callbacks
-		create: null
-	},
-	_createWidget: function( options, element ) {
-		element = $( element || this.defaultElement || this )[ 0 ];
-		this.element = $( element );
-		this.uuid = uuid++;
-		this.eventNamespace = "." + this.widgetName + this.uuid;
-		this.options = $.widget.extend( {},
-			this.options,
-			this._getCreateOptions(),
-			options );
-
-		this.bindings = $();
-		this.hoverable = $();
-		this.focusable = $();
-
-		if ( element !== this ) {
-			$.data( element, this.widgetFullName, this );
-			this._on( true, this.element, {
-				remove: function( event ) {
-					if ( event.target === element ) {
-						this.destroy();
-					}
-				}
-			});
-			this.document = $( element.style ?
-				// element within the document
-				element.ownerDocument :
-				// element is window or document
-				element.document || element );
-			this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
-		}
-
-		this._create();
-		this._trigger( "create", null, this._getCreateEventData() );
-		this._init();
-	},
-	_getCreateOptions: $.noop,
-	_getCreateEventData: $.noop,
-	_create: $.noop,
-	_init: $.noop,
-
-	destroy: function() {
-		this._destroy();
-		// we can probably remove the unbind calls in 2.0
-		// all event bindings should go through this._on()
-		this.element
-			.unbind( this.eventNamespace )
-			// 1.9 BC for #7810
-			// TODO remove dual storage
-			.removeData( this.widgetName )
-			.removeData( this.widgetFullName )
-			// support: jquery <1.6.3
-			// http://bugs.jquery.com/ticket/9413
-			.removeData( $.camelCase( this.widgetFullName ) );
-		this.widget()
-			.unbind( this.eventNamespace )
-			.removeAttr( "aria-disabled" )
-			.removeClass(
-				this.widgetFullName + "-disabled " +
-				"ui-state-disabled" );
-
-		// clean up events and states
-		this.bindings.unbind( this.eventNamespace );
-		this.hoverable.removeClass( "ui-state-hover" );
-		this.focusable.removeClass( "ui-state-focus" );
-	},
-	_destroy: $.noop,
-
-	widget: function() {
-		return this.element;
-	},
-
-	option: function( key, value ) {
-		var options = key,
-			parts,
-			curOption,
-			i;
-
-		if ( arguments.length === 0 ) {
-			// don't return a reference to the internal hash
-			return $.widget.extend( {}, this.options );
-		}
-
-		if ( typeof key === "string" ) {
-			// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
-			options = {};
-			parts = key.split( "." );
-			key = parts.shift();
-			if ( parts.length ) {
-				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
-				for ( i = 0; i < parts.length - 1; i++ ) {
-					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
-					curOption = curOption[ parts[ i ] ];
-				}
-				key = parts.pop();
-				if ( value === undefined ) {
-					return curOption[ key ] === undefined ? null : curOption[ key ];
-				}
-				curOption[ key ] = value;
-			} else {
-				if ( value === undefined ) {
-					return this.options[ key ] === undefined ? null : this.options[ key ];
-				}
-				options[ key ] = value;
-			}
-		}
-
-		this._setOptions( options );
-
-		return this;
-	},
-	_setOptions: function( options ) {
-		var key;
-
-		for ( key in options ) {
-			this._setOption( key, options[ key ] );
-		}
-
-		return this;
-	},
-	_setOption: function( key, value ) {
-		this.options[ key ] = value;
-
-		if ( key === "disabled" ) {
-			this.widget()
-				.toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
-				.attr( "aria-disabled", value );
-			this.hoverable.removeClass( "ui-state-hover" );
-			this.focusable.removeClass( "ui-state-focus" );
-		}
-
-		return this;
-	},
-
-	enable: function() {
-		return this._setOption( "disabled", false );
-	},
-	disable: function() {
-		return this._setOption( "disabled", true );
-	},
-
-	_on: function( suppressDisabledCheck, element, handlers ) {
-		var delegateElement,
-			instance = this;
-
-		// no suppressDisabledCheck flag, shuffle arguments
-		if ( typeof suppressDisabledCheck !== "boolean" ) {
-			handlers = element;
-			element = suppressDisabledCheck;
-			suppressDisabledCheck = false;
-		}
-
-		// no element argument, shuffle and use this.element
-		if ( !handlers ) {
-			handlers = element;
-			element = this.element;
-			delegateElement = this.widget();
-		} else {
-			// accept selectors, DOM elements
-			element = delegateElement = $( element );
-			this.bindings = this.bindings.add( element );
-		}
-
-		$.each( handlers, function( event, handler ) {
-			function handlerProxy() {
-				// allow widgets to customize the disabled handling
-				// - disabled as an array instead of boolean
-				// - disabled class as method for disabling individual parts
-				if ( !suppressDisabledCheck &&
-						( instance.options.disabled === true ||
-							$( this ).hasClass( "ui-state-disabled" ) ) ) {
-					return;
-				}
-				return ( typeof handler === "string" ? instance[ handler ] : handler )
-					.apply( instance, arguments );
-			}
-
-			// copy the guid so direct unbinding works
-			if ( typeof handler !== "string" ) {
-				handlerProxy.guid = handler.guid =
-					handler.guid || handlerProxy.guid || $.guid++;
-			}
-
-			var match = event.match( /^(\w+)\s*(.*)$/ ),
-				eventName = match[1] + instance.eventNamespace,
-				selector = match[2];
-			if ( selector ) {
-				delegateElement.delegate( selector, eventName, handlerProxy );
-			} else {
-				element.bind( eventName, handlerProxy );
-			}
-		});
-	},
-
-	_off: function( element, eventName ) {
-		eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
-		element.unbind( eventName ).undelegate( eventName );
-	},
-
-	_delay: function( handler, delay ) {
-		function handlerProxy() {
-			return ( typeof handler === "string" ? instance[ handler ] : handler )
-				.apply( instance, arguments );
-		}
-		var instance = this;
-		return setTimeout( handlerProxy, delay || 0 );
-	},
-
-	_hoverable: function( element ) {
-		this.hoverable = this.hoverable.add( element );
-		this._on( element, {
-			mouseenter: function( event ) {
-				$( event.currentTarget ).addClass( "ui-state-hover" );
-			},
-			mouseleave: function( event ) {
-				$( event.currentTarget ).removeClass( "ui-state-hover" );
-			}
-		});
-	},
-
-	_focusable: function( element ) {
-		this.focusable = this.focusable.add( element );
-		this._on( element, {
-			focusin: function( event ) {
-				$( event.currentTarget ).addClass( "ui-state-focus" );
-			},
-			focusout: function( event ) {
-				$( event.currentTarget ).removeClass( "ui-state-focus" );
-			}
-		});
-	},
-
-	_trigger: function( type, event, data ) {
-		var prop, orig,
-			callback = this.options[ type ];
-
-		data = data || {};
-		event = $.Event( event );
-		event.type = ( type === this.widgetEventPrefix ?
-			type :
-			this.widgetEventPrefix + type ).toLowerCase();
-		// the original event may come from any element
-		// so we need to reset the target on the new event
-		event.target = this.element[ 0 ];
-
-		// copy original event properties over to the new event
-		orig = event.originalEvent;
-		if ( orig ) {
-			for ( prop in orig ) {
-				if ( !( prop in event ) ) {
-					event[ prop ] = orig[ prop ];
-				}
-			}
-		}
-
-		this.element.trigger( event, data );
-		return !( $.isFunction( callback ) &&
-			callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
-			event.isDefaultPrevented() );
-	}
-};
-
-$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
-	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
-		if ( typeof options === "string" ) {
-			options = { effect: options };
-		}
-		var hasOptions,
-			effectName = !options ?
-				method :
-				options === true || typeof options === "number" ?
-					defaultEffect :
-					options.effect || defaultEffect;
-		options = options || {};
-		if ( typeof options === "number" ) {
-			options = { duration: options };
-		}
-		hasOptions = !$.isEmptyObject( options );
-		options.complete = callback;
-		if ( options.delay ) {
-			element.delay( options.delay );
-		}
-		if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
-			element[ method ]( options );
-		} else if ( effectName !== method && element[ effectName ] ) {
-			element[ effectName ]( options.duration, options.easing, callback );
-		} else {
-			element.queue(function( next ) {
-				$( this )[ method ]();
-				if ( callback ) {
-					callback.call( element[ 0 ] );
-				}
-				next();
-			});
-		}
-	};
-});
-
-}));
Index: admin/langs.php
===================================================================
--- admin/langs.php	(revision 1179)
+++ admin/langs.php	(revision 907)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/media.php
===================================================================
--- admin/media.php	(revision 1192)
+++ admin/media.php	(revision 1039)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -10,4 +10,45 @@
 #
 # -- END LICENSE BLOCK -----------------------------------------
+
+/* Upload backend
+-------------------------------------------------------- */
+if (!empty($_POST['swfupload']))
+{
+	header('content-type: text/plain');
+	try
+	{
+		if (empty($_POST['sess_id']) || empty($_POST['sess_uid'])) {
+			throw new Exception('No credentials.');
+		}
+		define('DC_AUTH_SESS_ID',$_POST['sess_id']);
+		define('DC_AUTH_SESS_UID',$_POST['sess_uid']);
+		
+		require dirname(__FILE__).'/../inc/admin/prepend.php';
+		
+		if (!$core->auth->check('media,media_admin',$core->blog->id)) {
+			throw new Exception('Permission denied.');
+		}
+		
+		$d = isset($_POST['d']) ? $_POST['d'] : null;
+		$core->media = new dcMedia($core);
+		$core->media->chdir($d);
+		$core->media->getDir();
+		$dir =& $core->media->dir;
+		
+		if (empty($_FILES['Filedata'])) {
+			throw new Exception('No file to upload.');
+		}
+		
+		files::uploadStatus($_FILES['Filedata']);
+		$core->media->uploadFile($_FILES['Filedata']['tmp_name'],$_FILES['Filedata']['name']);
+		
+		echo 'ok';
+	}
+	catch (Exception $e) {
+		echo __('Error:').' '.__($e->getMessage());
+	}
+	exit;
+}
+
 
 /* HTML page
@@ -61,5 +102,5 @@
 	__('By dates, in ascending order') => 'date-asc',
 	__('By dates, in descending order') => 'date-desc'
-	);
+);
 
 if (!empty($_GET['file_sort']) && in_array($_GET['file_sort'],$sort_combo)) {
@@ -132,47 +173,22 @@
 
 # Adding a file
-if ($dir && !empty($_FILES['upfile'])) {
-  // only one file per request : @see option singleFileUploads in admin/js/jsUpload/jquery.fileupload
-	$upfile = array('name' => $_FILES['upfile']['name'][0],
-		'type' => $_FILES['upfile']['type'][0],
-		'tmp_name' => $_FILES['upfile']['tmp_name'][0],
-		'error' => $_FILES['upfile']['error'][0],
-		'size' => $_FILES['upfile']['size'][0]
-		);
-
-	if (!empty($_SERVER['HTTP_X_REQUESTED_WITH'])) {
-		header('Content-type: application/json');
-		$message = array();
-
-		try {
-			files::uploadStatus($upfile);
-			$new_file_id = $core->media->uploadFile($upfile['tmp_name'], $upfile['name']);
-
-			$message['files'][] = array('name' => $upfile['name'],
-				'size' => $upfile['size'],
-				'html' => mediaItemLine($core->media->getFile($new_file_id), 1)
-				);
-		} catch (Exception $e) {
-			$message['files'][] = array('name' => $upfile['name'],
-				'size' => $upfile['size'],
-				'error' => $e->getMessage()
-				);
-		}
-		echo json_encode($message);
-		exit();
-	} else {
-		try {
-			files::uploadStatus($upfile);
-
-			$f_title = (isset($_POST['upfiletitle']) ? $_POST['upfiletitle'] : '');
-			$f_private = (isset($_POST['upfilepriv']) ? $_POST['upfilepriv'] : false);
-
-			$core->media->uploadFile($upfile['tmp_name'], $upfile['name'], $f_title, $f_private);
-			http::redirect($page_url.'&d='.rawurlencode($d).'&upok=1');
-		} catch (Exception $e) {
-			$core->error->add($e->getMessage());
-		}
-	}
-}
+if ($dir && !empty($_FILES['upfile']))
+{
+	try
+	{
+		files::uploadStatus($_FILES['upfile']);
+		
+		$f_title = (isset($_POST['upfiletitle']) ? $_POST['upfiletitle'] : '');
+		$f_private = (isset($_POST['upfilepriv']) ? $_POST['upfilepriv'] : false);
+		
+		$core->media->uploadFile($_FILES['upfile']['tmp_name'],$_FILES['upfile']['name'],$f_title,$f_private);
+		http::redirect($page_url.'&d='.rawurlencode($d).'&upok=1');
+	}
+	catch (Exception $e)
+	{
+		$core->error->add($e->getMessage());
+	}
+}
+
 
 # Removing item
@@ -200,4 +216,5 @@
 }
 
+
 # DISPLAY confirm page for rmdir & rmfile
 if ($dir && !empty($_GET['remove']) && empty($_GET['noconfirm']))
@@ -210,5 +227,5 @@
 	'<form action="'.html::escapeURL($page_url).'" method="post">'.
 	'<p>'.sprintf(__('Are you sure you want to remove %s?'),
-		html::escapeHTML($_GET['remove'])).'</p>'.
+	html::escapeHTML($_GET['remove'])).'</p>'.
 	'<p><input type="submit" value="'.__('Cancel').'" /> '.
 	' &nbsp; <input type="submit" name="rmyes" value="'.__('Yes').'" />'.
@@ -228,6 +245,11 @@
 
 call_user_func($open_f,__('Media manager'),
+	'<script type="text/javascript">'."\n".
+	"//<![CDATA["."\n".
+	dcPage::jsVar('dotclear.candyUpload_force_init',$user_ui_enhanceduploader)."\n".
+	"//]]>".
+	"</script>".
 	dcPage::jsLoad('js/_media.js').
-	($core_media_writable ? dcPage::jsUpload(array('d='.$d)) : '')
+	($core_media_writable ? dcPage::jsCandyUpload(array('d='.$d)) : '')
 	);
 
@@ -275,15 +297,14 @@
 if ($post_id) {
 	echo '<p><strong>'.sprintf(__('Choose a file to attach to entry %s by clicking on %s.'),
-		'<a href="'.$core->getPostAdminURL($post_type,$post_id).'">'.html::escapeHTML($post_title).'</a>',
-		'<img src="images/plus.png" alt="'.__('Attach this file to entry').'" />').'</strong></p>';
+	'<a href="'.$core->getPostAdminURL($post_type,$post_id).'">'.html::escapeHTML($post_title).'</a>',
+	'<img src="images/plus.png" alt="'.__('Attach this file to entry').'" />').'</strong></p>';
 }
 if ($popup) {
 	echo '<p><strong>'.sprintf(__('Choose a file to insert into entry by clicking on %s.'),
-		'<img src="images/plus.png" alt="'.__('Attach this file to entry').'" />').'</strong></p>';
+	'<img src="images/plus.png" alt="'.__('Attach this file to entry').'" />').'</strong></p>';
 }
 
 
 $items = array_values(array_merge($dir['dirs'],$dir['files']));
-echo '<div class="media-list">';
 if (count($items) == 0)
 {
@@ -305,4 +326,5 @@
 	'</form>'.
 	
+	'<div class="media-list">'.
 	'<p>'.__('Page(s)').' : '.$pager->getLinks().'</p>';
 	
@@ -313,12 +335,7 @@
 	
 	echo
-	'<p class="clear">'.__('Page(s)').' : '.$pager->getLinks().'</p>';
-}
-if (!isset($pager)) {
-	echo
-	'<p class="clear"></p>';
-}
-echo
-'</div>';
+	'<p class="clear">'.__('Page(s)').' : '.$pager->getLinks().'</p>'.
+	'</div>';
+}
 
 if ($core_media_writable)
@@ -326,48 +343,26 @@
 	echo '<div class="two-cols">';
 	
-	if ($user_ui_enhanceduploader) {
-		echo
-		'<div class="col enhanced_uploader">';
-	} else {
-		echo
-		'<div class="col">';
-	}
-
-	echo
+	echo
+	'<div class="col">'.
 	'<fieldset id="add-file-f"><legend>'.__('Add files').'</legend>'.
 	'<p>'.__('Please take care to publish media that you own and that are not protected by copyright.').'</p>'.
-	' <form id="fileupload" action="'.html::escapeURL($page_url).'" method="POST" enctype="multipart/form-data">'.
+	'<form id="media-upload" class="clear" action="'.html::escapeURL($page_url).'" method="post" enctype="multipart/form-data">'.
 	'<div>'.form::hidden(array('MAX_FILE_SIZE'),DC_MAX_UPLOAD_SIZE).
 	$core->formNonce().'</div>'.
-	'<div class="fileupload-ctrl"><div class="files"></div></div>';
-
-	echo
-	'<div class="fileupload-buttonbar">';
-
-	echo
-	'<p class="max-sier form-note info">&nbsp;'.__('Maximum file size allowed:').' '.files::size(DC_MAX_UPLOAD_SIZE).'</p>'.
-	'<label for="upfile">'.'<span class="add-label one-file">'.__('Choose file').'</span>'.'</label>'.
-	'<button class="button add">'.__('Choose files').'</button>'.
-	'<input type="file" id="upfile" name="upfile[]"'.($user_ui_enhanceduploader?' multiple="mutiple"':'').' data-url="'.html::escapeURL($page_url).'" />';
-
-	echo
-	'<p class="one-file"><label for="upfiletitle">'.__('Title:').form::field(array('upfiletitle','upfiletitle'),35,255).'</label></p>'.
-	'<p class="one-file"><label for="upfilepriv" class="classic">'.form::checkbox(array('upfilepriv','upfilepriv'),1).' '.
+	'<p><label for="upfile">'.__('Choose a file:').
+	' ('.sprintf(__('Maximum size %s'),files::size(DC_MAX_UPLOAD_SIZE)).')'.
+	'<input type="file" id="upfile" name="upfile" size="20" />'.
+	'</label></p>'.
+	'<p><label for="upfiletitle">'.__('Title:').form::field(array('upfiletitle','upfiletitle'),35,255).'</label></p>'.
+	'<p><label for="upfilepriv" class="classic">'.form::checkbox(array('upfilepriv','upfilepriv'),1).' '.
 	__('Private').'</label></p>';
-
 	if (!$user_ui_enhanceduploader) {
 		echo
-		'<p class="one-file form-help info">'.__('To send several files at the same time, you can activate the enhanced uploader in').
+		'<p class="form-help info">'.__('To send several files at the same time, you can activate the enhanced uploader in').
 		' <a href="preferences.php?tab=user-options">'.__('My preferences').'</a></p>';
 	}
-
-	echo
-	'<button class="button clean">'.__('Refresh').'</button>'.
-	'<input class="button cancel one-file" type="reset" value="'.__('Clear all').'"/>'.
-	'<input class="button start" type="submit" value="'.__('Upload').'"/>'.
-	'</div>';
-
-	echo
-	'<div>'.form::hidden(array('d'),$d).'</div>'.
+	echo
+	'<p><input type="submit" value="'.__('Send').'" />'.
+	form::hidden(array('d'),$d).'</p>'.
 	'</fieldset>'.
 	'</form>'.
Index: admin/media_item.php
===================================================================
--- admin/media_item.php	(revision 1179)
+++ admin/media_item.php	(revision 1103)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -145,5 +145,5 @@
 			$res[] = (string) $file->media_meta->{$v};
 		} elseif (preg_match('/^Date\((.+?)\)$/u',$v,$m)) {
-			if ($dto_first && ($file->media_meta->DateTimeOriginal != 0)) {
+			if ($dto_first && $file->media_meta->DateTimeOriginal) {
 				$res[] = dt::dt2str($m[1],(string) $file->media_meta->DateTimeOriginal);
 			} else {
Index: admin/plugin.php
===================================================================
--- admin/plugin.php	(revision 1179)
+++ admin/plugin.php	(revision 500)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/plugins.php
===================================================================
--- admin/plugins.php	(revision 1182)
+++ admin/plugins.php	(revision 1055)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -167,10 +167,10 @@
 
 			# --BEHAVIOR-- pluginBeforeAdd
-			$core->callBehavior('pluginsBeforeAdd', $plugin_id);
+			$core->callBehavior('pluginsBeforeAdd', $plugin);
 						
 			$ret_code = $core->plugins->installPackage($dest,$core->plugins);
 
 			# --BEHAVIOR-- pluginAfterAdd
-			$core->callBehavior('pluginsAfterAdd', $plugin_id);
+			$core->callBehavior('pluginsAfterAdd', $plugin);
 			
 			http::redirect('plugins.php?added='.$ret_code);
@@ -226,10 +226,6 @@
 'Here you can activate or deactivate installed plugins.').'</p>';
 
-echo (!$core->plugins->moduleExists('daInstaller') ?
-	sprintf('<p><strong>'.__('You can find additional plugins for your blog on %s.').'</strong></p>',
-		'<a href="http://plugins.dotaddict.org/dc2/">Dotaddict</a>') :
-	sprintf('<p><strong>'.__('You can find additional plugins for your blog on %s or using the %s.').'</strong></p>',
-		'<a href="http://plugins.dotaddict.org/dc2/">Dotaddict</a>',
-		'<a href="plugin.php?p=daInstaller">'.__('DotAddict.org Installer').'</a>'));
+echo '<p><strong>'.sprintf(__('You can find additional plugins for your blog on %s.'),
+'<a href="http://plugins.dotaddict.org/dc2/">Dotaddict</a>').'</strong> ';
 
 if ($is_writable) {
Index: admin/popup_link.php
===================================================================
--- admin/popup_link.php	(revision 1179)
+++ admin/popup_link.php	(revision 730)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/popup_posts.php
===================================================================
--- admin/popup_posts.php	(revision 1179)
+++ admin/popup_posts.php	(revision 996)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/post.php
===================================================================
--- admin/post.php	(revision 1215)
+++ admin/post.php	(revision 1068)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -419,10 +419,6 @@
 		http::browserUID(DC_MASTER_KEY.$core->auth->userID().$core->auth->getInfo('user_pwd')).
 		'/'.$post->post_url);
-		echo '<a id="post-preview" href="'.$preview_url.'" class="button" accesskey="p">'.__('Preview').' (p)'.'</a> ';
-	} else {
-		echo
-		'<a id="post-cancel" href="index.php" class="button" accesskey="c">'.__('Cancel').' (c)</a>';
-	}
-
+		echo '<a id="post-preview" href="'.$preview_url.'" class="button">'.__('Preview').'</a> ';
+	}
 	echo
 	($can_delete ? '<input type="submit" class="delete" value="'.__('Delete').'" name="delete" />' : '').
Index: admin/post_media.php
===================================================================
--- admin/post_media.php	(revision 1179)
+++ admin/post_media.php	(revision 557)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/posts.php
===================================================================
--- admin/posts.php	(revision 1179)
+++ admin/posts.php	(revision 1102)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/posts_actions.php
===================================================================
--- admin/posts_actions.php	(revision 1179)
+++ admin/posts_actions.php	(revision 1102)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/preferences.php
===================================================================
--- admin/preferences.php	(revision 1179)
+++ admin/preferences.php	(revision 907)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/search.php
===================================================================
--- admin/search.php	(revision 1179)
+++ admin/search.php	(revision 747)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/services.php
===================================================================
--- admin/services.php	(revision 1179)
+++ admin/services.php	(revision 323)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/style/candyUpload/style.css
===================================================================
--- admin/style/candyUpload/style.css	(revision 1065)
+++ admin/style/candyUpload/style.css	(revision 1065)
@@ -0,0 +1,113 @@
+
+.cu-ctrl {
+	background: #f5f5f5;
+	padding: .5em 0 0 0;
+	margin: 0 0 1em 0;
+	overflow: hidden;
+}
+.cu-msg {
+	font-weight: bold;
+}
+.cu-msg.cu-error {
+	color: #c00;
+}
+.cu-files {
+	padding: 0 0.5em;
+	margin: 10px 0;
+}
+.cu-file {
+	margin: 0 0 8px 0;
+	position: relative;
+}
+.cu-fileinfo {
+	margin-left: 16px;
+}
+.cu-fileinfo span.cu-filecancel {
+	display: block;
+	position: absolute;
+	top: 2px;
+	left: 0px !important;
+	left: -16px;
+}
+.cu-filecancel a {
+	display: block;
+	width: 12px;
+	height: 12px;
+	background: transparent url(cancel.png) no-repeat top left;
+	border: none;
+	text-indent: -5000px;
+	outline: none;
+}
+.cu-filemsg {
+	font-weight: bold;
+	color: green;
+}
+span.cu-filemsg.cu-error {
+	color: #c00;
+}
+.cu-progress {
+	margin-left: 16px;
+}
+.cu-progress div {
+	height: 10px;
+	width: 0;
+	font-size: 0.8em;
+	line-height: 1em;
+	height: 1em;
+	padding: .2em 0;
+	text-align: right;
+	background: green url(loader.png) repeat-x top left;
+	color: white;
+	font-weight: bold;
+	border-radius: 2px;
+}
+.cu-btn {
+	padding: 0 0.5em;
+	line-height: 1.2em;
+	height: 1.5em;
+	margin-top: 1em;
+	position: relative;
+}
+.cu-btn span {
+	display: block;
+	margin: 0 1em 0 0;
+	float: right;
+}
+.cu-btn span a {
+	display: block;
+	padding: .3em 1.5em;
+}
+span.cu-btn-browse {
+	float: none;
+	position: absolute;
+	left: 0;
+	margin: 0;
+}
+span.cu-btn-upload, span.cu-btn-clean {
+	margin-right: 0;
+}
+span.cu-btn-upload a.button {
+	color: #fff;
+	border: 1px solid #2373A8;
+	background: #2373A8;
+	background: -webkit-gradient(linear, left top, left bottom, from(#2C8FD1), to(#2373A8));
+	background: -moz-linear-gradient(top,  #2C8FD1,  #2373A8);
+}
+span.cu-btn-upload a.button:hover, 
+span.cu-btn-upload a.button:focus {
+	color: #fff;
+	border: 1px solid #2C8FD1;
+	background: #2C8FD1;
+	background: -webkit-gradient(linear, left top, left bottom, from(#2373A8), to(#2C8FD1));
+	background: -moz-linear-gradient(top,  #2373A8,  #2C8FD1);
+	filter:  progid:DXImageTransform.Microsoft.gradient(startColorstr='#2373A8', endColorstr='#2C8FD1');
+}
+.cu-maxsize.form-note {
+	clear: both;
+	margin: 1.5em 0 0;
+	font-style: italic;
+}
+.cu-disable {
+	margin: 1em 0;
+	padding: 0 0 0.5em 0.5em;
+}
Index: admin/style/default.css
===================================================================
--- admin/style/default.css	(revision 1179)
+++ admin/style/default.css	(revision 1065)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -194,5 +194,5 @@
 }
 #content {
-	margin: 1.5em 1.5em .5em 13em;
+	margin: 1.5em 1.5em 4em 13em;
 	padding: 1em;
 	background: #fff;
@@ -277,5 +277,5 @@
 	float: left;
 	margin-top: 1.2em;
-	margin-bottom: .5em;
+	margin-bottom: 3em;
 }
 #main-menu h3 {
@@ -335,6 +335,7 @@
 #footer {
 	clear: both;
-	padding: .75em .75em 0 0;
-	text-align: right;
+	padding: .75em 0;
+	background: #575859 url(dc_logo_small.png) no-repeat 8px bottom;
+	color: #fff;
 }
 #footer p {
@@ -345,4 +346,5 @@
 }
 #footer a {
+	color: #f5f5f5;
 }
 #footer p span.credit {
Index: dmin/style/jsUpload/style.css
===================================================================
--- admin/style/jsUpload/style.css	(revision 1209)
+++ 	(revision )
@@ -1,171 +1,0 @@
-.enhanced_uploader .button {
-	display: inline-block;
-	*display: inline;
-
-	border-radius: .2em;
-	background: #2373A8;
-	background: -webkit-gradient(linear, left top, left bottom, from(#2C8FD1), to(#2373A8));
-	background: -moz-linear-gradient(center top , #2C8FD1, #2373A8) repeat scroll 0 0 transparent;
-	outline: none;
-	border: 1px solid #2373A8;
-	text-decoration: none;
-	text-shadow: 0 1px 1px rgba(0,0,0,.3);
-	text-align: center;
-	cursor: pointer;
-	color: #fff;
-	font: 1em "DejaVu Sans","Lucida Grande","Lucida Sans Unicode",Arial,sans-serif;
-	margin-right: 4px;
-	margin-bottom: .5em;
-	padding: .1em .5em 0 .5em;
-	float: left;
-}
-
-.enhanced_uploader .button:hover {
-	background: #2373A8;
-	background: -webkit-gradient(linear, left top, left bottom, from(#2373A8), to(#2C8FD1));
-	background: -moz-linear-gradient(center top , #2373A8, #2C8FD1) repeat scroll 0 0 transparent;
-	border: 1px solid #2C8FD1;
-}
-
-.enhanced_uploader .add, .enhanced_uploader .clean, .enhanced_uploader .cancel, .enhanced_uploader .disabled {
-	text-shadow: none;
-	color: #000;
-	background: #F5F5F5;
-	background: -webkit-gradient(linear, left top, left bottom, from(#DFDFDF), to(#F5F5F5));
-	background: -moz-linear-gradient(center top , #F5F5F5, #DFDFDF) repeat scroll 0 0 transparent;
-	border: 1px solid #CCCCCC;
-}
-
-.enhanced_uploader .button.add:hover, .enhanced_uploader .button.clean:hover, .enhanced_uploader .button.cancel:hover, .enhanced_uploader .disabled:hover {
-	background: #DFDFDF;
-	background: -webkit-gradient(linear, left top, left bottom, from(#DFDFDF), to(#F5F5F5));
-	background: -moz-linear-gradient(center top , #DFDFDF, #F5F5F5) repeat scroll 0 0 transparent;
-	border: 1px solid #CCCCCC;
-}
-
-.enhanced_uploader .disabled, .enhanced_uploader .disabled:hover {
-	color: #666;
-	background: #DFDFDF;
-	border: 1px solid #CCCCCC;
-}
-
-.enhanced_uploader .fileupload-buttonbar {
-	margin-top: 2em;
-}
-
-.enhanced_uploader .upload-filecancel {
-	border: none;
-}
-
-.enhanced_uploader .add {
-	margin-right: 4em;
-}
-
-.enhanced_uploader .cancel, .enhanced_uploader .clean, .enhanced_uploader .start {
-	margin-left: .5em;
-}
-
-.enhanced_uploader #upfile {
-	visibility: hidden;
-	width: 0;
-	height: 0;
-	margin: 0;
-	opacity: 0;
-	filter: alpha(opacity=0);
-	cursor: pointer;
-}
-
-.button.clean, .button.cancel, .button.add, .enhanced_uploader .fileupload-buttonbar .button.start {
-	display: none;
-}
-
-.enhanced_uploader .button.add {
-	display: inline-block;
-}
-
-.enhanced_uploader .max-size {
-	display: block;
-}
-
-.enhanced_uploader .one-file {
-	display: none;
-}
-
-label span.one-file {
-	display: inline;
-}
-
-.enhanced_uploader p.clear {
-	margin-top: 3em;
-	margin-bottom: 0;
-}
-
-#add-file-f p.clear {
-	margin-top: 1em;
-	margin-bottom: 0;
-}
-
-/* files */
-.upload-msg {
-	font-weight: bold;
-}
-
-.upload-msg.upload-error {
-	color: #c00;
-}
-
-.upload-files {
-	padding: 0 0.5em;
-	margin: 10px 0;
-}
-
-.upload-file {
-	margin: 0 0 8px 0;
-	position: relative;
-}
-
-.upload-fileinfo {
-	margin-left: 16px;
-	margin-bottom: .4em;
-}
-
-.upload-fileinfo .upload-filecancel {
-	display: block;
-	margin-top: 3px;
-	width: 20px;
-	height: 20px;
-	background: transparent url("cancel.png") no-repeat left top;
-	text-indent: -1000px;
-	cursor: pointer;
-	float: left;
-}
-
-.upload-filemsg {
-	font-weight: bold;
-	color: green;
-}
-
-.upload-filemsg.upload-error {
-	color: #c00;
-}
-
-.upload-progress {
-	padding: 0 1em;
-}
-
-.upload-progress div {
-	width: 0;
-	height: 1em;
-	padding: .2em 0;
-	font-size: 0.8em;
-	font-weight: bold;
-	line-height: 1em;
-	text-align: right;
-	background: green url("loader.png") repeat-x left top;
-	color: white;
-	border-radius: 2px;
-}
-
-div.template-upload {
-	clear: both;
-}
Index: admin/trackbacks.php
===================================================================
--- admin/trackbacks.php	(revision 1179)
+++ admin/trackbacks.php	(revision 907)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/update.php
===================================================================
--- admin/update.php	(revision 1179)
+++ admin/update.php	(revision 941)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/user.php
===================================================================
--- admin/user.php	(revision 1179)
+++ admin/user.php	(revision 907)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/users.php
===================================================================
--- admin/users.php	(revision 1179)
+++ admin/users.php	(revision 907)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/users_actions.php
===================================================================
--- admin/users_actions.php	(revision 1179)
+++ admin/users_actions.php	(revision 860)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: admin/xmlrpc.php
===================================================================
--- admin/xmlrpc.php	(revision 1179)
+++ admin/xmlrpc.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: build-tools/make-l10n.php
===================================================================
--- build-tools/make-l10n.php	(revision 1179)
+++ build-tools/make-l10n.php	(revision 270)
@@ -6,5 +6,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: build-tools/min-js.php
===================================================================
--- build-tools/min-js.php	(revision 1179)
+++ build-tools/min-js.php	(revision 270)
@@ -5,5 +5,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/admin/class.dc.menu.php
===================================================================
--- inc/admin/class.dc.menu.php	(revision 1179)
+++ inc/admin/class.dc.menu.php	(revision 691)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/admin/lib.dc.page.php
===================================================================
--- inc/admin/lib.dc.page.php	(revision 1188)
+++ inc/admin/lib.dc.page.php	(revision 1049)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -22,10 +22,10 @@
 	{
 		global $core;
-
+		
 		if ($core->blog && $core->auth->check($permissions,$core->blog->id))
 		{
 			return;
 		}
-
+		
 		if (session_id()) {
 			$core->session->destroy();
@@ -33,10 +33,10 @@
 		http::redirect(DC_AUTH_PAGE);
 	}
-
+	
 	# Check super admin
 	public static function checkSuper()
 	{
 		global $core;
-
+		
 		if (!$core->auth->isSuperAdmin())
 		{
@@ -47,10 +47,10 @@
 		}
 	}
-
+	
 	# Top of admin page
 	public static function open($title='', $head='')
 	{
 		global $core;
-
+		
 		# List of user's blogs
 		if ($core->auth->blog_count == 1 || $core->auth->blog_count > 20)
@@ -59,5 +59,5 @@
 			'<p>'.__('Blog:').' <strong title="'.html::escapeHTML($core->blog->url).'">'.
 			html::escapeHTML($core->blog->name).'</strong>';
-
+			
 			if ($core->auth->blog_count > 20) {
 				$blog_box .= ' - <a href="blogs.php">'.__('Change blog').'</a>';
@@ -80,7 +80,7 @@
 			'<noscript><p><input type="submit" value="'.__('ok').'" /></p></noscript>';
 		}
-
+		
 		$safe_mode = isset($_SESSION['sess_safe_mode']) && $_SESSION['sess_safe_mode'];
-
+		
 		# Display
 		header('Content-Type: text/html; charset=UTF-8');
@@ -94,13 +94,13 @@
 		'  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />'."\n".
 		'  <title>'.$title.' - '.html::escapeHTML($core->blog->name).' - '.html::escapeHTML(DC_VENDOR_NAME).' - '.DC_VERSION.'</title>'."\n".
-
+		
 		'  <meta name="ROBOTS" content="NOARCHIVE,NOINDEX,NOFOLLOW" />'."\n".
 		'  <meta name="GOOGLEBOT" content="NOSNIPPET" />'."\n".
-
+		
 		self::jsLoadIE7().
-		'  	<link rel="stylesheet" href="style/default.css" type="text/css" media="screen" />'."\n";
+		'  	<link rel="stylesheet" href="style/default.css" type="text/css" media="screen" />'."\n"; 
 		if (l10n::getTextDirection($GLOBALS['_lang']) == 'rtl') {
 			echo
-			'  	<link rel="stylesheet" href="style/default-rtl.css" type="text/css" media="screen" />'."\n";
+		'  	<link rel="stylesheet" href="style/default-rtl.css" type="text/css" media="screen" />'."\n"; 
 		}
 
@@ -110,12 +110,12 @@
 			echo '<link rel="icon" type="image/png" href="images/favicon.png" />';
 		}
-
+		
 		echo
 		self::jsCommon().
 		$head;
-
+		
 		# --BEHAVIOR-- adminPageHTMLHead
 		$core->callBehavior('adminPageHTMLHead');
-
+		
 		echo
 		"</head>\n".
@@ -123,9 +123,9 @@
 		($safe_mode ? ' safe-mode' : '').
 		'">'."\n".
-
+		
 		'<div id="header">'.
 		'<ul id="prelude"><li><a href="#content">'.__('Go to the content').'</a></li><li><a href="#main-menu">'.__('Go to the menu').'</a></li></ul>'."\n".
-		'<div id="top"><h1><a href="index.php">'.DC_VENDOR_NAME.'</a></h1></div>'."\n";
-
+		'<div id="top"><h1><a href="index.php">'.DC_VENDOR_NAME.'</a></h1></div>'."\n";	
+		
 		echo
 		'<div id="info-boxes">'.
@@ -143,10 +143,10 @@
 		'</div>'.
 		'</div>';
-
+		
 		echo
 		'<div id="wrapper">'."\n".
 		'<div id="main">'."\n".
 		'<div id="content">'."\n";
-
+		
 		# Safe mode
 		if ($safe_mode)
@@ -157,5 +157,5 @@
 			'</div>';
 		}
-
+		
 		if ($core->error->flag()) {
 			echo
@@ -165,5 +165,5 @@
 		}
 	}
-
+	
 	public static function close()
 	{
@@ -171,41 +171,37 @@
 
 		$menu =& $GLOBALS['_menu'];
-
+		
 		echo
 		"</div>\n".		// End of #content
 		"</div>\n".		// End of #main
-
+		
 		'<div id="main-menu">'."\n";
-
+		
 		foreach ($menu as $k => $v) {
 			echo $menu[$k]->draw();
 		}
-
-		$text = sprintf(__('Thank you for using %s.'),'Dotclear '.DC_VERSION);
+		
+		$text = sprintf(__('Thank you for using %s.'),'<a href="http://dotclear.org/">Dotclear '.DC_VERSION.'</a>');
 
 		# --BEHAVIOR-- adminPageFooter
 		$textAlt = $core->callBehavior('adminPageFooter',$core,$text);
-		if ($textAlt != '') {
-			$text = $textAlt;
-		}
-		$text = html::escapeHTML($text);
 
 		echo
 		'</div>'."\n".		// End of #main-menu
-		'<div id="footer"><a href="http://dotclear.org/" title="'.$text.'"><img src="style/dc_logo_footer.png" alt="'.$text.'" /></a></div>'."\n".
+		'<div id="footer"><p>'.($textAlt != '' ? $textAlt : $text).'</p></div>'."\n".
 		"</div>\n";		// End of #wrapper
-
+		
 		if (defined('DC_DEV') && DC_DEV === true) {
 			echo self::debugInfo();
 		}
-
+		
 		echo
 		'</body></html>';
 	}
-
+	
 	public static function openPopup($title='', $head='')
 	{
 		global $core;
-
+		
 		# Display
 		header('Content-Type: text/html; charset=UTF-8');
@@ -219,33 +215,33 @@
 		'  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />'."\n".
 		'  <title>'.$title.' - '.html::escapeHTML($core->blog->name).' - '.html::escapeHTML(DC_VENDOR_NAME).' - '.DC_VERSION.'</title>'."\n".
-
+		
 		'  <meta name="ROBOTS" content="NOARCHIVE,NOINDEX,NOFOLLOW" />'."\n".
 		'  <meta name="GOOGLEBOT" content="NOSNIPPET" />'."\n".
-
+		
 		self::jsLoadIE7().
-		'  	<link rel="stylesheet" href="style/default.css" type="text/css" media="screen" />'."\n";
+		'  	<link rel="stylesheet" href="style/default.css" type="text/css" media="screen" />'."\n"; 
 		if (l10n::getTextDirection($GLOBALS['_lang']) == 'rtl') {
 			echo
-			'  	<link rel="stylesheet" href="style/default-rtl.css" type="text/css" media="screen" />'."\n";
-		}
-
+			'  	<link rel="stylesheet" href="style/default-rtl.css" type="text/css" media="screen" />'."\n"; 
+		}
+		
 		echo
 		self::jsCommon().
 		$head;
-
+		
 		# --BEHAVIOR-- adminPageHTMLHead
 		$core->callBehavior('adminPageHTMLHead');
-
+		
 		echo
 		"</head>\n".
 		'<body id="dotclear-admin" class="popup">'."\n".
-
+		
 		'<div id="top"><h1>'.DC_VENDOR_NAME.'</h1></div>'."\n";
-
+		
 		echo
 		'<div id="wrapper">'."\n".
 		'<div id="main">'."\n".
 		'<div id="content">'."\n";
-
+		
 		if ($core->error->flag()) {
 			echo
@@ -255,5 +251,5 @@
 		}
 	}
-
+	
 	public static function closePopup()
 	{
@@ -269,10 +265,10 @@
 	{
 		global $core;
-
+		
 		$res = '';
 		if ($msg != '') {
 			$res = ($div ? '<div class="message">' : '').'<p'.($div ? '' : ' class="message"').'>'.
-			($timestamp ? dt::str(__('%H:%M:%S:'),null,$core->auth->getInfo('user_tz')).' ' : '').$msg.
-			'</p>'.($div ? '</div>' : '');
+				($timestamp ? dt::str(__('%H:%M:%S:'),null,$core->auth->getInfo('user_tz')).' ' : '').$msg.
+				'</p>'.($div ? '</div>' : '');
 			if ($echo) {
 				echo $res;
@@ -281,17 +277,17 @@
 		return $res;
 	}
-
+	
 	private static function debugInfo()
 	{
 		$global_vars = implode(', ',array_keys($GLOBALS));
-
+		
 		$res =
 		'<div id="debug"><div>'.
 		'<p>memory usage: '.memory_get_usage().' ('.files::size(memory_get_usage()).')</p>';
-
+		
 		if (function_exists('xdebug_get_profiler_filename'))
 		{
 			$res .= '<p>Elapsed time: '.xdebug_time_index().' seconds</p>';
-
+			
 			$prof_file = xdebug_get_profiler_filename();
 			if ($prof_file) {
@@ -303,5 +299,5 @@
 				$res .= '<p><a href="'.html::escapeURL($prof_url).'">Trigger profiler</a></p>';
 			}
-
+			
 			/* xdebug configuration:
 			zend_extension = /.../xdebug.so
@@ -317,17 +313,17 @@
 			*/
 		}
-
+		
 		$res .=
 		'<p>Global vars: '.$global_vars.'</p>'.
 		'</div></div>';
-
+		
 		return $res;
 	}
-
+	
 	public static function help($page,$index='')
 	{
 		# Deprecated but we keep this for plugins.
 	}
-
+	
 	public static function helpBlock()
 	{
@@ -336,10 +332,10 @@
 			return;
 		};
-
+		
 		global $__resources;
 		if (empty($__resources['help'])) {
 			return;
 		}
-
+		
 		$content = '';
 		foreach ($args as $v)
@@ -349,5 +345,5 @@
 				continue;
 			}
-
+			
 			if (!isset($__resources['help'][$v])) {
 				continue;
@@ -357,5 +353,5 @@
 				continue;
 			}
-
+			
 			$fc = file_get_contents($f);
 			if (preg_match('|<body[^>]*?>(.*?)</body>|ms',$fc,$matches)) {
@@ -365,9 +361,9 @@
 			}
 		}
-
+		
 		if (trim($content) == '') {
 			return;
 		}
-
+		
 		echo
 		'<div id="help"><hr /><div class="help-content clear"><h2>'.__('Help').'</h2>'.
@@ -375,5 +371,5 @@
 		'</div></div>';
 	}
-
+	
 	public static function jsLoad($src)
 	{
@@ -384,10 +380,10 @@
 		}
 	}
-
+	
 	public static function jsVar($n,$v)
 	{
 		return $n." = '".html::escapeJS($v)."';\n";
 	}
-
+	
 	public static function jsCommon()
 	{
@@ -396,11 +392,12 @@
 		self::jsLoad('js/jquery/jquery.biscuit.js').
 		self::jsLoad('js/jquery/jquery.bgFade.js').
+		self::jsLoad('js/jquery/jquery.constantfooter.js').
 		self::jsLoad('js/common.js').
 		self::jsLoad('js/prelude.js').
-
+		
 		'<script type="text/javascript">'."\n".
 		"//<![CDATA[\n".
 		self::jsVar('dotclear.nonce',$GLOBALS['core']->getNonce()).
-
+		
 		self::jsVar('dotclear.img_plus_src','images/expand.png').
 		self::jsVar('dotclear.img_plus_alt',__('uncover')).
@@ -409,5 +406,5 @@
 		self::jsVar('dotclear.img_menu_on','images/menu_on.png').
 		self::jsVar('dotclear.img_menu_off','images/menu_off.png').
-
+		
 		self::jsVar('dotclear.msg.help',
 			__('help')).
@@ -481,5 +478,5 @@
 		"</script>\n";
 	}
-
+	
 	public static function jsLoadIE7()
 	{
@@ -490,5 +487,5 @@
 		'<![endif]-->'."\n";
 	}
-
+	
 	public static function jsConfirmClose()
 	{
@@ -502,5 +499,5 @@
 			$args = '';
 		}
-
+		
 		return
 		self::jsLoad('js/confirm-close.js').
@@ -512,5 +509,5 @@
 		"</script>\n";
 	}
-
+	
 	public static function jsPageTabs($default=null)
 	{
@@ -518,5 +515,5 @@
 			$default = "'".html::escapeJS($default)."'";
 		}
-
+		
 		return
 		self::jsLoad('js/jquery/jquery.pageTabs.js').
@@ -524,263 +521,214 @@
 		"//<![CDATA[\n".
 		"\$(function() {\n".
-			"	\$.pageTabs(".$default.");\n".
-			"});\n".
-"\n//]]>\n".
-"</script>\n";
-}
-
-public static function jsModal()
-{
-	return
-	'<link rel="stylesheet" type="text/css" href="style/modal/modal.css" />'."\n".
-	self::jsLoad('js/jquery/jquery.modal.js').
-	'<script type="text/javascript">'."\n".
-	"//<![CDATA[\n".
-	self::jsVar('$.modal.prototype.params.loader_img','style/modal/loader.gif').
-	self::jsVar('$.modal.prototype.params.close_img','style/modal/close.png').
-	"\n//]]>\n".
-	"</script>\n";
-}
-
-public static function jsColorPicker()
-{
-	return
-	'<link rel="stylesheet" type="text/css" href="style/farbtastic/farbtastic.css" />'."\n".
-	self::jsLoad('js/jquery/jquery.farbtastic.js').
-	self::jsLoad('js/color-picker.js');
-}
-
-public static function jsDatePicker()
-{
-	return
-	'<link rel="stylesheet" type="text/css" href="style/date-picker.css" />'."\n".
-	self::jsLoad('js/date-picker.js').
-	'<script type="text/javascript">'."\n".
-	"//<![CDATA[\n".
-
-	"datePicker.prototype.months[0] = '".html::escapeJS(__('January'))."'; ".
-	"datePicker.prototype.months[1] = '".html::escapeJS(__('February'))."'; ".
-	"datePicker.prototype.months[2] = '".html::escapeJS(__('March'))."'; ".
-	"datePicker.prototype.months[3] = '".html::escapeJS(__('April'))."'; ".
-	"datePicker.prototype.months[4] = '".html::escapeJS(__('May'))."'; ".
-	"datePicker.prototype.months[5] = '".html::escapeJS(__('June'))."'; ".
-	"datePicker.prototype.months[6] = '".html::escapeJS(__('July'))."'; ".
-	"datePicker.prototype.months[7] = '".html::escapeJS(__('August'))."'; ".
-	"datePicker.prototype.months[8] = '".html::escapeJS(__('September'))."'; ".
-	"datePicker.prototype.months[9] = '".html::escapeJS(__('October'))."'; ".
-	"datePicker.prototype.months[10] = '".html::escapeJS(__('November'))."'; ".
-	"datePicker.prototype.months[11] = '".html::escapeJS(__('December'))."'; ".
-
-	"datePicker.prototype.days[0] = '".html::escapeJS(__('Monday'))."'; ".
-	"datePicker.prototype.days[1] = '".html::escapeJS(__('Tuesday'))."'; ".
-	"datePicker.prototype.days[2] = '".html::escapeJS(__('Wednesday'))."'; ".
-	"datePicker.prototype.days[3] = '".html::escapeJS(__('Thursday'))."'; ".
-	"datePicker.prototype.days[4] = '".html::escapeJS(__('Friday'))."'; ".
-	"datePicker.prototype.days[5] = '".html::escapeJS(__('Saturday'))."'; ".
-	"datePicker.prototype.days[6] = '".html::escapeJS(__('Sunday'))."'; ".
-
-	"datePicker.prototype.img_src = 'images/date-picker.png'; ".
-
-	"datePicker.prototype.close_msg = '".html::escapeJS(__('close'))."'; ".
-	"datePicker.prototype.now_msg = '".html::escapeJS(__('now'))."'; ".
-
-	"\n//]]>\n".
-	"</script>\n";
-}
-
-public static function jsToolBar()
-{
-	$res =
-	'<link rel="stylesheet" type="text/css" href="style/jsToolBar/jsToolBar.css" />'.
-	'<script type="text/javascript" src="js/jsToolBar/jsToolBar.js"></script>';
-
-	if (isset($GLOBALS['core']->auth) && $GLOBALS['core']->auth->getOption('enable_wysiwyg')) {
-		$res .= '<script type="text/javascript" src="js/jsToolBar/jsToolBar.wysiwyg.js"></script>';
-	}
-
-	$res .=
-	'<script type="text/javascript" src="js/jsToolBar/jsToolBar.dotclear.js"></script>'.
-	'<script type="text/javascript">'."\n".
-	"//<![CDATA[\n".
-	"jsToolBar.prototype.dialog_url = 'popup.php'; ".
-	"jsToolBar.prototype.iframe_css = '".
-	'body{'.
-	'font: 12px "DejaVu Sans","Lucida Grande","Lucida Sans Unicode",Arial,sans-serif;'.
-	'color : #000;'.
-	'background: #f9f9f9;'.
-	'margin: 0;'.
-	'padding : 2px;'.
-	'border: none;'.
-	(l10n::getTextDirection($GLOBALS['_lang']) == 'rtl' ? 'direction:rtl;' : '').
-	'}'.
-	'pre, code, kbd, samp {'.
-	'font-family:"Courier New",Courier,monospace;'.
-	'font-size : 1.1em;'.
-	'}'.
-	'code {'.
-	'color : #666;'.
-	'font-weight : bold;'.
-	'}'.
-	'body > p:first-child {'.
-	'margin-top: 0;'.
-	'}'.
-	"'; ".
-	"jsToolBar.prototype.base_url = '".html::escapeJS($GLOBALS['core']->blog->host)."'; ".
-	"jsToolBar.prototype.switcher_visual_title = '".html::escapeJS(__('visual'))."'; ".
-	"jsToolBar.prototype.switcher_source_title = '".html::escapeJS(__('source'))."'; ".
-	"jsToolBar.prototype.legend_msg = '".
-	html::escapeJS(__('You can use the following shortcuts to format your text.'))."'; ".
-	"jsToolBar.prototype.elements.blocks.options.none = '".html::escapeJS(__('-- none --'))."'; ".
-	"jsToolBar.prototype.elements.blocks.options.nonebis = '".html::escapeJS(__('-- block format --'))."'; ".
-	"jsToolBar.prototype.elements.blocks.options.p = '".html::escapeJS(__('Paragraph'))."'; ".
-	"jsToolBar.prototype.elements.blocks.options.h1 = '".html::escapeJS(__('Level 1 header'))."'; ".
-	"jsToolBar.prototype.elements.blocks.options.h2 = '".html::escapeJS(__('Level 2 header'))."'; ".
-	"jsToolBar.prototype.elements.blocks.options.h3 = '".html::escapeJS(__('Level 3 header'))."'; ".
-	"jsToolBar.prototype.elements.blocks.options.h4 = '".html::escapeJS(__('Level 4 header'))."'; ".
-	"jsToolBar.prototype.elements.blocks.options.h5 = '".html::escapeJS(__('Level 5 header'))."'; ".
-	"jsToolBar.prototype.elements.blocks.options.h6 = '".html::escapeJS(__('Level 6 header'))."'; ".
-	"jsToolBar.prototype.elements.strong.title = '".html::escapeJS(__('Strong emphasis'))."'; ".
-	"jsToolBar.prototype.elements.em.title = '".html::escapeJS(__('Emphasis'))."'; ".
-	"jsToolBar.prototype.elements.ins.title = '".html::escapeJS(__('Inserted'))."'; ".
-	"jsToolBar.prototype.elements.del.title = '".html::escapeJS(__('Deleted'))."'; ".
-	"jsToolBar.prototype.elements.quote.title = '".html::escapeJS(__('Inline quote'))."'; ".
-	"jsToolBar.prototype.elements.code.title = '".html::escapeJS(__('Code'))."'; ".
-	"jsToolBar.prototype.elements.br.title = '".html::escapeJS(__('Line break'))."'; ".
-	"jsToolBar.prototype.elements.blockquote.title = '".html::escapeJS(__('Blockquote'))."'; ".
-	"jsToolBar.prototype.elements.pre.title = '".html::escapeJS(__('Preformated text'))."'; ".
-	"jsToolBar.prototype.elements.ul.title = '".html::escapeJS(__('Unordered list'))."'; ".
-	"jsToolBar.prototype.elements.ol.title = '".html::escapeJS(__('Ordered list'))."'; ".
-
-	"jsToolBar.prototype.elements.link.title = '".html::escapeJS(__('Link'))."'; ".
-	"jsToolBar.prototype.elements.link.href_prompt = '".html::escapeJS(__('URL?'))."'; ".
-	"jsToolBar.prototype.elements.link.hreflang_prompt = '".html::escapeJS(__('Language?'))."'; ".
-
-	"jsToolBar.prototype.elements.img.title = '".html::escapeJS(__('External image'))."'; ".
-	"jsToolBar.prototype.elements.img.src_prompt = '".html::escapeJS(__('URL?'))."'; ".
-
-	"jsToolBar.prototype.elements.img_select.title = '".html::escapeJS(__('Media chooser'))."'; ".
-	"jsToolBar.prototype.elements.post_link.title = '".html::escapeJS(__('Link to an entry'))."'; ";
-
-	if (!$GLOBALS['core']->auth->check('media,media_admin',$GLOBALS['core']->blog->id)) {
-		$res .= "jsToolBar.prototype.elements.img_select.disabled = true;\n";
-	}
-
-	$res .=
-	"\n//]]>\n".
-	"</script>\n";
-
-	return $res;
-}
-
-public static function jsUpload($params=array(),$base_url=null)
-{
-	if (!$base_url) {
-		$base_url = path::clean(dirname(preg_replace('/(\?.*$)?/','',$_SERVER['REQUEST_URI']))).'/';
-	}
-
-	$params = array_merge($params,array(
-		'sess_id='.session_id(),
-		'sess_uid='.$_SESSION['sess_browser_uid'],
-		'xd_check='.$GLOBALS['core']->getNonce()
+		"	\$.pageTabs(".$default.");\n".
+		"});\n".
+		"\n//]]>\n".
+		"</script>\n";
+	}
+	
+	public static function jsModal()
+	{
+		return
+		'<link rel="stylesheet" type="text/css" href="style/modal/modal.css" />'."\n".
+		self::jsLoad('js/jquery/jquery.modal.js').
+		'<script type="text/javascript">'."\n".
+		"//<![CDATA[\n".
+		self::jsVar('$.modal.prototype.params.loader_img','style/modal/loader.gif').
+		self::jsVar('$.modal.prototype.params.close_img','style/modal/close.png').
+		"\n//]]>\n".
+		"</script>\n";
+	}
+	
+	public static function jsColorPicker()
+	{
+		return
+		'<link rel="stylesheet" type="text/css" href="style/farbtastic/farbtastic.css" />'."\n".
+		self::jsLoad('js/jquery/jquery.farbtastic.js').
+		self::jsLoad('js/color-picker.js');
+	}
+	
+	public static function jsDatePicker()
+	{
+		return
+		'<link rel="stylesheet" type="text/css" href="style/date-picker.css" />'."\n".
+		self::jsLoad('js/date-picker.js').
+		'<script type="text/javascript">'."\n".
+		"//<![CDATA[\n".
+		
+		"datePicker.prototype.months[0] = '".html::escapeJS(__('January'))."'; ".
+		"datePicker.prototype.months[1] = '".html::escapeJS(__('February'))."'; ".
+		"datePicker.prototype.months[2] = '".html::escapeJS(__('March'))."'; ".
+		"datePicker.prototype.months[3] = '".html::escapeJS(__('April'))."'; ".
+		"datePicker.prototype.months[4] = '".html::escapeJS(__('May'))."'; ".
+		"datePicker.prototype.months[5] = '".html::escapeJS(__('June'))."'; ".
+		"datePicker.prototype.months[6] = '".html::escapeJS(__('July'))."'; ".
+		"datePicker.prototype.months[7] = '".html::escapeJS(__('August'))."'; ".
+		"datePicker.prototype.months[8] = '".html::escapeJS(__('September'))."'; ".
+		"datePicker.prototype.months[9] = '".html::escapeJS(__('October'))."'; ".
+		"datePicker.prototype.months[10] = '".html::escapeJS(__('November'))."'; ".
+		"datePicker.prototype.months[11] = '".html::escapeJS(__('December'))."'; ".
+		
+		"datePicker.prototype.days[0] = '".html::escapeJS(__('Monday'))."'; ".
+		"datePicker.prototype.days[1] = '".html::escapeJS(__('Tuesday'))."'; ".
+		"datePicker.prototype.days[2] = '".html::escapeJS(__('Wednesday'))."'; ".
+		"datePicker.prototype.days[3] = '".html::escapeJS(__('Thursday'))."'; ".
+		"datePicker.prototype.days[4] = '".html::escapeJS(__('Friday'))."'; ".
+		"datePicker.prototype.days[5] = '".html::escapeJS(__('Saturday'))."'; ".
+		"datePicker.prototype.days[6] = '".html::escapeJS(__('Sunday'))."'; ".
+		
+		"datePicker.prototype.img_src = 'images/date-picker.png'; ".
+		
+		"datePicker.prototype.close_msg = '".html::escapeJS(__('close'))."'; ".
+		"datePicker.prototype.now_msg = '".html::escapeJS(__('now'))."'; ".
+		
+		"\n//]]>\n".
+		"</script>\n";
+	}
+	
+	public static function jsToolBar()
+	{
+		$res =
+		'<link rel="stylesheet" type="text/css" href="style/jsToolBar/jsToolBar.css" />'.
+		'<script type="text/javascript" src="js/jsToolBar/jsToolBar.js"></script>';
+		
+		if (isset($GLOBALS['core']->auth) && $GLOBALS['core']->auth->getOption('enable_wysiwyg')) {
+			$res .= '<script type="text/javascript" src="js/jsToolBar/jsToolBar.wysiwyg.js"></script>';
+		}
+		
+		$res .=
+		'<script type="text/javascript" src="js/jsToolBar/jsToolBar.dotclear.js"></script>'.
+		'<script type="text/javascript">'."\n".
+		"//<![CDATA[\n".
+		"jsToolBar.prototype.dialog_url = 'popup.php'; ".
+		"jsToolBar.prototype.iframe_css = '".
+			'body{'.
+				'font: 12px "DejaVu Sans","Lucida Grande","Lucida Sans Unicode",Arial,sans-serif;'.
+				'color : #000;'.
+				'background: #f9f9f9;'.
+				'margin: 0;'.
+				'padding : 2px;'.
+				'border: none;'.
+				(l10n::getTextDirection($GLOBALS['_lang']) == 'rtl' ? 'direction:rtl;' : '').
+			'}'.
+			'pre, code, kbd, samp {'.
+				'font-family:"Courier New",Courier,monospace;'.
+				'font-size : 1.1em;'.
+			'}'.
+			'code {'.
+				'color : #666;'.
+				'font-weight : bold;'.
+			'}'.
+			'body > p:first-child {'.
+				'margin-top: 0;'.
+			'}'.
+		"'; ".
+		"jsToolBar.prototype.base_url = '".html::escapeJS($GLOBALS['core']->blog->host)."'; ".
+		"jsToolBar.prototype.switcher_visual_title = '".html::escapeJS(__('visual'))."'; ".
+		"jsToolBar.prototype.switcher_source_title = '".html::escapeJS(__('source'))."'; ".
+		"jsToolBar.prototype.legend_msg = '".
+		html::escapeJS(__('You can use the following shortcuts to format your text.'))."'; ".
+		"jsToolBar.prototype.elements.blocks.options.none = '".html::escapeJS(__('-- none --'))."'; ".
+		"jsToolBar.prototype.elements.blocks.options.nonebis = '".html::escapeJS(__('-- block format --'))."'; ".
+		"jsToolBar.prototype.elements.blocks.options.p = '".html::escapeJS(__('Paragraph'))."'; ".
+		"jsToolBar.prototype.elements.blocks.options.h1 = '".html::escapeJS(__('Level 1 header'))."'; ".
+		"jsToolBar.prototype.elements.blocks.options.h2 = '".html::escapeJS(__('Level 2 header'))."'; ".
+		"jsToolBar.prototype.elements.blocks.options.h3 = '".html::escapeJS(__('Level 3 header'))."'; ".
+		"jsToolBar.prototype.elements.blocks.options.h4 = '".html::escapeJS(__('Level 4 header'))."'; ".
+		"jsToolBar.prototype.elements.blocks.options.h5 = '".html::escapeJS(__('Level 5 header'))."'; ".
+		"jsToolBar.prototype.elements.blocks.options.h6 = '".html::escapeJS(__('Level 6 header'))."'; ".
+		"jsToolBar.prototype.elements.strong.title = '".html::escapeJS(__('Strong emphasis'))."'; ".
+		"jsToolBar.prototype.elements.em.title = '".html::escapeJS(__('Emphasis'))."'; ".
+		"jsToolBar.prototype.elements.ins.title = '".html::escapeJS(__('Inserted'))."'; ".
+		"jsToolBar.prototype.elements.del.title = '".html::escapeJS(__('Deleted'))."'; ".
+		"jsToolBar.prototype.elements.quote.title = '".html::escapeJS(__('Inline quote'))."'; ".
+		"jsToolBar.prototype.elements.code.title = '".html::escapeJS(__('Code'))."'; ".
+		"jsToolBar.prototype.elements.br.title = '".html::escapeJS(__('Line break'))."'; ".
+		"jsToolBar.prototype.elements.blockquote.title = '".html::escapeJS(__('Blockquote'))."'; ".
+		"jsToolBar.prototype.elements.pre.title = '".html::escapeJS(__('Preformated text'))."'; ".
+		"jsToolBar.prototype.elements.ul.title = '".html::escapeJS(__('Unordered list'))."'; ".
+		"jsToolBar.prototype.elements.ol.title = '".html::escapeJS(__('Ordered list'))."'; ".
+		
+		"jsToolBar.prototype.elements.link.title = '".html::escapeJS(__('Link'))."'; ".
+		"jsToolBar.prototype.elements.link.href_prompt = '".html::escapeJS(__('URL?'))."'; ".
+		"jsToolBar.prototype.elements.link.hreflang_prompt = '".html::escapeJS(__('Language?'))."'; ".
+		
+		"jsToolBar.prototype.elements.img.title = '".html::escapeJS(__('External image'))."'; ".
+		"jsToolBar.prototype.elements.img.src_prompt = '".html::escapeJS(__('URL?'))."'; ".
+		
+		"jsToolBar.prototype.elements.img_select.title = '".html::escapeJS(__('Media chooser'))."'; ".
+		"jsToolBar.prototype.elements.post_link.title = '".html::escapeJS(__('Link to an entry'))."'; ";
+		
+		if (!$GLOBALS['core']->auth->check('media,media_admin',$GLOBALS['core']->blog->id)) {
+			$res .= "jsToolBar.prototype.elements.img_select.disabled = true;\n";
+		}
+		
+		$res .=
+		"\n//]]>\n".
+		"</script>\n";
+		
+		return $res;
+	}
+	
+	public static function jsCandyUpload($params=array(),$base_url=null)
+	{
+		if (!$base_url) {
+			$base_url = path::clean(dirname(preg_replace('/(\?.*$)?/','',$_SERVER['REQUEST_URI']))).'/';
+		}
+		
+		$params = array_merge($params,array(
+			'sess_id='.session_id(),
+			'sess_uid='.$_SESSION['sess_browser_uid'],
+			'xd_check='.$GLOBALS['core']->getNonce()
 		));
-
-	return
-	'<link rel="stylesheet" type="text/css" href="style/jsUpload/style.css" />'."\n".
-
-	'<script id="template-upload" type="text/x-tmpl">
-	{% for (var i=0, file; file=o.files[i]; i++) { %}
-	<div class="template-upload fade">
-	<div class="upload-file">
-	<div class="upload-fileinfo">
-		<span class="upload-filename">{%=file.name%}</span>
-		<span class="upload-filesize">({%=o.formatFileSize(file.size)%})</span>
-		<span class="upload-filecancel cancel">'.__('Cancel').'</span>
-		{% if (!o.files.error && !i && !o.options.autoUpload) { %}
-		<input type="submit" class="button start"  value="'.__('Send').'"/>
-		{% } %}
-		<span class="upload-filemsg"></span>
-	</div>
-	{% if (!o.files.error) { %}
-	<div class="upload-progress progress progress-success progress-striped active"><div class="bar" style="width:0%;"></div></div>
-	{% } %}
-	</div>
-	{% } %}
-	</script>
-	<!-- The template to display files available for download -->
-	<script id="template-download" type="text/x-tmpl">
-	{% for (var i=0, file; file=o.files[i]; i++) { %}
-	<div class="template-download fade">
-	<div class="upload-file">
-	<div class="upload-fileinfo">
-		<span class="upload-filename">{%=file.name%}</span>
-		<span class="upload-filesize">({%=o.formatFileSize(file.size)%})</span>
-		<span class="upload-filemsg{% if (file.error) { %} upload-error{% } %}">
-		{% if (file.error) { %}
-		'.__('Error:').' {%=file.error%}
-		{% } else { %}
-		'.__('File successfully uploaded.').'
-		{% } %}
-		</span>
-	</div>
-	<div class="upload-progress">
-		{% if (!file.error) { %}
-		<div class="bar" style="width:100%;">100%</div>
-		{% } %}
-	</div>
-	</div>
-	{% } %}
-	</script>'.
-
-	self::jsLoad('js/jsUpload/vendor/jquery.ui.widget.js').
-	self::jsLoad('js/jsUpload/tmpl.js').
-	self::jsLoad('js/jsUpload/load-image.js').
-	self::jsLoad('js/jsUpload/jquery.iframe-transport.js').
-	self::jsLoad('js/jsUpload/jquery.fileupload.js').
-	self::jsLoad('js/jsUpload/jquery.fileupload-process.js').
-	self::jsLoad('js/jsUpload/jquery.fileupload-resize.js').
-	self::jsLoad('js/jsUpload/jquery.fileupload-ui.js').
-
-	'<script type="text/javascript">'."\n".
-	"//<![CDATA[\n".
-	"dotclear.jsUpload = {};\n".
-	"dotclear.jsUpload.msg = {};\n".
-	self::jsVar('dotclear.msg.enhanced_uploader_activate',__('Temporarily activate enhanced uploader')).
-	self::jsVar('dotclear.msg.enhanced_uploader_disable',__('Temporarily disable enhanced uploader')).
-	self::jsVar('dotclear.jsUpload.msg.limit_exceeded',__('Limit exceeded.')).
-	self::jsVar('dotclear.jsUpload.msg.size_limit_exceeded',__('File size exceeds allowed limit.')).
-	self::jsVar('dotclear.jsUpload.msg.canceled',__('Canceled.')).
-	self::jsVar('dotclear.jsUpload.msg.http_error',__('HTTP Error:')).
-	self::jsVar('dotclear.jsUpload.msg.error',__('Error:')).
-	self::jsVar('dotclear.jsUpload.msg.choose_file',__('Choose file')).
-	self::jsVar('dotclear.jsUpload.msg.choose_files',__('Choose files')).
-	self::jsVar('dotclear.jsUpload.msg.cancel',__('Cancel')).
-	self::jsVar('dotclear.jsUpload.msg.clean',__('Clean')).
-	self::jsVar('dotclear.jsUpload.msg.upload',__('Upload')).
-	self::jsVar('dotclear.jsUpload.msg.no_file_in_queue',__('No file in queue.')).
-	self::jsVar('dotclear.jsUpload.msg.file_in_queue',__('1 file in queue.')).
-	self::jsVar('dotclear.jsUpload.msg.files_in_queue',__('%d files in queue.')).
-	self::jsVar('dotclear.jsUpload.msg.queue_error',__('Queue error:')).
-	self::jsVar('dotclear.jsUpload.base_url',$base_url).
-	"\n//]]>\n".
-	"</script>\n";
-}
-
-public static function jsToolMan()
-{
-	return
-	'<script type="text/javascript" src="js/tool-man/core.js"></script>'.
-	'<script type="text/javascript" src="js/tool-man/events.js"></script>'.
-	'<script type="text/javascript" src="js/tool-man/css.js"></script>'.
-	'<script type="text/javascript" src="js/tool-man/coordinates.js"></script>'.
-	'<script type="text/javascript" src="js/tool-man/drag.js"></script>'.
-	'<script type="text/javascript" src="js/tool-man/dragsort.js"></script>'.
-	'<script type="text/javascript" src="js/dragsort-tablerows.js"></script>';
-}
-
-public static function jsMetaEditor()
-{
-	return
-	'<script type="text/javascript" src="js/meta-editor.js"></script>';
-}
+		
+		return
+		'<link rel="stylesheet" type="text/css" href="style/candyUpload/style.css" />'."\n".
+		self::jsLoad('js/jquery/jquery.candyUpload.js').
+		
+		'<script type="text/javascript">'."\n".
+		"//<![CDATA[\n".
+		"dotclear.candyUpload = {};\n".
+		self::jsVar('dotclear.msg.activate_enhanced_uploader',__('Temporarily activate enhanced uploader')).
+		self::jsVar('dotclear.msg.disable_enhanced_uploader',__('Temporarily disable enhanced uploader')).
+		self::jsVar('$._candyUpload.prototype.locales.file_uploaded',__('File successfully uploaded.')).
+		self::jsVar('$._candyUpload.prototype.locales.max_file_size',__('Maximum file size allowed:')).
+		self::jsVar('$._candyUpload.prototype.locales.limit_exceeded',__('Limit exceeded.')).
+		self::jsVar('$._candyUpload.prototype.locales.size_limit_exceeded',__('File size exceeds allowed limit.')).
+		self::jsVar('$._candyUpload.prototype.locales.canceled',__('Canceled.')).
+		self::jsVar('$._candyUpload.prototype.locales.http_error',__('HTTP Error:')).
+		self::jsVar('$._candyUpload.prototype.locales.error',__('Error:')).
+		self::jsVar('$._candyUpload.prototype.locales.choose_file',__('Choose file')).
+		self::jsVar('$._candyUpload.prototype.locales.choose_files',__('Choose files')).
+		self::jsVar('$._candyUpload.prototype.locales.cancel',__('Cancel')).
+		self::jsVar('$._candyUpload.prototype.locales.clean',__('Clean')).
+		self::jsVar('$._candyUpload.prototype.locales.upload',__('Upload')).
+		self::jsVar('$._candyUpload.prototype.locales.no_file_in_queue',__('No file in queue.')).
+		self::jsVar('$._candyUpload.prototype.locales.file_in_queue',__('1 file in queue.')).
+		self::jsVar('$._candyUpload.prototype.locales.files_in_queue',__('%d files in queue.')).
+		self::jsVar('$._candyUpload.prototype.locales.queue_error',__('Queue error:')).
+		self::jsVar('dotclear.candyUpload.base_url',$base_url).
+		self::jsVar('dotclear.candyUpload.movie_url',$base_url.'index.php?pf=swfupload.swf').
+		self::jsVar('dotclear.candyUpload.params',implode('&',$params)).
+		"\n//]]>\n".
+		"</script>\n";
+	}
+	
+	public static function jsToolMan()
+	{
+		return
+		'<script type="text/javascript" src="js/tool-man/core.js"></script>'.
+		'<script type="text/javascript" src="js/tool-man/events.js"></script>'.
+		'<script type="text/javascript" src="js/tool-man/css.js"></script>'.
+		'<script type="text/javascript" src="js/tool-man/coordinates.js"></script>'.
+		'<script type="text/javascript" src="js/tool-man/drag.js"></script>'.
+		'<script type="text/javascript" src="js/tool-man/dragsort.js"></script>'.
+		'<script type="text/javascript" src="js/dragsort-tablerows.js"></script>';
+	}
+	
+	public static function jsMetaEditor()
+	{
+		return
+		'<script type="text/javascript" src="js/meta-editor.js"></script>';
+	}
 }
 ?>
Index: inc/admin/lib.pager.php
===================================================================
--- inc/admin/lib.pager.php	(revision 1179)
+++ inc/admin/lib.pager.php	(revision 860)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -133,5 +133,5 @@
 		'<td class="nowrap">'.dt::dt2str(__('%Y-%m-%d %H:%M'),$this->rs->post_dt).'</td>'.
 		'<td class="nowrap">'.$cat_title.'</td>'.
-		'<td class="nowrap">'.html::escapeHTML($this->rs->user_id).'</td>'.
+		'<td class="nowrap">'.$this->rs->user_id.'</td>'.
 		'<td class="nowrap">'.$this->rs->nb_comment.'</td>'.
 		'<td class="nowrap">'.$this->rs->nb_trackback.'</td>'.
@@ -230,5 +230,5 @@
 		html::escapeHTML($this->rs->post_title).'</a></td>'.
 		'<td class="nowrap">'.dt::dt2str(__('%Y-%m-%d %H:%M'),$this->rs->post_dt).'</td>'.
-		'<td class="nowrap">'.html::escapeHTML($this->rs->user_id).'</td>'.
+		'<td class="nowrap">'.$this->rs->user_id.'</td>'.
 		'<td class="nowrap status">'.$img_status.' '.$selected.' '.$protected.' '.$attach.'</td>'.
 		'</tr>';
@@ -334,5 +334,5 @@
 		($this->rs->post_type != 'post' ? ' ('.html::escapeHTML($this->rs->post_type).')' : '').'</td>'.
 		'<td class="nowrap">'.dt::dt2str(__('%Y-%m-%d %H:%M'),$this->rs->comment_dt).'</td>'.
-		'<td class="nowrap"><a href="'.$author_url.'">'.html::escapeHTML($comment_author).'</a></td>'.
+		'<td class="nowrap"><a href="'.$author_url.'">'.$comment_author.'</a></td>'.
 		'<td class="nowrap">'.($this->rs->comment_trackback ? __('trackback') : __('comment')).'</td>'.
 		'<td class="nowrap status">'.$img_status.'</td>'.
@@ -410,7 +410,7 @@
 		'<td class="maximal"><a href="user.php?id='.$this->rs->user_id.'">'.
 		$this->rs->user_id.'</a>&nbsp;'.$img_status.'</td>'.
-		'<td class="nowrap">'.html::escapeHTML($this->rs->user_firstname).'</td>'.
-		'<td class="nowrap">'.html::escapeHTML($this->rs->user_name).'</td>'.
-		'<td class="nowrap">'.html::escapeHTML($this->rs->user_displayname).'</td>'.
+		'<td class="nowrap">'.$this->rs->user_firstname.'</td>'.
+		'<td class="nowrap">'.$this->rs->user_name.'</td>'.
+		'<td class="nowrap">'.$this->rs->user_displayname.'</td>'.
 		'<td class="nowrap"><a href="posts.php?user_id='.$this->rs->user_id.'">'.
 		$this->rs->nb_post.'</a></td>'.
Index: inc/admin/prepend.php
===================================================================
--- inc/admin/prepend.php	(revision 1179)
+++ inc/admin/prepend.php	(revision 1069)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/config.php.in
===================================================================
--- inc/config.php.in	(revision 1179)
+++ inc/config.php.in	(revision 362)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/core/class.dc.auth.php
===================================================================
--- inc/core/class.dc.auth.php	(revision 1179)
+++ inc/core/class.dc.auth.php	(revision 527)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/core/class.dc.blog.php
===================================================================
--- inc/core/class.dc.blog.php	(revision 1179)
+++ inc/core/class.dc.blog.php	(revision 1227)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -2267,6 +2267,8 @@
 		
 		if ($cur->comment_site !== null && $cur->comment_site != '') {
-			if (!preg_match('|^http(s?)://|',$cur->comment_site)) {
+			if (!preg_match('|^http(s?)://|i',$cur->comment_site, $matches)) {
 				$cur->comment_site = 'http://'.$cur->comment_site;
+			}else{
+				$cur->comment_site = strtolower($matches[0]).substr($cur->comment_site, strlen($matches[0]));
 			}
 		}
Index: inc/core/class.dc.categories.php
===================================================================
--- inc/core/class.dc.categories.php	(revision 1179)
+++ inc/core/class.dc.categories.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/core/class.dc.core.php
===================================================================
--- inc/core/class.dc.core.php	(revision 1179)
+++ inc/core/class.dc.core.php	(revision 706)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/core/class.dc.error.php
===================================================================
--- inc/core/class.dc.error.php	(revision 1179)
+++ inc/core/class.dc.error.php	(revision 334)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/core/class.dc.log.php
===================================================================
--- inc/core/class.dc.log.php	(revision 1179)
+++ inc/core/class.dc.log.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/core/class.dc.media.php
===================================================================
--- inc/core/class.dc.media.php	(revision 1220)
+++ inc/core/class.dc.media.php	(revision 1103)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -515,5 +515,5 @@
 			$f = $this->fileRecord($rs);
 			if ($f !== null) {
-				$res[] = new ArrayObject($f);
+				$res[] = $f;
 			}
 		}
@@ -841,5 +841,5 @@
 		while ($rs->fetch()) {
 			if (is_dir($this->root.'/'.$rs->media_dir))
-				$dir[] = ($rs->media_dir == '.' ? '' : $rs->media_dir);
+				$dir[] = $rs->media_dir;
 		}
 		
@@ -940,5 +940,4 @@
 					$img->resize($s[0],$s[0],$s[1]);
 					$img->output('jpeg',$thumb_file,$rate);
-					$img->loadImage($file);
 				}
 			}
Index: inc/core/class.dc.meta.php
===================================================================
--- inc/core/class.dc.meta.php	(revision 1179)
+++ inc/core/class.dc.meta.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/core/class.dc.modules.php
===================================================================
--- inc/core/class.dc.modules.php	(revision 1196)
+++ inc/core/class.dc.modules.php	(revision 464)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -85,5 +85,5 @@
 			while (($entry = $d->read()) !== false)
 			{
-				$full_entry = $root.$entry;
+				$full_entry = $root.'/'.$entry;
 				
 				if ($entry != '.' && $entry != '..' && is_dir($full_entry)
Index: inc/core/class.dc.namespace.php
===================================================================
--- inc/core/class.dc.namespace.php	(revision 1179)
+++ inc/core/class.dc.namespace.php	(revision 934)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/core/class.dc.postmedia.php
===================================================================
--- inc/core/class.dc.postmedia.php	(revision 1179)
+++ inc/core/class.dc.postmedia.php	(revision 407)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/core/class.dc.prefs.php
===================================================================
--- inc/core/class.dc.prefs.php	(revision 1179)
+++ inc/core/class.dc.prefs.php	(revision 934)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/core/class.dc.rest.php
===================================================================
--- inc/core/class.dc.rest.php	(revision 1179)
+++ inc/core/class.dc.rest.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/core/class.dc.rs.extensions.php
===================================================================
--- inc/core/class.dc.rs.extensions.php	(revision 1179)
+++ inc/core/class.dc.rs.extensions.php	(revision 912)
@@ -3,5 +3,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/core/class.dc.settings.php
===================================================================
--- inc/core/class.dc.settings.php	(revision 1179)
+++ inc/core/class.dc.settings.php	(revision 934)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/core/class.dc.themes.php
===================================================================
--- inc/core/class.dc.themes.php	(revision 1179)
+++ inc/core/class.dc.themes.php	(revision 465)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/core/class.dc.trackback.php
===================================================================
--- inc/core/class.dc.trackback.php	(revision 1179)
+++ inc/core/class.dc.trackback.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/core/class.dc.update.php
===================================================================
--- inc/core/class.dc.update.php	(revision 1179)
+++ inc/core/class.dc.update.php	(revision 767)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/core/class.dc.utils.php
===================================================================
--- inc/core/class.dc.utils.php	(revision 1179)
+++ inc/core/class.dc.utils.php	(revision 1030)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/core/class.dc.workspace.php
===================================================================
--- inc/core/class.dc.workspace.php	(revision 1179)
+++ inc/core/class.dc.workspace.php	(revision 934)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/core/class.dc.xmlrpc.php
===================================================================
--- inc/core/class.dc.xmlrpc.php	(revision 1179)
+++ inc/core/class.dc.xmlrpc.php	(revision 776)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/core_error.php
===================================================================
--- inc/core_error.php	(revision 1179)
+++ inc/core_error.php	(revision 921)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/dbschema/db-schema.php
===================================================================
--- inc/dbschema/db-schema.php	(revision 1179)
+++ inc/dbschema/db-schema.php	(revision 919)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/dbschema/upgrade-cli.php
===================================================================
--- inc/dbschema/upgrade-cli.php	(revision 1179)
+++ inc/dbschema/upgrade-cli.php	(revision 838)
@@ -5,5 +5,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/dbschema/upgrade.php
===================================================================
--- inc/dbschema/upgrade.php	(revision 1205)
+++ inc/dbschema/upgrade.php	(revision 1083)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -335,10 +335,4 @@
 				}
 			}
-
-			if (version_compare($version, '2.5.1', '<='))
-			{
-				// Flash enhanced upload no longer needed
-				@unlink(DC_ROOT.'/'.'inc/swf/swfupload.swf');
-			}
 			
 			$core->setVersion('core',DC_VERSION);
Index: inc/load_plugin_file.php
===================================================================
--- inc/load_plugin_file.php	(revision 1179)
+++ inc/load_plugin_file.php	(revision 1116)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/prepend.php
===================================================================
--- inc/prepend.php	(revision 1217)
+++ inc/prepend.php	(revision 1181)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/public/class.dc.template.php
===================================================================
--- inc/public/class.dc.template.php	(revision 1179)
+++ inc/public/class.dc.template.php	(revision 980)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -42,5 +42,4 @@
 		# Loops test tags
 		$this->addBlock('LoopPosition',array($this,'LoopPosition'));
-		$this->addValue('LoopIndex',array($this,'LoopIndex'));
 		
 		# Archives
@@ -529,10 +528,4 @@
 		"<?php endif; ?>";
 	}
-
-	public function LoopIndex($attr)
-	{
-		$f = $this->getFilters($attr);
-		return '<?php '.sprintf($f,'(!$_ctx->cur_loop ? 0 : $_ctx->cur_loop->index() + 1)').' ?>';
-	}
 	
 	
Index: inc/public/lib.tpl.context.php
===================================================================
--- inc/public/lib.tpl.context.php	(revision 1179)
+++ inc/public/lib.tpl.context.php	(revision 975)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -451,7 +451,7 @@
 		
 		# No src, look in category description if available
-        if (!$src && $with_category && $_ctx->posts->cat_desc)
-        {
-			if (preg_match_all($pattern,$_ctx->posts->cat_desc,$m) > 0)
+		if (!$src && $with_category && $_ctx->categories)
+		{
+			if (preg_match_all($pattern,$_ctx->categories->cat_desc,$m) > 0)
 			{
 				foreach ($m[1] as $i => $img) {
Index: inc/public/lib.urlhandlers.php
===================================================================
--- inc/public/lib.urlhandlers.php	(revision 1179)
+++ inc/public/lib.urlhandlers.php	(revision 779)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/public/prepend.php
===================================================================
--- inc/public/prepend.php	(revision 1179)
+++ inc/public/prepend.php	(revision 921)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/public/rs.extension.php
===================================================================
--- inc/public/rs.extension.php	(revision 1179)
+++ inc/public/rs.extension.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: index.php
===================================================================
--- index.php	(revision 1179)
+++ index.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: locales/bn/plugins.po
===================================================================
--- locales/bn/plugins.po	(revision 1126)
+++ locales/bn/plugins.po	(revision 759)
@@ -222,5 +222,5 @@
 msgstr ""
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/ca/plugins.po
===================================================================
--- locales/ca/plugins.po	(revision 1126)
+++ locales/ca/plugins.po	(revision 759)
@@ -221,5 +221,5 @@
 msgstr ""
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/cs/plugins.po
===================================================================
--- locales/cs/plugins.po	(revision 1126)
+++ locales/cs/plugins.po	(revision 759)
@@ -224,5 +224,5 @@
 msgstr "Všechny spam komentáře starší než %s dnů(y) budou automaticky smazány."
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/da/plugins.po
===================================================================
--- locales/da/plugins.po	(revision 1126)
+++ locales/da/plugins.po	(revision 759)
@@ -221,5 +221,5 @@
 msgstr ""
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/de/plugins.po
===================================================================
--- locales/de/plugins.po	(revision 1126)
+++ locales/de/plugins.po	(revision 759)
@@ -224,5 +224,5 @@
 msgstr "Alle Spam-Kommentare, die älter als %s Tag(e) sind, werden automatisch gelöscht."
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/en/help/media.html
===================================================================
--- locales/en/help/media.html	(revision 1195)
+++ locales/en/help/media.html	(revision 175)
@@ -31,10 +31,4 @@
   <dd>Check this if you want the file to be private, i.e. accessible only by
   its owner and not accessible from the blog.</dd>
-</dl>
-
-<dl>
-  <dt>Enhanced uploader</dt>
-  <dd>Allows to select one or several of your local files to send them on your 
-  blog. Should any file be bigger than the maximum size, it will not be sent.</dd>
 </dl>
 
Index: locales/en/plugins.po
===================================================================
--- locales/en/plugins.po	(revision 1126)
+++ locales/en/plugins.po	(revision 893)
@@ -238,5 +238,5 @@
 msgstr ""
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/en/resources.php
===================================================================
--- locales/en/resources.php	(revision 1179)
+++ locales/en/resources.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: locales/eo/plugins.po
===================================================================
--- locales/eo/plugins.po	(revision 1126)
+++ locales/eo/plugins.po	(revision 759)
@@ -221,5 +221,5 @@
 msgstr ""
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/es-ar/plugins.po
===================================================================
--- locales/es-ar/plugins.po	(revision 1126)
+++ locales/es-ar/plugins.po	(revision 759)
@@ -223,5 +223,5 @@
 msgstr "Todos los comentarios no deseados mas antiguos que %s día(s) serán automáticamente eliminados."
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/es/plugins.po
===================================================================
--- locales/es/plugins.po	(revision 1126)
+++ locales/es/plugins.po	(revision 759)
@@ -228,5 +228,5 @@
 msgstr "Todos los comentarios basura de más de %s día(s) serán borrados automáticamente."
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/eu/plugins.po
===================================================================
--- locales/eu/plugins.po	(revision 1126)
+++ locales/eu/plugins.po	(revision 759)
@@ -221,5 +221,5 @@
 msgstr ""
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/fr/help/core_media.html
===================================================================
--- locales/fr/help/core_media.html	(revision 1194)
+++ locales/fr/help/core_media.html	(revision 175)
@@ -31,10 +31,4 @@
   <dd>Indique que le fichier envoyé n'est visible que par son propriétaire tant
   qu'il n'est pas publié sur le blog.</dd>
-</dl>
-
-<dl>
-  <dt>Interface avancée</dt>
-  <dd>Permet de choisir plusieurs fichiers à la fois sur son disque dur pour les envoyer sur le
-  blog. Si un des fichiers dépasse la taille maximale, il ne pourra être envoyé.</dd>
 </dl>
 
Index: locales/fr/main.po
===================================================================
--- locales/fr/main.po	(revision 1193)
+++ locales/fr/main.po	(revision 1102)
@@ -1411,5 +1411,5 @@
 
 msgid "Extract"
-msgstr "Extraire"
+msgstr "Extrait"
 
 msgid "Change media properties"
@@ -1473,7 +1473,4 @@
 msgid "You can find additional plugins for your blog on %s."
 msgstr "Vous pouvez trouver de nouvelles extensions pour votre blog sur %s."
-
-msgid "You can find additional plugins for your blog on %s or using the %s."
-msgstr "Vous pouvez trouver de nouvelles extensions pour votre blog sur %s ou en utilisant l'%s."
 
 msgid "To install or upgrade a plugin you generally just need to upload it in \"Install or upgrade a plugin\" section."
@@ -2381,12 +2378,9 @@
 msgstr "Choisir des fichiers"
 
-msgid "Refresh"
-msgstr "Actualiser"
+msgid "Clean"
+msgstr "Nettoyer"
 
 msgid "Upload"
 msgstr "Envoyer"
-
-msgid "Clear all"
-msgstr "Tout annuler"
 
 msgid "No file in queue."
Index: locales/fr/plugins.po
===================================================================
--- locales/fr/plugins.po	(revision 1226)
+++ locales/fr/plugins.po	(revision 1063)
@@ -262,4 +262,7 @@
 "supprimés automatiquement."
 
+msgid "You can modify this duration in "
+msgstr "Vous pouvez modifier cet intervalle dans"
+
 msgid "Blog preferences"
 msgstr "Préférences du blog"
@@ -1131,5 +1134,5 @@
 
 msgid "Vacuum tables"
-msgstr "Optimiser les tables"
+msgstr "Vidage des tables"
 
 msgid "Counters"
@@ -1137,5 +1140,5 @@
 
 msgid "Reset comments and ping counters"
-msgstr "Recalculer les compteurs de commentaires et de signalements"
+msgstr "Remet à zéro les compteurs de commentaires et de signalements"
 
 msgid "Search engine index"
@@ -1146,8 +1149,8 @@
 
 msgid "Index all posts"
-msgstr "Indexer tous les billets"
+msgstr "Indexation de tous les billets"
 
 msgid "Index all comments"
-msgstr "Indexer tous les commentaires"
+msgstr "Indexation de tous les commentaires"
 
 msgid "Vacuum logs"
@@ -1155,5 +1158,5 @@
 
 msgid "Delete all logs"
-msgstr "Supprimer tous les journaux"
+msgstr "Suppression de tous les journaux"
 
 msgid "Empty templates cache directory"
@@ -1161,5 +1164,5 @@
 
 msgid "Empty directory"
-msgstr "Vider le répertoire"
+msgstr "Vidage du répertoire"
 
 msgid "Pages"
@@ -1896,19 +1899,19 @@
 msgstr "Liste des derniers commentaires postés"
 
+#~ msgid "Export a blog"
+#~ msgstr "Exporter un blog"
+
+#~ msgid "Export all content"
+#~ msgstr "Exporte tout le contenu"
+
+#~ msgid "Import from a feed"
+#~ msgstr "Importer depuis un flux"
+
+#~ msgid "Import a full backup file"
+#~ msgstr "Importer un fichier de sauvegarde complet"
+
+#~ msgid "The backup file does not appear to be well formed."
+#~ msgstr "Le fichier de sauvegarde semble mal formaté."
+
 msgid "You can modify this duration in the %s"
 msgstr "Vous pouvez modifier cette durée dans les %s"
-
-#~ msgid "Export a blog"
-#~ msgstr "Exporter un blog"
-
-#~ msgid "Export all content"
-#~ msgstr "Exporte tout le contenu"
-
-#~ msgid "Import from a feed"
-#~ msgstr "Importer depuis un flux"
-
-#~ msgid "Import a full backup file"
-#~ msgstr "Importer un fichier de sauvegarde complet"
-
-#~ msgid "The backup file does not appear to be well formed."
-#~ msgstr "Le fichier de sauvegarde semble mal formaté."
Index: locales/fr/resources.php
===================================================================
--- locales/fr/resources.php	(revision 1179)
+++ locales/fr/resources.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: locales/hu/plugins.po
===================================================================
--- locales/hu/plugins.po	(revision 1126)
+++ locales/hu/plugins.po	(revision 759)
@@ -223,5 +223,5 @@
 msgstr "Az összes %s napnál öregebb spam automatikusan törlődni fog."
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/it/plugins.po
===================================================================
--- locales/it/plugins.po	(revision 1126)
+++ locales/it/plugins.po	(revision 759)
@@ -221,5 +221,5 @@
 msgstr ""
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/ja/plugins.po
===================================================================
--- locales/ja/plugins.po	(revision 1126)
+++ locales/ja/plugins.po	(revision 759)
@@ -225,5 +225,5 @@
 msgstr "%s 日を経過したすべてのスパムコメントは自動的に削除されます。"
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/ja/resources.php
===================================================================
--- locales/ja/resources.php	(revision 1179)
+++ locales/ja/resources.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: locales/ko/plugins.po
===================================================================
--- locales/ko/plugins.po	(revision 1126)
+++ locales/ko/plugins.po	(revision 759)
@@ -224,5 +224,5 @@
 msgstr "%s 일이 지난 스팸은 모두 자동으로 삭제됩니다."
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/lt/plugins.po
===================================================================
--- locales/lt/plugins.po	(revision 1126)
+++ locales/lt/plugins.po	(revision 813)
@@ -215,7 +215,4 @@
 msgstr "Senesni nei %s dienų spamo komentarai bus automatiškai ištrinami."
 
-msgid "You can modify this duration in the %s"
-msgstr ""
-
 msgid "Available spam filters"
 msgstr "Galimi spam filtrai"
Index: locales/nl/plugins.po
===================================================================
--- locales/nl/plugins.po	(revision 1126)
+++ locales/nl/plugins.po	(revision 759)
@@ -220,5 +220,5 @@
 msgstr ""
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/oc/plugins.po
===================================================================
--- locales/oc/plugins.po	(revision 1126)
+++ locales/oc/plugins.po	(revision 759)
@@ -221,5 +221,5 @@
 msgstr ""
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/pl/plugins.po
===================================================================
--- locales/pl/plugins.po	(revision 1126)
+++ locales/pl/plugins.po	(revision 759)
@@ -224,5 +224,5 @@
 msgstr "Wszystkie niechciane komentarze starsze niż %s dni będą automatycznie usuwane."
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/po_update.sh
===================================================================
--- locales/po_update.sh	(revision 1179)
+++ locales/po_update.sh	(revision 1046)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: locales/pt-br/plugins.po
===================================================================
--- locales/pt-br/plugins.po	(revision 1126)
+++ locales/pt-br/plugins.po	(revision 759)
@@ -221,5 +221,5 @@
 msgstr ""
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/pt/plugins.po
===================================================================
--- locales/pt/plugins.po	(revision 1126)
+++ locales/pt/plugins.po	(revision 759)
@@ -228,5 +228,5 @@
 msgstr "Todos os comentários spam com mais de %s dia(s) serão suprimidos automaticamente."
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/ro/plugins.po
===================================================================
--- locales/ro/plugins.po	(revision 1126)
+++ locales/ro/plugins.po	(revision 842)
@@ -225,5 +225,5 @@
 msgstr "Toate comentariile spam mai vechi de %s zile vor fi șterse automat."
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/ru/plugins.po
===================================================================
--- locales/ru/plugins.po	(revision 1126)
+++ locales/ru/plugins.po	(revision 759)
@@ -222,5 +222,5 @@
 msgstr "Все спам комментарии старше чем %s дней будут удалены автоматически."
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/sr/plugins.po
===================================================================
--- locales/sr/plugins.po	(revision 1126)
+++ locales/sr/plugins.po	(revision 759)
@@ -221,5 +221,5 @@
 msgstr ""
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/sv/plugins.po
===================================================================
--- locales/sv/plugins.po	(revision 1126)
+++ locales/sv/plugins.po	(revision 751)
@@ -221,5 +221,5 @@
 msgstr ""
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/te/plugins.po
===================================================================
--- locales/te/plugins.po	(revision 1126)
+++ locales/te/plugins.po	(revision 759)
@@ -220,5 +220,5 @@
 msgstr ""
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/tr/plugins.po
===================================================================
--- locales/tr/plugins.po	(revision 1126)
+++ locales/tr/plugins.po	(revision 759)
@@ -223,5 +223,5 @@
 msgstr ""
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: locales/zh-cn/plugins.po
===================================================================
--- locales/zh-cn/plugins.po	(revision 1126)
+++ locales/zh-cn/plugins.po	(revision 759)
@@ -225,5 +225,5 @@
 msgstr "所有早于 %s 天的垃圾评论都会被自动删除。"
 
-msgid "You can modify this duration in the %s"
+msgid "You can modify this duration in "
 msgstr ""
 
Index: plugins/aboutConfig/_admin.php
===================================================================
--- plugins/aboutConfig/_admin.php	(revision 1179)
+++ plugins/aboutConfig/_admin.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/aboutConfig/_define.php
===================================================================
--- plugins/aboutConfig/_define.php	(revision 1179)
+++ plugins/aboutConfig/_define.php	(revision 967)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/aboutConfig/index.php
===================================================================
--- plugins/aboutConfig/index.php	(revision 1179)
+++ plugins/aboutConfig/index.php	(revision 1109)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/akismet/_define.php
===================================================================
--- plugins/akismet/_define.php	(revision 1179)
+++ plugins/akismet/_define.php	(revision 965)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/akismet/_prepend.php
===================================================================
--- plugins/akismet/_prepend.php	(revision 1179)
+++ plugins/akismet/_prepend.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/akismet/class.dc.filter.akismet.php
===================================================================
--- plugins/akismet/class.dc.filter.akismet.php	(revision 1179)
+++ plugins/akismet/class.dc.filter.akismet.php	(revision 1094)
@@ -4,5 +4,5 @@
 # This file is part of Antispam, a plugin for Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/antispam/_admin.php
===================================================================
--- plugins/antispam/_admin.php	(revision 1207)
+++ plugins/antispam/_admin.php	(revision 1052)
@@ -4,5 +4,5 @@
 # This file is part of Antispam, a plugin for Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -59,5 +59,5 @@
 		if ($ttl != null && $ttl >=0) {
 			echo '<p>'.sprintf(__('All spam comments older than %s day(s) will be automatically deleted.'), $ttl).' '.
-			sprintf(__('You can modify this duration in the %s'),'<a href="blog_pref.php#antispam_moderation_ttl"> '.__('Blog preferences').'</a>').
+			sprintf(__('You can modify this duration in the %s'),'<a href="blog_pref.php"> '.__('Blog preferences').'</a>').
 			'</p>';
 		}
Index: plugins/antispam/_define.php
===================================================================
--- plugins/antispam/_define.php	(revision 1179)
+++ plugins/antispam/_define.php	(revision 967)
@@ -4,5 +4,5 @@
 # This file is part of Antispam, a plugin for Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -16,5 +16,5 @@
 	/* Description*/		"Generic antispam plugin for Dotclear",
 	/* Author */			"Alain Vagner",
-	/* Version */			'1.4.1',
+	/* Version */			'1.4',
 	array(
 		'permissions' =>	'usage,contentadmin',
Index: plugins/antispam/_install.php
===================================================================
--- plugins/antispam/_install.php	(revision 1179)
+++ plugins/antispam/_install.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Antispam, a plugin for Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/antispam/_prepend.php
===================================================================
--- plugins/antispam/_prepend.php	(revision 1179)
+++ plugins/antispam/_prepend.php	(revision 920)
@@ -4,5 +4,5 @@
 # This file is part of Antispam, a plugin for Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/antispam/_public.php
===================================================================
--- plugins/antispam/_public.php	(revision 1179)
+++ plugins/antispam/_public.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Antispam, a plugin for Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/antispam/antispam.js
===================================================================
--- plugins/antispam/antispam.js	(revision 1130)
+++ plugins/antispam/antispam.js	(revision 1052)
@@ -1,18 +1,34 @@
+var dragsort = ToolMan.dragsort();
 $(function() {
-	$("#filters-list").sortable({'cursor':'move'});
-	$("#filters-list tr").hover(function () {
-		$(this).css({'cursor':'move'});
-	}, function () {
-		$(this).css({'cursor':'auto'});
+	$("#filters-list").each(function() {
+		dragsort.makeTableSortable(this,dotclear.sortable.setHandle, dotclear.sortable.saveOrder);
 	});
-	$('#filters-form').submit(function() {
-		var order=[];
-		$("#filters-list tr td input.position").each(function() {
-			order.push(this.name.replace(/^f_order\[([^\]]+)\]$/,'$1'));
+	$('form input[type=submit][name=delete_all]').click(function(){
+		return window.confirm(dotclear.msg.confirm_spam_delete);
+	});
+});
+
+dotclear.sortable = {
+	setHandle: function(item) {
+		var handle = $(item).find('td.handle').get(0);
+		while (handle.firstChild) {
+			handle.removeChild(handle.firstChild);
+		}
+		
+		item.toolManDragGroup.setHandle(handle);
+		$(handle).addClass('handler');
+	},
+	
+	saveOrder: function(item) {
+		var group = item.toolManDragGroup;
+		var order = $('#filters_order').get(0);
+		group.register('dragend', function() {
+			order.value = '';
+			items = item.parentNode.getElementsByTagName('tr');
+			
+			for (var i=0; i<items.length; i++) {
+				order.value += items[i].id.substr(2)+',';
+			}
 		});
-		$("input[name=filters_order]")[0].value = order.join(',');
-		return true;
-	});
-	$("#filters-list tr td input.position").hide();
-	$("#filters-list tr td.handle").addClass('handler');
-});
+	}
+};
Index: plugins/antispam/filters/class.dc.filter.ip.php
===================================================================
--- plugins/antispam/filters/class.dc.filter.ip.php	(revision 1179)
+++ plugins/antispam/filters/class.dc.filter.ip.php	(revision 907)
@@ -4,5 +4,5 @@
 # This file is part of Antispam, a plugin for Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/antispam/filters/class.dc.filter.iplookup.php
===================================================================
--- plugins/antispam/filters/class.dc.filter.iplookup.php	(revision 1179)
+++ plugins/antispam/filters/class.dc.filter.iplookup.php	(revision 536)
@@ -4,5 +4,5 @@
 # This file is part of Antispam, a plugin for Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/antispam/filters/class.dc.filter.linkslookup.php
===================================================================
--- plugins/antispam/filters/class.dc.filter.linkslookup.php	(revision 1179)
+++ plugins/antispam/filters/class.dc.filter.linkslookup.php	(revision 913)
@@ -4,5 +4,5 @@
 # This file is part of Antispam, a plugin for Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/antispam/filters/class.dc.filter.words.php
===================================================================
--- plugins/antispam/filters/class.dc.filter.words.php	(revision 1179)
+++ plugins/antispam/filters/class.dc.filter.words.php	(revision 907)
@@ -4,5 +4,5 @@
 # This file is part of Antispam, a plugin for Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/antispam/inc/class.dc.spamfilter.php
===================================================================
--- plugins/antispam/inc/class.dc.spamfilter.php	(revision 1179)
+++ plugins/antispam/inc/class.dc.spamfilter.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Antispam, a plugin for Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/antispam/inc/class.dc.spamfilters.php
===================================================================
--- plugins/antispam/inc/class.dc.spamfilters.php	(revision 1179)
+++ plugins/antispam/inc/class.dc.spamfilters.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Antispam, a plugin for Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/antispam/inc/lib.dc.antispam.php
===================================================================
--- plugins/antispam/inc/lib.dc.antispam.php	(revision 1179)
+++ plugins/antispam/inc/lib.dc.antispam.php	(revision 752)
@@ -4,5 +4,5 @@
 # This file is part of Antispam, a plugin for Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/antispam/inc/lib.dc.antispam.url.php
===================================================================
--- plugins/antispam/inc/lib.dc.antispam.url.php	(revision 1179)
+++ plugins/antispam/inc/lib.dc.antispam.url.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Antispam, a plugin for Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/antispam/index.php
===================================================================
--- plugins/antispam/index.php	(revision 1207)
+++ plugins/antispam/index.php	(revision 1052)
@@ -4,5 +4,5 @@
 # This file is part of Antispam, a plugin for Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -108,11 +108,8 @@
   </script>
   <?php
-  echo dcPage::jsPageTabs($default_tab);
-  $core->auth->user_prefs->addWorkspace('accessibility');
-  if (!$core->auth->user_prefs->accessibility->nodragdrop) {
-	echo
-		dcPage::jsLoad('js/jquery/jquery-ui.custom.js').
-		dcPage::jsLoad('index.php?pf=antispam/antispam.js');
-  }
+  echo
+  dcPage::jsToolMan().
+  dcPage::jsPageTabs($default_tab).
+  dcPage::jsLoad('index.php?pf=antispam/antispam.js');
   ?>
   <link rel="stylesheet" type="text/css" href="index.php?pf=antispam/style.css" />
@@ -162,6 +159,6 @@
 	if ($moderationTTL != null && $moderationTTL >=0) {
 		echo '<p>'.sprintf(__('All spam comments older than %s day(s) will be automatically deleted.'), $moderationTTL).' '.
-		sprintf(__('You can modify this duration in the %s'),'<a href="blog_pref.php#antispam_moderation_ttl"> '.__('Blog preferences').'</a>').
-			'</p>';
+		__('You can modify this duration in ').
+		'<a href="blog_pref.php"> '.__('Blog preferences').'</a></p>';
 	}
 	echo '</form>';
@@ -170,5 +167,5 @@
 	# Filters
 	echo
-	'<form action="'.$p_url.'" method="post" class="fieldset" id="filters-form">';
+	'<form action="'.$p_url.'" method="post" class="fieldset">';
 
 	if (!empty($_GET['upd'])) {
@@ -201,5 +198,5 @@
 		echo
 		'<tr class="line'.($f->active ? '' : ' offline').'" id="f_'.$fid.'">'.
-		'<td class="handle">'.form::field(array('f_order['.$fid.']'),2,5,(string) $i, 'position', '', false, 'title="'.__('position').'"').'</td>'.
+		'<td class="handle">'.form::field(array('f_order['.$fid.']'),2,5,(string) $i, '', '', false, 'title="'.__('position').'"').'</td>'.
 		'<td class="nowrap">'.form::checkbox(array('filters_active[]'),$fid,$f->active, '', '', false, 'title="'.__('Active').'"').'</td>'.
 		'<td class="nowrap">'.form::checkbox(array('filters_auto_del[]'),$fid,$f->auto_delete, '', '', false, 'title="'.__('Auto Del.').'"').'</td>'.
Index: plugins/attachments/_admin.php
===================================================================
--- plugins/attachments/_admin.php	(revision 1179)
+++ plugins/attachments/_admin.php	(revision 416)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/attachments/_define.php
===================================================================
--- plugins/attachments/_define.php	(revision 1179)
+++ plugins/attachments/_define.php	(revision 967)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/attachments/_public.php
===================================================================
--- plugins/attachments/_public.php	(revision 1221)
+++ plugins/attachments/_public.php	(revision 944)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -40,16 +40,12 @@
 		"<?php\n".
 		'if ($_ctx->posts !== null && $core->media) {'."\n".
-		'$_ctx->attachments = staticRecord::newFromArray($core->media->getPostMedia($_ctx->posts->post_id));'."\n".
+			'$_ctx->attachments = new ArrayObject($core->media->getPostMedia($_ctx->posts->post_id));'."\n".
 		"?>\n".
 		
-		'<?php $attach_i = 0; ?>'. // LEGACY
-		'<?php while ($_ctx->attachments->fetch()) : ?>'.
-		
-		'<?php $GLOBALS[\'attach_i\'] = $attach_i; $attach_f = $_ctx->attachments->row(); $GLOBALS[\'attach_f\'] = $attach_f;'. // LEGACY
-		'$_ctx->file_url = $attach_f->file_url; ?>'. // LEGACY
+		'<?php foreach ($_ctx->attachments as $attach_i => $attach_f) : '.
+		'$GLOBALS[\'attach_i\'] = $attach_i; $GLOBALS[\'attach_f\'] = $attach_f;'.
+		'$_ctx->file_url = $attach_f->file_url; ?>'.
 		$content.
-		'<?php $attach_i++; ?>'. // LEGACY
-		'<?php endwhile; '.
-		'$_ctx->attachments = null; ?>'.
+		'<?php endforeach; $_ctx->attachments = null; unset($attach_i,$attach_f,$_ctx->file_url); ?>'.
 		
 		"<?php } ?>\n";
@@ -64,5 +60,5 @@
 	{
 		return
-		"<?php if (\$_ctx->attachments->isStart()) : ?>".
+		"<?php if (\$attach_i == 0) : ?>".
 		$content.
 		"<?php endif; ?>";
@@ -75,5 +71,5 @@
 	{
 		return
-		"<?php if (\$_ctx->attachments->isEnd()) : ?>".
+		"<?php if (\$attach_i+1 == count(\$_ctx->attachments)) : ?>".
 		$content.
 		"<?php endif; ?>";
@@ -97,15 +93,15 @@
 		if (isset($attr['is_image'])) {
 			$sign = (boolean) $attr['is_image'] ? '' : '!';
-			$if[] = $sign.'$_ctx->attachments->media_image';
+			$if[] = $sign.'$attach_f->media_image';
 		}
 		
 		if (isset($attr['has_thumb'])) {
 			$sign = (boolean) $attr['has_thumb'] ? '' : '!';
-			$if[] = $sign.'isset($_ctx->attachments->media_thumb[\'sq\'])';
+			$if[] = $sign.'isset($attach_f->media_thumb[\'sq\'])';
 		}
 		
 		if (isset($attr['is_mp3'])) {
 			$sign = (boolean) $attr['is_mp3'] ? '==' : '!=';
-			$if[] = '$_ctx->attachments->type '.$sign.' "audio/mpeg3"';
+			$if[] = '$attach_f->type '.$sign.' "audio/mpeg3"';
 		}
 		
@@ -113,7 +109,7 @@
 			$sign = (boolean) $attr['is_flv'] ? '' : '!';
 			$if[] = $sign.
-				'($_ctx->attachments->type == "video/x-flv" || '.
-				'$_ctx->attachments->type == "video/mp4" || '.
-				'$_ctx->attachments->type == "video/x-m4v")';
+				'($attach_f->type == "video/x-flv" || '.
+				'$attach_f->type == "video/mp4" || '.
+				'$attach_f->type == "video/x-m4v")';
 		}
 		
@@ -131,5 +127,5 @@
 	{
 		$f = $GLOBALS['core']->tpl->getFilters($attr);
-		return '<?php echo '.sprintf($f,'$_ctx->attachments->type').'; ?>';
+		return '<?php echo '.sprintf($f,'$attach_f->type').'; ?>';
 	}
 	
@@ -140,5 +136,5 @@
 	{
 		$f = $GLOBALS['core']->tpl->getFilters($attr);
-		return '<?php echo '.sprintf($f,'$_ctx->attachments->media_type').'; ?>';
+		return '<?php echo '.sprintf($f,'$attach_f->media_type').'; ?>';
 	}
 	
@@ -149,5 +145,5 @@
 	{
 		$f = $GLOBALS['core']->tpl->getFilters($attr);
-		return '<?php echo '.sprintf($f,'$_ctx->attachments->basename').'; ?>';
+		return '<?php echo '.sprintf($f,'$attach_f->basename').'; ?>';
 	}
 	
@@ -162,7 +158,7 @@
 		$f = $GLOBALS['core']->tpl->getFilters($attr);
 		if (!empty($attr['full'])) {
-			return '<?php echo '.sprintf($f,'$_ctx->attachments->size').'; ?>';
-		}
-		return '<?php echo '.sprintf($f,'files::size($_ctx->attachments->size)').'; ?>';
+			return '<?php echo '.sprintf($f,'$attach_f->size').'; ?>';
+		}
+		return '<?php echo '.sprintf($f,'files::size($attach_f->size)').'; ?>';
 	}
 	
@@ -173,5 +169,5 @@
 	{
 		$f = $GLOBALS['core']->tpl->getFilters($attr);
-		return '<?php echo '.sprintf($f,'$_ctx->attachments->media_title').'; ?>';
+		return '<?php echo '.sprintf($f,'$attach_f->media_title').'; ?>';
 	}
 	
@@ -184,6 +180,6 @@
 		return
 		'<?php '.
-		'if (isset($_ctx->attachments->media_thumb[\'sq\'])) {'.
-			'echo '.sprintf($f,'$_ctx->attachments->media_thumb[\'sq\']').';'.
+		'if (isset($attach_f->media_thumb[\'sq\'])) {'.
+			'echo '.sprintf($f,'$attach_f->media_thumb[\'sq\']').';'.
 		'}'.
 		'?>';
@@ -196,5 +192,5 @@
 	{
 		$f = $GLOBALS['core']->tpl->getFilters($attr);
-		return '<?php echo '.sprintf($f,'$_ctx->attachments->file_url').'; ?>';
+		return '<?php echo '.sprintf($f,'$attach_f->file_url').'; ?>';
 	}
 	
Index: plugins/blogroll/_admin.php
===================================================================
--- plugins/blogroll/_admin.php	(revision 1179)
+++ plugins/blogroll/_admin.php	(revision 324)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/blogroll/_define.php
===================================================================
--- plugins/blogroll/_define.php	(revision 1179)
+++ plugins/blogroll/_define.php	(revision 965)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -16,5 +16,5 @@
 	/* Description*/		"Manage your blogroll",
 	/* Author */			"Olivier Meunier",
-	/* Version */			'1.3.1',
+	/* Version */			'1.3',
 	array(
 		'permissions' =>	'blogroll'
Index: plugins/blogroll/_install.php
===================================================================
--- plugins/blogroll/_install.php	(revision 1179)
+++ plugins/blogroll/_install.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/blogroll/_prepend.php
===================================================================
--- plugins/blogroll/_prepend.php	(revision 1179)
+++ plugins/blogroll/_prepend.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/blogroll/_public.php
===================================================================
--- plugins/blogroll/_public.php	(revision 1179)
+++ plugins/blogroll/_public.php	(revision 1063)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/blogroll/_widgets.php
===================================================================
--- plugins/blogroll/_widgets.php	(revision 1179)
+++ plugins/blogroll/_widgets.php	(revision 1063)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: lugins/blogroll/blogroll.js
===================================================================
--- plugins/blogroll/blogroll.js	(revision 1131)
+++ 	(revision )
@@ -1,18 +1,0 @@
-$(function() {
-	$("#links-list").sortable({'cursor':'move'});
-	$("#links-list tr").hover(function () {
-		$(this).css({'cursor':'move'});
-	}, function () {
-		$(this).css({'cursor':'auto'});
-	});
-	$('#links-form').submit(function() {
-		var order=[];
-		$("#links-list tr td input.position").each(function() {
-			order.push(this.name.replace(/^order\[([^\]]+)\]$/,'$1'));
-		});
-		$("input[name=links_order]")[0].value = order.join(',');
-		return true;
-	});
-	$("#links-list tr td input.position").hide();
-	$("#links-list tr td.handle").addClass('handler');
-});
Index: plugins/blogroll/class.dc.blogroll.php
===================================================================
--- plugins/blogroll/class.dc.blogroll.php	(revision 1179)
+++ plugins/blogroll/class.dc.blogroll.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/blogroll/class.dc.importblogroll.php
===================================================================
--- plugins/blogroll/class.dc.importblogroll.php	(revision 1179)
+++ plugins/blogroll/class.dc.importblogroll.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/blogroll/edit.php
===================================================================
--- plugins/blogroll/edit.php	(revision 1179)
+++ plugins/blogroll/edit.php	(revision 907)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/blogroll/index.php
===================================================================
--- plugins/blogroll/index.php	(revision 1179)
+++ plugins/blogroll/index.php	(revision 987)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -164,13 +164,51 @@
 <head>
   <title><?php echo __('Blogroll'); ?></title>
+  <?php echo dcPage::jsToolMan(); ?>
   <?php echo dcPage::jsConfirmClose('links-form','add-link-form','add-category-form'); ?>
   <?php 
-	$core->auth->user_prefs->addWorkspace('accessibility');
-	if (!$core->auth->user_prefs->accessibility->nodragdrop) {
-	echo
-		dcPage::jsLoad('js/jquery/jquery-ui.custom.js').
-		dcPage::jsLoad('index.php?pf=blogroll/blogroll.js');
-	}
+	$core->auth->user_prefs->addWorkspace('accessibility'); 
+	$user_dm_nodragdrop = $core->auth->user_prefs->accessibility->nodragdrop;
   ?>
+  <?php if (!$user_dm_nodragdrop) : ?>
+  <script type="text/javascript">
+  //<![CDATA[
+  
+  var dragsort = ToolMan.dragsort();
+  $(function() {
+  	dragsort.makeTableSortable($("#links-list").get(0),
+  	dotclear.sortable.setHandle,dotclear.sortable.saveOrder);
+	
+	$('.checkboxes-helpers').each(function() {
+		dotclear.checkboxesHelpers(this);
+	});
+  });
+  
+  dotclear.sortable = {
+	  setHandle: function(item) {
+		var handle = $(item).find('td.handle').get(0);
+		while (handle.firstChild) {
+			handle.removeChild(handle.firstChild);
+		}
+		
+		item.toolManDragGroup.setHandle(handle);
+		handle.className = handle.className+' handler';
+	  },
+	  
+	  saveOrder: function(item) {
+		var group = item.toolManDragGroup;
+		var order = document.getElementById('links_order');
+		group.register('dragend', function() {
+			order.value = '';
+			items = item.parentNode.getElementsByTagName('tr');
+			
+			for (var i=0; i<items.length; i++) {
+				order.value += items[i].id.substr(2)+',';
+			}
+		});
+	  }
+  };
+  //]]>
+  </script>
+  <?php endif; ?>
   <?php echo dcPage::jsPageTabs($default_tab); ?>
 </head>
@@ -220,5 +258,5 @@
 	echo
 	'<tr class="line" id="l_'.$rs->link_id.'">'.
-	'<td class="handle minimal">'.form::field(array('order['.$rs->link_id.']'),2,5,$position,'position','',false,'title="'.__('position').'"').'</td>'.
+	'<td class="handle minimal">'.form::field(array('order['.$rs->link_id.']'),2,5,$position,'','',false,'title="'.__('position').'"').'</td>'.
 	'<td class="minimal">'.form::checkbox(array('remove[]'),$rs->link_id,'','','',false,'title="'.__('select this link').'"').'</td>';
 	
Index: plugins/blogroll/locales/en/resources.php
===================================================================
--- plugins/blogroll/locales/en/resources.php	(revision 1179)
+++ plugins/blogroll/locales/en/resources.php	(revision 215)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/blogroll/locales/fr/resources.php
===================================================================
--- plugins/blogroll/locales/fr/resources.php	(revision 1179)
+++ plugins/blogroll/locales/fr/resources.php	(revision 215)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/blowupConfig/_admin.php
===================================================================
--- plugins/blowupConfig/_admin.php	(revision 1179)
+++ plugins/blowupConfig/_admin.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/blowupConfig/_define.php
===================================================================
--- plugins/blowupConfig/_define.php	(revision 1179)
+++ plugins/blowupConfig/_define.php	(revision 967)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/blowupConfig/_install.php
===================================================================
--- plugins/blowupConfig/_install.php	(revision 1179)
+++ plugins/blowupConfig/_install.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of blowupConfig, a plugin for Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/blowupConfig/_public.php
===================================================================
--- plugins/blowupConfig/_public.php	(revision 1179)
+++ plugins/blowupConfig/_public.php	(revision 295)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/blowupConfig/index.php
===================================================================
--- plugins/blowupConfig/index.php	(revision 1179)
+++ plugins/blowupConfig/index.php	(revision 994)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/blowupConfig/lib/class.blowup.config.php
===================================================================
--- plugins/blowupConfig/lib/class.blowup.config.php	(revision 1179)
+++ plugins/blowupConfig/lib/class.blowup.config.php	(revision 696)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/fairTrackbacks/_define.php
===================================================================
--- plugins/fairTrackbacks/_define.php	(revision 1179)
+++ plugins/fairTrackbacks/_define.php	(revision 965)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/fairTrackbacks/_prepend.php
===================================================================
--- plugins/fairTrackbacks/_prepend.php	(revision 1179)
+++ plugins/fairTrackbacks/_prepend.php	(revision 857)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/fairTrackbacks/_public.php
===================================================================
--- plugins/fairTrackbacks/_public.php	(revision 1179)
+++ plugins/fairTrackbacks/_public.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/fairTrackbacks/class.dc.filter.fairtrackbacks.php
===================================================================
--- plugins/fairTrackbacks/class.dc.filter.fairtrackbacks.php	(revision 1179)
+++ plugins/fairTrackbacks/class.dc.filter.fairtrackbacks.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/importExport/inc/class.dc.import.wp.php
===================================================================
--- plugins/importExport/inc/class.dc.import.wp.php	(revision 1185)
+++ plugins/importExport/inc/class.dc.import.wp.php	(revision 840)
@@ -671,12 +671,9 @@
 		$this->importTags($rs->ID,$cur->post_id,$db);
 		
-		if (isset($old_cat_ids))
-		{
-			if (!$old_cat_ids->isEmpty() && $this->vars['cat_as_tags']) 
-			{
-				$old_cat_ids->moveStart();
-				while ($old_cat_ids->fetch()) {
-					$this->core->meta->setPostMeta($cur->post_id,'tag',$this->cleanStr($this->vars['cat_tags_prefix'].$old_cat_ids->name));
-				}
+		if (!$old_cat_ids->isEmpty() && $this->vars['cat_as_tags']) 
+		{
+			$old_cat_ids->moveStart();
+			while ($old_cat_ids->fetch()) {
+				$this->core->meta->setPostMeta($cur->post_id,'tag',$this->cleanStr($this->vars['cat_tags_prefix'].$old_cat_ids->name));
 			}
 		}
Index: plugins/maintenance/_admin.php
===================================================================
--- plugins/maintenance/_admin.php	(revision 1179)
+++ plugins/maintenance/_admin.php	(revision 324)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/maintenance/_define.php
===================================================================
--- plugins/maintenance/_define.php	(revision 1179)
+++ plugins/maintenance/_define.php	(revision 967)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/maintenance/index.php
===================================================================
--- plugins/maintenance/index.php	(revision 1179)
+++ plugins/maintenance/index.php	(revision 907)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/maintenance/locales/en/resources.php
===================================================================
--- plugins/maintenance/locales/en/resources.php	(revision 1179)
+++ plugins/maintenance/locales/en/resources.php	(revision 186)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/maintenance/locales/fr/resources.php
===================================================================
--- plugins/maintenance/locales/fr/resources.php	(revision 1179)
+++ plugins/maintenance/locales/fr/resources.php	(revision 186)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/pages/_admin.php
===================================================================
--- plugins/pages/_admin.php	(revision 1179)
+++ plugins/pages/_admin.php	(revision 324)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/pages/_define.php
===================================================================
--- plugins/pages/_define.php	(revision 1179)
+++ plugins/pages/_define.php	(revision 965)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/pages/_prepend.php
===================================================================
--- plugins/pages/_prepend.php	(revision 1179)
+++ plugins/pages/_prepend.php	(revision 857)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/pages/_public.php
===================================================================
--- plugins/pages/_public.php	(revision 1179)
+++ plugins/pages/_public.php	(revision 1063)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/pages/_widgets.php
===================================================================
--- plugins/pages/_widgets.php	(revision 1179)
+++ plugins/pages/_widgets.php	(revision 1063)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/pages/index.php
===================================================================
--- plugins/pages/index.php	(revision 1179)
+++ plugins/pages/index.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/pages/list.php
===================================================================
--- plugins/pages/list.php	(revision 1179)
+++ plugins/pages/list.php	(revision 911)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/pages/locales/en/resources.php
===================================================================
--- plugins/pages/locales/en/resources.php	(revision 1179)
+++ plugins/pages/locales/en/resources.php	(revision 198)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/pages/locales/fr/resources.php
===================================================================
--- plugins/pages/locales/fr/resources.php	(revision 1179)
+++ plugins/pages/locales/fr/resources.php	(revision 198)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/pages/page.php
===================================================================
--- plugins/pages/page.php	(revision 1215)
+++ plugins/pages/page.php	(revision 1068)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -431,10 +431,7 @@
 		http::browserUID(DC_MASTER_KEY.$core->auth->userID().$core->auth->getInfo('user_pwd')).
 		'/'.$post->post_url);
-		echo '<a id="post-preview" href="'.$preview_url.'" class="button" accesskey="p">'.__('Preview').' (p)'.'</a>';
-	} else {
-		echo
-		'<a id="post-cancel" href="index.php" class="button" accesskey="c">'.__('Cancel').' (c)</a>';
-	}
-
+		echo '<a id="post-preview" href="'.$preview_url.'" class="button">'.__('Preview').'</a>';
+	}
+	
 	echo
 	($can_delete ? '<input type="submit" class="delete" value="'.__('Delete').'" name="delete" />' : '').
Index: plugins/pings/_admin.php
===================================================================
--- plugins/pings/_admin.php	(revision 1179)
+++ plugins/pings/_admin.php	(revision 324)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/pings/_define.php
===================================================================
--- plugins/pings/_define.php	(revision 1179)
+++ plugins/pings/_define.php	(revision 967)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/pings/index.php
===================================================================
--- plugins/pings/index.php	(revision 1179)
+++ plugins/pings/index.php	(revision 907)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/pings/lib.pings.php
===================================================================
--- plugins/pings/lib.pings.php	(revision 1179)
+++ plugins/pings/lib.pings.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/simpleMenu/_admin.php
===================================================================
--- plugins/simpleMenu/_admin.php	(revision 1179)
+++ plugins/simpleMenu/_admin.php	(revision 683)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/simpleMenu/_define.php
===================================================================
--- plugins/simpleMenu/_define.php	(revision 1179)
+++ plugins/simpleMenu/_define.php	(revision 967)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -16,5 +16,5 @@
 	/* Description*/		"Simple menu for Dotclear",
 	/* Author */			"Franck Paul",
-	/* Version */			'1.1.1',
+	/* Version */			'1.1',
 	array(
 		'permissions' =>	'admin'
Index: plugins/simpleMenu/_install.php
===================================================================
--- plugins/simpleMenu/_install.php	(revision 1179)
+++ plugins/simpleMenu/_install.php	(revision 776)
@@ -4,5 +4,5 @@
 # This file is part of simpleMenu, a plugin for Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/simpleMenu/_public.php
===================================================================
--- plugins/simpleMenu/_public.php	(revision 1179)
+++ plugins/simpleMenu/_public.php	(revision 1063)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/simpleMenu/_widgets.php
===================================================================
--- plugins/simpleMenu/_widgets.php	(revision 1179)
+++ plugins/simpleMenu/_widgets.php	(revision 1063)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/simpleMenu/index.php
===================================================================
--- plugins/simpleMenu/index.php	(revision 1179)
+++ plugins/simpleMenu/index.php	(revision 1011)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -354,12 +354,55 @@
 <head>
 	<title><?php echo $page_title; ?></title>
+	<?php
+		echo
+			dcPage::jsToolMan().
+			# --BEHAVIOR-- adminPageHeaders
+			$core->callBehavior('adminPageHeaders');
+	?>
 	<?php 
-		$core->auth->user_prefs->addWorkspace('accessibility');
-		if (!$core->auth->user_prefs->accessibility->nodragdrop) {
-			echo
-				dcPage::jsLoad('js/jquery/jquery-ui.custom.js').
-				dcPage::jsLoad('index.php?pf=simpleMenu/simplemenu.js');
-		}
+		$core->auth->user_prefs->addWorkspace('accessibility'); 
+		$user_dm_nodragdrop = $core->auth->user_prefs->accessibility->nodragdrop;
 	?>
+	<?php if (!$user_dm_nodragdrop) : ?>
+	<script type="text/javascript">
+	//<![CDATA[
+
+	var dragsort = ToolMan.dragsort();
+	$(function() {
+		dragsort.makeTableSortable($("#menuitemslist").get(0),
+		dotclear.sortable.setHandle,dotclear.sortable.saveOrder);
+
+		$('.checkboxes-helpers').each(function() {
+			dotclear.checkboxesHelpers(this);
+		});
+	});
+
+	dotclear.sortable = {
+		setHandle: function(item) {
+			var handle = $(item).find('td.handle').get(0);
+			while (handle.firstChild) {
+				handle.removeChild(handle.firstChild);
+			}
+
+			item.toolManDragGroup.setHandle(handle);
+			handle.className = handle.className+' handler';
+		},
+
+		saveOrder: function(item) {
+			var group = item.toolManDragGroup;
+			var order = document.getElementById('im_order');
+			group.register('dragend', function() {
+				order.value = '';
+				items = item.parentNode.getElementsByTagName('tr');
+
+				for (var i=0; i<items.length; i++) {
+					order.value += items[i].id.substr(2)+',';
+				}
+			});
+		}
+	};
+	//]]>
+	</script>
+	<?php endif; ?>
 </head>
 
Index: plugins/simpleMenu/locales/en/resources.php
===================================================================
--- plugins/simpleMenu/locales/en/resources.php	(revision 1179)
+++ plugins/simpleMenu/locales/en/resources.php	(revision 553)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/simpleMenu/locales/fr/resources.php
===================================================================
--- plugins/simpleMenu/locales/fr/resources.php	(revision 1179)
+++ plugins/simpleMenu/locales/fr/resources.php	(revision 553)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: lugins/simpleMenu/simplemenu.js
===================================================================
--- plugins/simpleMenu/simplemenu.js	(revision 1132)
+++ 	(revision )
@@ -1,18 +1,0 @@
-$(function() {
-	$("#menuitemslist").sortable({'cursor':'move'});
-	$("#menuitemslist tr").hover(function () {
-		$(this).css({'cursor':'move'});
-	}, function () {
-		$(this).css({'cursor':'auto'});
-	});
-	$('#menuitems').submit(function() {
-		var order=[];
-		$("#menuitemslist tr td input.position").each(function() {
-			order.push(this.name.replace(/^order\[([^\]]+)\]$/,'$1'));
-		});
-		$("input[name=im_order]")[0].value = order.join(',');
-		return true;
-	});
-	$("#menuitemslist tr td input.position").hide();
-	$("#menuitemslist tr td.handle").addClass('handler');
-});
Index: plugins/tags/_admin.php
===================================================================
--- plugins/tags/_admin.php	(revision 1179)
+++ plugins/tags/_admin.php	(revision 1097)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/tags/_define.php
===================================================================
--- plugins/tags/_define.php	(revision 1179)
+++ plugins/tags/_define.php	(revision 965)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/tags/_prepend.php
===================================================================
--- plugins/tags/_prepend.php	(revision 1179)
+++ plugins/tags/_prepend.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/tags/_public.php
===================================================================
--- plugins/tags/_public.php	(revision 1179)
+++ plugins/tags/_public.php	(revision 1108)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/tags/_widgets.php
===================================================================
--- plugins/tags/_widgets.php	(revision 1179)
+++ plugins/tags/_widgets.php	(revision 1063)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/tags/_xmlrpc.php
===================================================================
--- plugins/tags/_xmlrpc.php	(revision 1179)
+++ plugins/tags/_xmlrpc.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/tags/index.php
===================================================================
--- plugins/tags/index.php	(revision 1179)
+++ plugins/tags/index.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/tags/tag_posts.php
===================================================================
--- plugins/tags/tag_posts.php	(revision 1179)
+++ plugins/tags/tag_posts.php	(revision 907)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/tags/tags.php
===================================================================
--- plugins/tags/tags.php	(revision 1179)
+++ plugins/tags/tags.php	(revision 907)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/themeEditor/_admin.php
===================================================================
--- plugins/themeEditor/_admin.php	(revision 1179)
+++ plugins/themeEditor/_admin.php	(revision 998)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/themeEditor/_define.php
===================================================================
--- plugins/themeEditor/_define.php	(revision 1179)
+++ plugins/themeEditor/_define.php	(revision 965)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/themeEditor/class.themeEditor.php
===================================================================
--- plugins/themeEditor/class.themeEditor.php	(revision 1179)
+++ plugins/themeEditor/class.themeEditor.php	(revision 1037)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
@@ -243,7 +243,7 @@
 		foreach ($langs as $k => $v) {
 			if ($this->parent_theme) {
-				$this->po = array_merge($this->po,$this->getFilesInDir($this->parent_theme.'/locales/'.$v,'po',$v.'/'));
-			}
-			$this->po = array_merge($this->po,$this->getFilesInDir($this->user_theme.'/locales/'.$v,'po',$v.'/'));
+				$this->po = array_merge($this->po,$this->getFilesInDir($this->parent_theme.'/locales/'.$v,'po',$v.'/','main.po'));
+			}
+			$this->po = array_merge($this->po,$this->getFilesInDir($this->user_theme.'/locales/'.$v,'po',$v.'/','main.po'));
 		}
 	}
Index: plugins/themeEditor/index.php
===================================================================
--- plugins/themeEditor/index.php	(revision 1179)
+++ plugins/themeEditor/index.php	(revision 1036)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/userPref/_admin.php
===================================================================
--- plugins/userPref/_admin.php	(revision 1179)
+++ plugins/userPref/_admin.php	(revision 3)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/userPref/_define.php
===================================================================
--- plugins/userPref/_define.php	(revision 1179)
+++ plugins/userPref/_define.php	(revision 967)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/userPref/index.php
===================================================================
--- plugins/userPref/index.php	(revision 1179)
+++ plugins/userPref/index.php	(revision 1109)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/widgets/_admin.php
===================================================================
--- plugins/widgets/_admin.php	(revision 1179)
+++ plugins/widgets/_admin.php	(revision 324)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/widgets/_default_widgets.php
===================================================================
--- plugins/widgets/_default_widgets.php	(revision 1179)
+++ plugins/widgets/_default_widgets.php	(revision 1063)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/widgets/_define.php
===================================================================
--- plugins/widgets/_define.php	(revision 1179)
+++ plugins/widgets/_define.php	(revision 965)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/widgets/_install.php
===================================================================
--- plugins/widgets/_install.php	(revision 1179)
+++ plugins/widgets/_install.php	(revision 665)
@@ -4,5 +4,5 @@
 # This file is part of widgets, a plugin for Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/widgets/_public.php
===================================================================
--- plugins/widgets/_public.php	(revision 1179)
+++ plugins/widgets/_public.php	(revision 936)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/widgets/_widgets_functions.php
===================================================================
--- plugins/widgets/_widgets_functions.php	(revision 1179)
+++ plugins/widgets/_widgets_functions.php	(revision 1063)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/widgets/class.widgets.php
===================================================================
--- plugins/widgets/class.widgets.php	(revision 1179)
+++ plugins/widgets/class.widgets.php	(revision 954)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: plugins/widgets/index.php
===================================================================
--- plugins/widgets/index.php	(revision 1179)
+++ plugins/widgets/index.php	(revision 954)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: themes/blueSilence/_define.php
===================================================================
--- themes/blueSilence/_define.php	(revision 1179)
+++ themes/blueSilence/_define.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: themes/customCSS/_config.php
===================================================================
--- themes/customCSS/_config.php	(revision 1179)
+++ themes/customCSS/_config.php	(revision 907)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: themes/customCSS/_define.php
===================================================================
--- themes/customCSS/_define.php	(revision 1179)
+++ themes/customCSS/_define.php	(revision 967)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: themes/customCSS/_public.php
===================================================================
--- themes/customCSS/_public.php	(revision 1179)
+++ themes/customCSS/_public.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: themes/customCSS/locales/fr/main.po
===================================================================
--- themes/customCSS/locales/fr/main.po	(revision 1179)
+++ themes/customCSS/locales/fr/main.po	(revision 724)
@@ -3,5 +3,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: themes/default/_define.php
===================================================================
--- themes/default/_define.php	(revision 1179)
+++ themes/default/_define.php	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: themes/default/print.css
===================================================================
--- themes/default/print.css	(revision 1179)
+++ themes/default/print.css	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: themes/default/style.css
===================================================================
--- themes/default/style.css	(revision 1179)
+++ themes/default/style.css	(revision 270)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: themes/ductile/_define.php
===================================================================
--- themes/ductile/_define.php	(revision 1134)
+++ themes/ductile/_define.php	(revision 967)
@@ -15,5 +15,5 @@
 	/* Description*/		"Mediaqueries compliant elegant theme",
 	/* Author */			"Dotclear Team",
-	/* Version */			'1.3.1',
+	/* Version */			'1.3',
 	/* Properties */		array(
 								'standalone_config' => true
Index: themes/ductile/_prepend.php
===================================================================
--- themes/ductile/_prepend.php	(revision 1133)
+++ themes/ductile/_prepend.php	(revision 683)
@@ -20,37 +20,50 @@
 	{
 		global $core;
-		if ($core->blog->settings->system->theme != 'ductile') { return; }
+		
+		echo "\n".'<!-- Header directives for Ductile configuration -->'."\n";
+		echo dcPage::jsToolMan();
 
-		echo "\n".'<!-- Header directives for Ductile configuration -->'."\n";
-		$core->auth->user_prefs->addWorkspace('accessibility');
-		if (!$core->auth->user_prefs->accessibility->nodragdrop) {
-			echo
-				dcPage::jsLoad('js/jquery/jquery-ui.custom.js');
-				echo <<<EOT
+		// Need some more Js
+		$core->auth->user_prefs->addWorkspace('accessibility'); 
+		$user_dm_nodragdrop = $core->auth->user_prefs->accessibility->nodragdrop;
+		if (!$user_dm_nodragdrop) {
+			echo <<<EOT
 <script type="text/javascript">
 //<![CDATA[
+
+var dragsort = ToolMan.dragsort();
 $(function() {
-	$("#stickerslist").sortable({'cursor':'move'});
-	$("#stickerslist tr").hover(function () {
-		$(this).css({'cursor':'move'});
-	}, function () {
-		$(this).css({'cursor':'auto'});
-	});
-	$('#theme_config').submit(function() {
-		var order=[];
-		$("#stickerslist tr td input.position").each(function() {
-			order.push(this.name.replace(/^order\[([^\]]+)\]$/,'$1'));
+	dragsort.makeTableSortable($("#stickerslist").get(0),
+	dotclear.sortable.setHandle,dotclear.sortable.saveOrder);
+});
+
+dotclear.sortable = {
+	setHandle: function(item) {
+		var handle = $(item).find('td.handle').get(0);
+		while (handle.firstChild) {
+			handle.removeChild(handle.firstChild);
+		}
+
+		item.toolManDragGroup.setHandle(handle);
+		handle.className = handle.className+' handler';
+	},
+
+	saveOrder: function(item) {
+		var group = item.toolManDragGroup;
+		var order = document.getElementById('ds_order');
+		group.register('dragend', function() {
+			order.value = '';
+			items = item.parentNode.getElementsByTagName('tr');
+
+			for (var i=0; i<items.length; i++) {
+				order.value += items[i].id.substr(2)+',';
+			}
 		});
-		$("input[name=ds_order]")[0].value = order.join(',');
-		return true;
-	});
-	$("#stickerslist tr td input.position").hide();
-	$("#stickerslist tr td.handle").addClass('handler');
-});
+	}
+};
 //]]>
 </script>
 EOT;
 		}
-
 	}
 }
Index: themes/ductile/locales/en/resources.php
===================================================================
--- themes/ductile/locales/en/resources.php	(revision 1179)
+++ themes/ductile/locales/en/resources.php	(revision 628)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: themes/ductile/locales/fr/resources.php
===================================================================
--- themes/ductile/locales/fr/resources.php	(revision 1179)
+++ themes/ductile/locales/fr/resources.php	(revision 628)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
