mirror of
				https://github.com/telekom-security/tpotce.git
				synced 2025-10-31 04:22:52 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			861 lines
		
	
	
	
		
			26 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			861 lines
		
	
	
	
		
			26 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| /**
 | |
|  * ownCloud
 | |
|  *
 | |
|  * @author Bartek Przybylski, Christopher Schäpers, Thomas Tanghus
 | |
|  * @copyright Copyright (c) 2012 Bartek Przybylski bartek@alefzero.eu
 | |
|  *
 | |
|  * This library is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
 | |
|  * License as published by the Free Software Foundation; either
 | |
|  * version 3 of the License, or any later version.
 | |
|  *
 | |
|  * This library is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU Affero General Public
 | |
|  * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| /* global alert */
 | |
| 
 | |
| /**
 | |
|  * this class to ease the usage of jquery dialogs
 | |
|  * @lends OC.dialogs
 | |
|  */
 | |
| var OCdialogs = {
 | |
| 	// dialog button types
 | |
| 	YES_NO_BUTTONS:		70,
 | |
| 	OK_BUTTONS:		71,
 | |
| 	// used to name each dialog
 | |
| 	dialogsCounter: 0,
 | |
| 	/**
 | |
| 	* displays alert dialog
 | |
| 	* @param text content of dialog
 | |
| 	* @param title dialog title
 | |
| 	* @param callback which will be triggered when user presses OK
 | |
| 	* @param modal make the dialog modal
 | |
| 	*/
 | |
| 	alert:function(text, title, callback, modal) {
 | |
| 		this.message(
 | |
| 			text,
 | |
| 			title,
 | |
| 			'alert',
 | |
| 			OCdialogs.OK_BUTTON,
 | |
| 			callback,
 | |
| 			modal
 | |
| 		);
 | |
| 	},
 | |
| 	/**
 | |
| 	* displays info dialog
 | |
| 	* @param text content of dialog
 | |
| 	* @param title dialog title
 | |
| 	* @param callback which will be triggered when user presses OK
 | |
| 	* @param modal make the dialog modal
 | |
| 	*/
 | |
| 	info:function(text, title, callback, modal) {
 | |
| 		this.message(text, title, 'info', OCdialogs.OK_BUTTON, callback, modal);
 | |
| 	},
 | |
| 	/**
 | |
| 	* displays confirmation dialog
 | |
| 	* @param text content of dialog
 | |
| 	* @param title dialog title
 | |
| 	* @param callback which will be triggered when user presses YES or NO
 | |
| 	*        (true or false would be passed to callback respectively)
 | |
| 	* @param modal make the dialog modal
 | |
| 	*/
 | |
| 	confirm:function(text, title, callback, modal) {
 | |
| 		return this.message(
 | |
| 			text,
 | |
| 			title,
 | |
| 			'notice',
 | |
| 			OCdialogs.YES_NO_BUTTONS,
 | |
| 			callback,
 | |
| 			modal
 | |
| 		);
 | |
| 	},
 | |
| 	/**
 | |
| 	 * displays prompt dialog
 | |
| 	 * @param text content of dialog
 | |
| 	 * @param title dialog title
 | |
| 	 * @param callback which will be triggered when user presses YES or NO
 | |
| 	 *        (true or false would be passed to callback respectively)
 | |
| 	 * @param modal make the dialog modal
 | |
| 	 * @param name name of the input field
 | |
| 	 * @param password whether the input should be a password input
 | |
| 	 */
 | |
| 	prompt: function (text, title, callback, modal, name, password) {
 | |
| 		return $.when(this._getMessageTemplate()).then(function ($tmpl) {
 | |
| 			var dialogName = 'oc-dialog-' + OCdialogs.dialogsCounter + '-content';
 | |
| 			var dialogId = '#' + dialogName;
 | |
| 			var $dlg = $tmpl.octemplate({
 | |
| 				dialog_name: dialogName,
 | |
| 				title      : title,
 | |
| 				message    : text,
 | |
| 				type       : 'notice'
 | |
| 			});
 | |
| 			var input = $('<input/>');
 | |
| 			input.attr('type', password ? 'password' : 'text').attr('id', dialogName + '-input');
 | |
| 			var label = $('<label/>').attr('for', dialogName + '-input').text(name + ': ');
 | |
| 			$dlg.append(label);
 | |
| 			$dlg.append(input);
 | |
| 			if (modal === undefined) {
 | |
| 				modal = false;
 | |
| 			}
 | |
| 			$('body').append($dlg);
 | |
| 			var buttonlist = [{
 | |
| 					text : t('core', 'No'),
 | |
| 					click: function () {
 | |
| 						if (callback !== undefined) {
 | |
| 							callback(false, input.val());
 | |
| 						}
 | |
| 						$(dialogId).ocdialog('close');
 | |
| 					}
 | |
| 				}, {
 | |
| 					text         : t('core', 'Yes'),
 | |
| 					click        : function () {
 | |
| 						if (callback !== undefined) {
 | |
| 							callback(true, input.val());
 | |
| 						}
 | |
| 						$(dialogId).ocdialog('close');
 | |
| 					},
 | |
| 					defaultButton: true
 | |
| 				}
 | |
| 			];
 | |
| 
 | |
| 			$(dialogId).ocdialog({
 | |
| 				closeOnEscape: true,
 | |
| 				modal        : modal,
 | |
| 				buttons      : buttonlist
 | |
| 			});
 | |
| 			OCdialogs.dialogsCounter++;
 | |
| 		});
 | |
| 	},
 | |
| 	/**
 | |
| 	 * show a file picker to pick a file from
 | |
| 	 * @param title dialog title
 | |
| 	 * @param callback which will be triggered when user presses Choose
 | |
| 	 * @param multiselect whether it should be possible to select multiple files
 | |
| 	 * @param mimetypeFilter mimetype to filter by - directories will always be included
 | |
| 	 * @param modal make the dialog modal
 | |
| 	*/
 | |
| 	filepicker:function(title, callback, multiselect, mimetypeFilter, modal) {
 | |
| 		var self = this;
 | |
| 		// avoid opening the picker twice
 | |
| 		if (this.filepicker.loading) {
 | |
| 			return;
 | |
| 		}
 | |
| 		this.filepicker.loading = true;
 | |
| 		$.when(this._getFilePickerTemplate()).then(function($tmpl) {
 | |
| 			self.filepicker.loading = false;
 | |
| 			var dialogName = 'oc-dialog-filepicker-content';
 | |
| 			if(self.$filePicker) {
 | |
| 				self.$filePicker.ocdialog('close');
 | |
| 			}
 | |
| 			self.$filePicker = $tmpl.octemplate({
 | |
| 				dialog_name: dialogName,
 | |
| 				title: title
 | |
| 			}).data('path', '').data('multiselect', multiselect).data('mimetype', mimetypeFilter);
 | |
| 
 | |
| 			if (modal === undefined) {
 | |
| 				modal = false;
 | |
| 			}
 | |
| 			if (multiselect === undefined) {
 | |
| 				multiselect = false;
 | |
| 			}
 | |
| 			if (mimetypeFilter === undefined) {
 | |
| 				mimetypeFilter = '';
 | |
| 			}
 | |
| 
 | |
| 			$('body').append(self.$filePicker);
 | |
| 
 | |
| 			self.$filePicker.ready(function() {
 | |
| 				self.$filelist = self.$filePicker.find('.filelist');
 | |
| 				self.$dirTree = self.$filePicker.find('.dirtree');
 | |
| 				self.$dirTree.on('click', 'span:not(:last-child)', self, self._handleTreeListSelect);
 | |
| 				self.$filelist.on('click', 'li', function(event) {
 | |
| 					self._handlePickerClick(event, $(this));
 | |
| 				});
 | |
| 				self._fillFilePicker('');
 | |
| 			});
 | |
| 
 | |
| 			// build buttons
 | |
| 			var functionToCall = function() {
 | |
| 				if (callback !== undefined) {
 | |
| 					var datapath;
 | |
| 					if (multiselect === true) {
 | |
| 						datapath = [];
 | |
| 						self.$filelist.find('.filepicker_element_selected .filename').each(function(index, element) {
 | |
| 							datapath.push(self.$filePicker.data('path') + '/' + $(element).text());
 | |
| 						});
 | |
| 					} else {
 | |
| 						datapath = self.$filePicker.data('path');
 | |
| 						datapath += '/' + self.$filelist.find('.filepicker_element_selected .filename').text();
 | |
| 					}
 | |
| 					callback(datapath);
 | |
| 					self.$filePicker.ocdialog('close');
 | |
| 				}
 | |
| 			};
 | |
| 			var buttonlist = [{
 | |
| 				text: t('core', 'Choose'),
 | |
| 				click: functionToCall,
 | |
| 				defaultButton: true
 | |
| 			}];
 | |
| 
 | |
| 			self.$filePicker.ocdialog({
 | |
| 				closeOnEscape: true,
 | |
| 				// max-width of 600
 | |
| 				width: Math.min((4/5)*$(document).width(), 600),
 | |
| 				height: 420,
 | |
| 				modal: modal,
 | |
| 				buttons: buttonlist,
 | |
| 				close: function() {
 | |
| 					try {
 | |
| 						$(this).ocdialog('destroy').remove();
 | |
| 					} catch(e) {}
 | |
| 					self.$filePicker = null;
 | |
| 				}
 | |
| 			});
 | |
| 
 | |
| 			// We can access primary class only from oc-dialog.
 | |
| 			// Hence this is one of the approach to get the choose button.
 | |
| 			var getOcDialog = self.$filePicker.closest('.oc-dialog');
 | |
| 			var buttonEnableDisable = getOcDialog.find('.primary');
 | |
| 			buttonEnableDisable.prop("disabled", "true");
 | |
| 
 | |
| 			if (!OC.Util.hasSVGSupport()) {
 | |
| 				OC.Util.replaceSVG(self.$filePicker.parent());
 | |
| 			}
 | |
| 		})
 | |
| 		.fail(function(status, error) {
 | |
| 			// If the method is called while navigating away
 | |
| 			// from the page, it is probably not needed ;)
 | |
| 			self.filepicker.loading = false;
 | |
| 			if(status !== 0) {
 | |
| 				alert(t('core', 'Error loading file picker template: {error}', {error: error}));
 | |
| 			}
 | |
| 		});
 | |
| 	},
 | |
| 	/**
 | |
| 	 * Displays raw dialog
 | |
| 	 * You better use a wrapper instead ...
 | |
| 	*/
 | |
| 	message:function(content, title, dialogType, buttons, callback, modal, cssClass) {
 | |
| 		return $.when(this._getMessageTemplate()).then(function($tmpl) {
 | |
| 			var dialogName = 'oc-dialog-' + OCdialogs.dialogsCounter + '-content';
 | |
| 			var dialogId = '#' + dialogName;
 | |
| 			var $dlg = $tmpl.octemplate({
 | |
| 				dialog_name: dialogName,
 | |
| 				title: title,
 | |
| 				message: content,
 | |
| 				type: dialogType
 | |
| 			});
 | |
| 
 | |
| 			if (modal === undefined) {
 | |
| 				modal = false;
 | |
| 			}
 | |
| 
 | |
| 			$('body').append($dlg);
 | |
| 			var buttonlist = [];
 | |
| 			if (_.isArray(buttons)) {
 | |
| 				buttonlist = buttons;
 | |
| 			} else {
 | |
| 				switch (buttons) {
 | |
| 				case OCdialogs.YES_NO_BUTTONS:
 | |
| 					buttonlist = [{
 | |
| 						text: t('core', 'No'),
 | |
| 						click: function(){
 | |
| 							if (callback !== undefined) {
 | |
| 								callback(false);
 | |
| 							}
 | |
| 							$(dialogId).ocdialog('close');
 | |
| 						}
 | |
| 					},
 | |
| 					{
 | |
| 						text: t('core', 'Yes'),
 | |
| 						click: function(){
 | |
| 							if (callback !== undefined) {
 | |
| 								callback(true);
 | |
| 							}
 | |
| 							$(dialogId).ocdialog('close');
 | |
| 						},
 | |
| 						defaultButton: true
 | |
| 					}];
 | |
| 					break;
 | |
| 				case OCdialogs.OK_BUTTON:
 | |
| 					var functionToCall = function() {
 | |
| 						$(dialogId).ocdialog('close');
 | |
| 						if(callback !== undefined) {
 | |
| 							callback();
 | |
| 						}
 | |
| 					};
 | |
| 					buttonlist[0] = {
 | |
| 						text: t('core', 'Ok'),
 | |
| 						click: functionToCall,
 | |
| 						defaultButton: true
 | |
| 					};
 | |
| 					break;
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			$(dialogId).ocdialog({
 | |
| 				closeOnEscape: true,
 | |
| 				modal: modal,
 | |
| 				buttons: buttonlist
 | |
| 			});
 | |
| 
 | |
| 			if (cssClass != undefined) {
 | |
| 				$(dialogId).addClass(cssClass);
 | |
| 			}
 | |
| 
 | |
| 			OCdialogs.dialogsCounter++;
 | |
| 		})
 | |
| 		.fail(function(status, error) {
 | |
| 			// If the method is called while navigating away from
 | |
| 			// the page, we still want to deliver the message.
 | |
| 			if(status === 0) {
 | |
| 				alert(title + ': ' + content);
 | |
| 			} else {
 | |
| 				alert(t('core', 'Error loading message template: {error}', {error: error}));
 | |
| 			}
 | |
| 		});
 | |
| 	},
 | |
| 	_fileexistsshown: false,
 | |
| 	/**
 | |
| 	 * Displays file exists dialog
 | |
| 	 * @param {object} data upload object
 | |
| 	 * @param {object} original file with name, size and mtime
 | |
| 	 * @param {object} replacement file with name, size and mtime
 | |
| 	 * @param {object} controller with onCancel, onSkip, onReplace and onRename methods
 | |
| 	 * @return {Promise} jquery promise that resolves after the dialog template was loaded
 | |
| 	*/
 | |
| 	fileexists:function(data, original, replacement, controller) {
 | |
| 		var self = this;
 | |
| 		var dialogDeferred = new $.Deferred();
 | |
| 
 | |
| 		var getCroppedPreview = function(file) {
 | |
| 			var deferred = new $.Deferred();
 | |
| 			// Only process image files.
 | |
| 			var type = file.type && file.type.split('/').shift();
 | |
| 			if (window.FileReader && type === 'image') {
 | |
| 				var reader = new FileReader();
 | |
| 				reader.onload = function (e) {
 | |
| 					var blob = new Blob([e.target.result]);
 | |
| 					window.URL = window.URL || window.webkitURL;
 | |
| 					var originalUrl = window.URL.createObjectURL(blob);
 | |
| 					var image = new Image();
 | |
| 					image.src = originalUrl;
 | |
| 					image.onload = function () {
 | |
| 						var url = crop(image);
 | |
| 						deferred.resolve(url);
 | |
| 					};
 | |
| 				};
 | |
| 				reader.readAsArrayBuffer(file);
 | |
| 			} else {
 | |
| 				deferred.reject();
 | |
| 			}
 | |
| 			return deferred;
 | |
| 		};
 | |
| 
 | |
| 		var crop = function(img) {
 | |
| 			var canvas = document.createElement('canvas'),
 | |
| 					targetSize = 96,
 | |
| 					width = img.width,
 | |
| 					height = img.height,
 | |
| 					x, y, size;
 | |
| 
 | |
| 			// Calculate the width and height, constraining the proportions
 | |
| 			if (width > height) {
 | |
| 				y = 0;
 | |
| 				x = (width - height) / 2;
 | |
| 			} else {
 | |
| 				y = (height - width) / 2;
 | |
| 				x = 0;
 | |
| 			}
 | |
| 			size = Math.min(width, height);
 | |
| 
 | |
| 			// Set canvas size to the cropped area
 | |
| 			canvas.width = size;
 | |
| 			canvas.height = size;
 | |
| 			var ctx = canvas.getContext("2d");
 | |
| 			ctx.drawImage(img, x, y, size, size, 0, 0, size, size);
 | |
| 
 | |
| 			// Resize the canvas to match the destination (right size uses 96px)
 | |
| 			resampleHermite(canvas, size, size, targetSize, targetSize);
 | |
| 
 | |
| 			return canvas.toDataURL("image/png", 0.7);
 | |
| 		};
 | |
| 
 | |
| 		/**
 | |
| 		 * Fast image resize/resample using Hermite filter with JavaScript.
 | |
| 		 *
 | |
| 		 * @author: ViliusL
 | |
| 		 *
 | |
| 		 * @param {*} canvas
 | |
| 		 * @param {number} W
 | |
| 		 * @param {number} H
 | |
| 		 * @param {number} W2
 | |
| 		 * @param {number} H2
 | |
| 		 */
 | |
| 		var resampleHermite = function (canvas, W, H, W2, H2) {
 | |
| 			W2 = Math.round(W2);
 | |
| 			H2 = Math.round(H2);
 | |
| 			var img = canvas.getContext("2d").getImageData(0, 0, W, H);
 | |
| 			var img2 = canvas.getContext("2d").getImageData(0, 0, W2, H2);
 | |
| 			var data = img.data;
 | |
| 			var data2 = img2.data;
 | |
| 			var ratio_w = W / W2;
 | |
| 			var ratio_h = H / H2;
 | |
| 			var ratio_w_half = Math.ceil(ratio_w / 2);
 | |
| 			var ratio_h_half = Math.ceil(ratio_h / 2);
 | |
| 
 | |
| 			for (var j = 0; j < H2; j++) {
 | |
| 				for (var i = 0; i < W2; i++) {
 | |
| 					var x2 = (i + j * W2) * 4;
 | |
| 					var weight = 0;
 | |
| 					var weights = 0;
 | |
| 					var weights_alpha = 0;
 | |
| 					var gx_r = 0;
 | |
| 					var gx_g = 0;
 | |
| 					var gx_b = 0;
 | |
| 					var gx_a = 0;
 | |
| 					var center_y = (j + 0.5) * ratio_h;
 | |
| 					for (var yy = Math.floor(j * ratio_h); yy < (j + 1) * ratio_h; yy++) {
 | |
| 						var dy = Math.abs(center_y - (yy + 0.5)) / ratio_h_half;
 | |
| 						var center_x = (i + 0.5) * ratio_w;
 | |
| 						var w0 = dy * dy; //pre-calc part of w
 | |
| 						for (var xx = Math.floor(i * ratio_w); xx < (i + 1) * ratio_w; xx++) {
 | |
| 							var dx = Math.abs(center_x - (xx + 0.5)) / ratio_w_half;
 | |
| 							var w = Math.sqrt(w0 + dx * dx);
 | |
| 							if (w >= -1 && w <= 1) {
 | |
| 								//hermite filter
 | |
| 								weight = 2 * w * w * w - 3 * w * w + 1;
 | |
| 								if (weight > 0) {
 | |
| 									dx = 4 * (xx + yy * W);
 | |
| 									//alpha
 | |
| 									gx_a += weight * data[dx + 3];
 | |
| 									weights_alpha += weight;
 | |
| 									//colors
 | |
| 									if (data[dx + 3] < 255)
 | |
| 										weight = weight * data[dx + 3] / 250;
 | |
| 									gx_r += weight * data[dx];
 | |
| 									gx_g += weight * data[dx + 1];
 | |
| 									gx_b += weight * data[dx + 2];
 | |
| 									weights += weight;
 | |
| 								}
 | |
| 							}
 | |
| 						}
 | |
| 					}
 | |
| 					data2[x2] = gx_r / weights;
 | |
| 					data2[x2 + 1] = gx_g / weights;
 | |
| 					data2[x2 + 2] = gx_b / weights;
 | |
| 					data2[x2 + 3] = gx_a / weights_alpha;
 | |
| 				}
 | |
| 			}
 | |
| 			canvas.getContext("2d").clearRect(0, 0, Math.max(W, W2), Math.max(H, H2));
 | |
| 			canvas.width = W2;
 | |
| 			canvas.height = H2;
 | |
| 			canvas.getContext("2d").putImageData(img2, 0, 0);
 | |
| 		};
 | |
| 
 | |
| 		var addConflict = function($conflicts, original, replacement) {
 | |
| 
 | |
| 			var $conflict = $conflicts.find('.template').clone().removeClass('template').addClass('conflict');
 | |
| 			var $originalDiv = $conflict.find('.original');
 | |
| 			var $replacementDiv = $conflict.find('.replacement');
 | |
| 
 | |
| 			$conflict.data('data',data);
 | |
| 
 | |
| 			$conflict.find('.filename').text(original.name);
 | |
| 			$originalDiv.find('.size').text(humanFileSize(original.size));
 | |
| 			$originalDiv.find('.mtime').text(formatDate(original.mtime));
 | |
| 			// ie sucks
 | |
| 			if (replacement.size && replacement.lastModifiedDate) {
 | |
| 				$replacementDiv.find('.size').text(humanFileSize(replacement.size));
 | |
| 				$replacementDiv.find('.mtime').text(formatDate(replacement.lastModifiedDate));
 | |
| 			}
 | |
| 			var path = original.directory + '/' +original.name;
 | |
| 
 | |
| 			FileList.lazyLoadPreview({
 | |
| 				path: path,
 | |
| 				mime: original.mimetype,
 | |
| 				etag: original.etag,
 | |
| 				callback: function(url) {
 | |
| 					$originalDiv.find('.icon').css('background-image', 'url("' + url + '")');
 | |
| 				}
 | |
| 			});
 | |
| 
 | |
| 			getCroppedPreview(replacement).then(
 | |
| 				function(path){
 | |
| 					$replacementDiv.find('.icon').css('background-image','url(' + path + ')');
 | |
| 				}, function(){
 | |
| 					path = OC.MimeType.getIconUrl(replacement.type);
 | |
| 					$replacementDiv.find('.icon').css('background-image','url(' + path + ')');
 | |
| 				}
 | |
| 			);
 | |
| 			// connect checkboxes with labels
 | |
| 			var checkboxId = $conflicts.find('.conflict').length;
 | |
| 			$originalDiv.find('input:checkbox').attr('id', 'checkbox_original_'+checkboxId);
 | |
| 			$replacementDiv.find('input:checkbox').attr('id', 'checkbox_replacement_'+checkboxId);
 | |
| 
 | |
| 			$conflicts.append($conflict);
 | |
| 
 | |
| 			//set more recent mtime bold
 | |
| 			// ie sucks
 | |
| 			if (replacement.lastModifiedDate && replacement.lastModifiedDate.getTime() > original.mtime) {
 | |
| 				$replacementDiv.find('.mtime').css('font-weight', 'bold');
 | |
| 			} else if (replacement.lastModifiedDate && replacement.lastModifiedDate.getTime() < original.mtime) {
 | |
| 				$originalDiv.find('.mtime').css('font-weight', 'bold');
 | |
| 			} else {
 | |
| 				//TODO add to same mtime collection?
 | |
| 			}
 | |
| 
 | |
| 			// set bigger size bold
 | |
| 			if (replacement.size && replacement.size > original.size) {
 | |
| 				$replacementDiv.find('.size').css('font-weight', 'bold');
 | |
| 			} else if (replacement.size && replacement.size < original.size) {
 | |
| 				$originalDiv.find('.size').css('font-weight', 'bold');
 | |
| 			} else {
 | |
| 				//TODO add to same size collection?
 | |
| 			}
 | |
| 
 | |
| 			//TODO show skip action for files with same size and mtime in bottom row
 | |
| 
 | |
| 			// always keep readonly files
 | |
| 
 | |
| 			if (original.status === 'readonly') {
 | |
| 				$originalDiv
 | |
| 					.addClass('readonly')
 | |
| 					.find('input[type="checkbox"]')
 | |
| 						.prop('checked', true)
 | |
| 						.prop('disabled', true);
 | |
| 				$originalDiv.find('.message')
 | |
| 					.text(t('core','read-only'))
 | |
| 			}
 | |
| 		};
 | |
| 		//var selection = controller.getSelection(data.originalFiles);
 | |
| 		//if (selection.defaultAction) {
 | |
| 		//	controller[selection.defaultAction](data);
 | |
| 		//} else {
 | |
| 		var dialogName = 'oc-dialog-fileexists-content';
 | |
| 		var dialogId = '#' + dialogName;
 | |
| 		if (this._fileexistsshown) {
 | |
| 			// add conflict
 | |
| 
 | |
| 			var $conflicts = $(dialogId+ ' .conflicts');
 | |
| 			addConflict($conflicts, original, replacement);
 | |
| 
 | |
| 			var count = $(dialogId+ ' .conflict').length;
 | |
| 			var title = n('core',
 | |
| 							'{count} file conflict',
 | |
| 							'{count} file conflicts',
 | |
| 							count,
 | |
| 							{count:count}
 | |
| 						);
 | |
| 			$(dialogId).parent().children('.oc-dialog-title').text(title);
 | |
| 
 | |
| 			//recalculate dimensions
 | |
| 			$(window).trigger('resize');
 | |
| 			dialogDeferred.resolve();
 | |
| 		} else {
 | |
| 			//create dialog
 | |
| 			this._fileexistsshown = true;
 | |
| 			$.when(this._getFileExistsTemplate()).then(function($tmpl) {
 | |
| 				var title = t('core','One file conflict');
 | |
| 				var $dlg = $tmpl.octemplate({
 | |
| 					dialog_name: dialogName,
 | |
| 					title: title,
 | |
| 					type: 'fileexists',
 | |
| 
 | |
| 					allnewfiles: t('core','New Files'),
 | |
| 					allexistingfiles: t('core','Already existing files'),
 | |
| 
 | |
| 					why: t('core','Which files do you want to keep?'),
 | |
| 					what: t('core','If you select both versions, the copied file will have a number added to its name.')
 | |
| 				});
 | |
| 				$('body').append($dlg);
 | |
| 
 | |
| 				if (original && replacement) {
 | |
| 					var $conflicts = $dlg.find('.conflicts');
 | |
| 					addConflict($conflicts, original, replacement);
 | |
| 				}
 | |
| 
 | |
| 				var buttonlist = [{
 | |
| 						text: t('core', 'Cancel'),
 | |
| 						classes: 'cancel',
 | |
| 						click: function(){
 | |
| 							if ( typeof controller.onCancel !== 'undefined') {
 | |
| 								controller.onCancel(data);
 | |
| 							}
 | |
| 							$(dialogId).ocdialog('close');
 | |
| 						}
 | |
| 					},
 | |
| 					{
 | |
| 						text: t('core', 'Continue'),
 | |
| 						classes: 'continue',
 | |
| 						click: function(){
 | |
| 							if ( typeof controller.onContinue !== 'undefined') {
 | |
| 								controller.onContinue($(dialogId + ' .conflict'));
 | |
| 							}
 | |
| 							$(dialogId).ocdialog('close');
 | |
| 						}
 | |
| 					}];
 | |
| 
 | |
| 				$(dialogId).ocdialog({
 | |
| 					width: 500,
 | |
| 					closeOnEscape: true,
 | |
| 					modal: true,
 | |
| 					buttons: buttonlist,
 | |
| 					closeButton: null,
 | |
| 					close: function() {
 | |
| 							self._fileexistsshown = false;
 | |
| 							$(this).ocdialog('destroy').remove();
 | |
| 						}
 | |
| 				});
 | |
| 
 | |
| 				$(dialogId).css('height','auto');
 | |
| 
 | |
| 				var $primaryButton = $dlg.closest('.oc-dialog').find('button.continue');
 | |
| 				$primaryButton.prop('disabled', true);
 | |
| 
 | |
| 				function updatePrimaryButton() {
 | |
| 					var checkedCount = $dlg.find('.conflicts .checkbox:checked').length;
 | |
| 					$primaryButton.prop('disabled', checkedCount === 0);
 | |
| 				}
 | |
| 
 | |
| 				//add checkbox toggling actions
 | |
| 				$(dialogId).find('.allnewfiles').on('click', function() {
 | |
| 					var $checkboxes = $(dialogId).find('.conflict .replacement input[type="checkbox"]');
 | |
| 					$checkboxes.prop('checked', $(this).prop('checked'));
 | |
| 				});
 | |
| 				$(dialogId).find('.allexistingfiles').on('click', function() {
 | |
| 					var $checkboxes = $(dialogId).find('.conflict .original:not(.readonly) input[type="checkbox"]');
 | |
| 					$checkboxes.prop('checked', $(this).prop('checked'));
 | |
| 				});
 | |
| 				$(dialogId).find('.conflicts').on('click', '.replacement,.original:not(.readonly)', function() {
 | |
| 					var $checkbox = $(this).find('input[type="checkbox"]');
 | |
| 					$checkbox.prop('checked', !$checkbox.prop('checked'));
 | |
| 				});
 | |
| 				$(dialogId).find('.conflicts').on('click', '.replacement input[type="checkbox"],.original:not(.readonly) input[type="checkbox"]', function() {
 | |
| 					var $checkbox = $(this);
 | |
| 					$checkbox.prop('checked', !$checkbox.prop('checked'));
 | |
| 				});
 | |
| 
 | |
| 				//update counters
 | |
| 				$(dialogId).on('click', '.replacement,.allnewfiles', function() {
 | |
| 					var count = $(dialogId).find('.conflict .replacement input[type="checkbox"]:checked').length;
 | |
| 					if (count === $(dialogId+ ' .conflict').length) {
 | |
| 						$(dialogId).find('.allnewfiles').prop('checked', true);
 | |
| 						$(dialogId).find('.allnewfiles + .count').text(t('core','(all selected)'));
 | |
| 					} else if (count > 0) {
 | |
| 						$(dialogId).find('.allnewfiles').prop('checked', false);
 | |
| 						$(dialogId).find('.allnewfiles + .count').text(t('core','({count} selected)',{count:count}));
 | |
| 					} else {
 | |
| 						$(dialogId).find('.allnewfiles').prop('checked', false);
 | |
| 						$(dialogId).find('.allnewfiles + .count').text('');
 | |
| 					}
 | |
| 					updatePrimaryButton();
 | |
| 				});
 | |
| 				$(dialogId).on('click', '.original,.allexistingfiles', function(){
 | |
| 					var count = $(dialogId).find('.conflict .original input[type="checkbox"]:checked').length;
 | |
| 					if (count === $(dialogId+ ' .conflict').length) {
 | |
| 						$(dialogId).find('.allexistingfiles').prop('checked', true);
 | |
| 						$(dialogId).find('.allexistingfiles + .count').text(t('core','(all selected)'));
 | |
| 					} else if (count > 0) {
 | |
| 						$(dialogId).find('.allexistingfiles').prop('checked', false);
 | |
| 						$(dialogId).find('.allexistingfiles + .count')
 | |
| 							.text(t('core','({count} selected)',{count:count}));
 | |
| 					} else {
 | |
| 						$(dialogId).find('.allexistingfiles').prop('checked', false);
 | |
| 						$(dialogId).find('.allexistingfiles + .count').text('');
 | |
| 					}
 | |
| 					updatePrimaryButton();
 | |
| 				});
 | |
| 
 | |
| 				dialogDeferred.resolve();
 | |
| 			})
 | |
| 			.fail(function() {
 | |
| 				dialogDeferred.reject();
 | |
| 				alert(t('core', 'Error loading file exists template'));
 | |
| 			});
 | |
| 		}
 | |
| 		//}
 | |
| 		return dialogDeferred.promise();
 | |
| 	},
 | |
| 	_getFilePickerTemplate: function() {
 | |
| 		var defer = $.Deferred();
 | |
| 		if(!this.$filePickerTemplate) {
 | |
| 			var self = this;
 | |
| 			$.get(OC.filePath('core', 'templates', 'filepicker.html'), function(tmpl) {
 | |
| 				self.$filePickerTemplate = $(tmpl);
 | |
| 				self.$listTmpl = self.$filePickerTemplate.find('.filelist li:first-child').detach();
 | |
| 				defer.resolve(self.$filePickerTemplate);
 | |
| 			})
 | |
| 			.fail(function(jqXHR, textStatus, errorThrown) {
 | |
| 				defer.reject(jqXHR.status, errorThrown);
 | |
| 			});
 | |
| 		} else {
 | |
| 			defer.resolve(this.$filePickerTemplate);
 | |
| 		}
 | |
| 		return defer.promise();
 | |
| 	},
 | |
| 	_getMessageTemplate: function() {
 | |
| 		var defer = $.Deferred();
 | |
| 		if(!this.$messageTemplate) {
 | |
| 			var self = this;
 | |
| 			$.get(OC.filePath('core', 'templates', 'message.html'), function(tmpl) {
 | |
| 				self.$messageTemplate = $(tmpl);
 | |
| 				defer.resolve(self.$messageTemplate);
 | |
| 			})
 | |
| 			.fail(function(jqXHR, textStatus, errorThrown) {
 | |
| 				defer.reject(jqXHR.status, errorThrown);
 | |
| 			});
 | |
| 		} else {
 | |
| 			defer.resolve(this.$messageTemplate);
 | |
| 		}
 | |
| 		return defer.promise();
 | |
| 	},
 | |
| 	_getFileExistsTemplate: function () {
 | |
| 		var defer = $.Deferred();
 | |
| 		if (!this.$fileexistsTemplate) {
 | |
| 			var self = this;
 | |
| 			$.get(OC.filePath('files', 'templates', 'fileexists.html'), function (tmpl) {
 | |
| 				self.$fileexistsTemplate = $(tmpl);
 | |
| 				defer.resolve(self.$fileexistsTemplate);
 | |
| 			})
 | |
| 			.fail(function () {
 | |
| 				defer.reject();
 | |
| 			});
 | |
| 		} else {
 | |
| 			defer.resolve(this.$fileexistsTemplate);
 | |
| 		}
 | |
| 		return defer.promise();
 | |
| 	},
 | |
| 	_getFileList: function(dir, mimeType) {
 | |
| 		if (typeof(mimeType) === "string") {
 | |
| 			mimeType = [mimeType];
 | |
| 		}
 | |
| 
 | |
| 		return $.getJSON(
 | |
| 			OC.filePath('files', 'ajax', 'list.php'),
 | |
| 			{
 | |
| 				dir: dir,
 | |
| 				mimetypes: JSON.stringify(mimeType)
 | |
| 			}
 | |
| 		);
 | |
| 	},
 | |
| 
 | |
| 	/**
 | |
| 	 * fills the filepicker with files
 | |
| 	*/
 | |
| 	_fillFilePicker:function(dir) {
 | |
| 		var dirs = [];
 | |
| 		var others = [];
 | |
| 		var self = this;
 | |
| 		this.$filelist.empty().addClass('icon-loading');
 | |
| 		this.$filePicker.data('path', dir);
 | |
| 		$.when(this._getFileList(dir, this.$filePicker.data('mimetype'))).then(function(response) {
 | |
| 
 | |
| 			$.each(response.data.files, function(index, file) {
 | |
| 				if (file.type === 'dir') {
 | |
| 					dirs.push(file);
 | |
| 				} else {
 | |
| 					others.push(file);
 | |
| 				}
 | |
| 			});
 | |
| 
 | |
| 			self._fillSlug();
 | |
| 			var sorted = dirs.concat(others);
 | |
| 
 | |
| 			$.each(sorted, function(idx, entry) {
 | |
| 				entry.icon = OC.MimeType.getIconUrl(entry.mimetype);
 | |
| 				var $li = self.$listTmpl.octemplate({
 | |
| 					type: entry.type,
 | |
| 					dir: dir,
 | |
| 					filename: entry.name,
 | |
| 					date: OC.Util.relativeModifiedDate(entry.mtime)
 | |
| 				});
 | |
| 				if (entry.type === 'file') {
 | |
| 					var urlSpec = {
 | |
| 						file: dir + '/' + entry.name
 | |
| 					};
 | |
| 					var previewUrl = OC.generateUrl('/core/preview.png?') + $.param(urlSpec);
 | |
| 					$li.find('img').attr('src', previewUrl);
 | |
| 				}
 | |
| 				else {
 | |
| 					$li.find('img').attr('src', OC.Util.replaceSVGIcon(entry.icon));
 | |
| 				}
 | |
| 				self.$filelist.append($li);
 | |
| 			});
 | |
| 
 | |
| 			self.$filelist.removeClass('icon-loading');
 | |
| 			if (!OC.Util.hasSVGSupport()) {
 | |
| 				OC.Util.replaceSVG(self.$filePicker.find('.dirtree'));
 | |
| 			}
 | |
| 		});
 | |
| 	},
 | |
| 	/**
 | |
| 	 * fills the tree list with directories
 | |
| 	*/
 | |
| 	_fillSlug: function() {
 | |
| 		this.$dirTree.empty();
 | |
| 		var self = this;
 | |
| 		var path = this.$filePicker.data('path');
 | |
| 		var $template = $('<span data-dir="{dir}">{name}</span>');
 | |
| 		if(path) {
 | |
| 			var paths = path.split('/');
 | |
| 			$.each(paths, function(index, dir) {
 | |
| 				dir = paths.pop();
 | |
| 				if(dir === '') {
 | |
| 					return false;
 | |
| 				}
 | |
| 				self.$dirTree.prepend($template.octemplate({
 | |
| 					dir: paths.join('/') + '/' + dir,
 | |
| 					name: dir
 | |
| 				}));
 | |
| 			});
 | |
| 		}
 | |
| 		$template.octemplate({
 | |
| 			dir: '',
 | |
| 			name: '     ' // Ugly but works ;)
 | |
| 		}, {escapeFunction: null}).addClass('home svg').prependTo(this.$dirTree);
 | |
| 	},
 | |
| 	/**
 | |
| 	 * handle selection made in the tree list
 | |
| 	*/
 | |
| 	_handleTreeListSelect:function(event) {
 | |
| 		var self = event.data;
 | |
| 		var dir = $(event.target).data('dir');
 | |
| 		self._fillFilePicker(dir);
 | |
| 		var getOcDialog = this.closest('.oc-dialog');
 | |
| 		var buttonEnableDisable = $('.primary', getOcDialog);
 | |
| 		if (this.$filePicker.data('mimetype') === "http/unix-directory") {
 | |
| 			buttonEnableDisable.prop("disabled", false);
 | |
| 		} else {
 | |
| 			buttonEnableDisable.prop("disabled", true);
 | |
| 		}
 | |
| 	},
 | |
| 	/**
 | |
| 	 * handle clicks made in the filepicker
 | |
| 	*/
 | |
| 	_handlePickerClick:function(event, $element) {
 | |
| 		var getOcDialog = this.$filePicker.closest('.oc-dialog');
 | |
| 		var buttonEnableDisable = getOcDialog.find('.primary');
 | |
| 		if ($element.data('type') === 'file') {
 | |
| 			if (this.$filePicker.data('multiselect') !== true || !event.ctrlKey) {
 | |
| 				this.$filelist.find('.filepicker_element_selected').removeClass('filepicker_element_selected');
 | |
| 			}
 | |
| 			$element.toggleClass('filepicker_element_selected');
 | |
| 			buttonEnableDisable.prop("disabled", false);
 | |
| 		} else if ( $element.data('type') === 'dir' ) {
 | |
| 			this._fillFilePicker(this.$filePicker.data('path') + '/' + $element.data('entryname'));
 | |
| 			if (this.$filePicker.data('mimetype') === "httpd/unix-directory") {
 | |
| 				buttonEnableDisable.prop("disabled", false);
 | |
| 			} else {
 | |
| 				buttonEnableDisable.prop("disabled", true);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| };
 | 
