(function webpackUniversalModuleDefinition(root, factory) {
	if(typeof exports === 'object' && typeof module === 'object')
		module.exports = factory();
	else if(typeof define === 'function' && define.amd)
		define([], factory);
	else {
		var a = factory();
		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
	}
})(this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId])
/******/ 			return installedModules[moduleId].exports;
/******/
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			exports: {},
/******/ 			id: moduleId,
/******/ 			loaded: false
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.loaded = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;
/******/
/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "/";
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ({

/***/ 0:
/***/ function(module, exports, __webpack_require__) {

	__webpack_require__(360);
	__webpack_require__(366);
	__webpack_require__(372);
	__webpack_require__(376);
	__webpack_require__(369);
	__webpack_require__(373);
	__webpack_require__(367);
	__webpack_require__(368);
	__webpack_require__(358);
	__webpack_require__(359);
	__webpack_require__(364);
	__webpack_require__(362);
	__webpack_require__(361);
	__webpack_require__(374);
	__webpack_require__(377);
	__webpack_require__(365);
	__webpack_require__(357);
	__webpack_require__(363);
	__webpack_require__(371);
	__webpack_require__(370);
	__webpack_require__(375);
	__webpack_require__(660);


/***/ },

/***/ 1:
/***/ function(module, exports) {

	/*
		MIT License http://www.opensource.org/licenses/mit-license.php
		Author Tobias Koppers @sokra
	*/
	// css base code, injected by the css-loader
	module.exports = function() {
		var list = [];
	
		// return the list of modules as css string
		list.toString = function toString() {
			var result = [];
			for(var i = 0; i < this.length; i++) {
				var item = this[i];
				if(item[2]) {
					result.push("@media " + item[2] + "{" + item[1] + "}");
				} else {
					result.push(item[1]);
				}
			}
			return result.join("");
		};
	
		// import a list of modules into the list
		list.i = function(modules, mediaQuery) {
			if(typeof modules === "string")
				modules = [[null, modules, ""]];
			var alreadyImportedModules = {};
			for(var i = 0; i < this.length; i++) {
				var id = this[i][0];
				if(typeof id === "number")
					alreadyImportedModules[id] = true;
			}
			for(i = 0; i < modules.length; i++) {
				var item = modules[i];
				// skip already imported module
				// this implementation is not 100% perfect for weird media query combinations
				//  when a module is imported multiple times with different media queries.
				//  I hope this will never occur (Hey this way we have smaller bundles)
				if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) {
					if(mediaQuery && !item[2]) {
						item[2] = mediaQuery;
					} else if(mediaQuery) {
						item[2] = "(" + item[2] + ") and (" + mediaQuery + ")";
					}
					list.push(item);
				}
			}
		};
		return list;
	};


/***/ },

/***/ 2:
/***/ function(module, exports, __webpack_require__) {

	/*
		MIT License http://www.opensource.org/licenses/mit-license.php
		Author Tobias Koppers @sokra
	*/
	var stylesInDom = {},
		memoize = function(fn) {
			var memo;
			return function () {
				if (typeof memo === "undefined") memo = fn.apply(this, arguments);
				return memo;
			};
		},
		isOldIE = memoize(function() {
			return /msie [6-9]\b/.test(self.navigator.userAgent.toLowerCase());
		}),
		getHeadElement = memoize(function () {
			return document.head || document.getElementsByTagName("head")[0];
		}),
		singletonElement = null,
		singletonCounter = 0,
		styleElementsInsertedAtTop = [];
	
	module.exports = function(list, options) {
		if(false) {
			if(typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment");
		}
	
		options = options || {};
		// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>
		// tags it will allow on a page
		if (typeof options.singleton === "undefined") options.singleton = isOldIE();
	
		// By default, add <style> tags to the bottom of <head>.
		if (typeof options.insertAt === "undefined") options.insertAt = "bottom";
	
		var styles = listToStyles(list);
		addStylesToDom(styles, options);
	
		return function update(newList) {
			var mayRemove = [];
			for(var i = 0; i < styles.length; i++) {
				var item = styles[i];
				var domStyle = stylesInDom[item.id];
				domStyle.refs--;
				mayRemove.push(domStyle);
			}
			if(newList) {
				var newStyles = listToStyles(newList);
				addStylesToDom(newStyles, options);
			}
			for(var i = 0; i < mayRemove.length; i++) {
				var domStyle = mayRemove[i];
				if(domStyle.refs === 0) {
					for(var j = 0; j < domStyle.parts.length; j++)
						domStyle.parts[j]();
					delete stylesInDom[domStyle.id];
				}
			}
		};
	}
	
	function addStylesToDom(styles, options) {
		for(var i = 0; i < styles.length; i++) {
			var item = styles[i];
			var domStyle = stylesInDom[item.id];
			if(domStyle) {
				domStyle.refs++;
				for(var j = 0; j < domStyle.parts.length; j++) {
					domStyle.parts[j](item.parts[j]);
				}
				for(; j < item.parts.length; j++) {
					domStyle.parts.push(addStyle(item.parts[j], options));
				}
			} else {
				var parts = [];
				for(var j = 0; j < item.parts.length; j++) {
					parts.push(addStyle(item.parts[j], options));
				}
				stylesInDom[item.id] = {id: item.id, refs: 1, parts: parts};
			}
		}
	}
	
	function listToStyles(list) {
		var styles = [];
		var newStyles = {};
		for(var i = 0; i < list.length; i++) {
			var item = list[i];
			var id = item[0];
			var css = item[1];
			var media = item[2];
			var sourceMap = item[3];
			var part = {css: css, media: media, sourceMap: sourceMap};
			if(!newStyles[id])
				styles.push(newStyles[id] = {id: id, parts: [part]});
			else
				newStyles[id].parts.push(part);
		}
		return styles;
	}
	
	function insertStyleElement(options, styleElement) {
		var head = getHeadElement();
		var lastStyleElementInsertedAtTop = styleElementsInsertedAtTop[styleElementsInsertedAtTop.length - 1];
		if (options.insertAt === "top") {
			if(!lastStyleElementInsertedAtTop) {
				head.insertBefore(styleElement, head.firstChild);
			} else if(lastStyleElementInsertedAtTop.nextSibling) {
				head.insertBefore(styleElement, lastStyleElementInsertedAtTop.nextSibling);
			} else {
				head.appendChild(styleElement);
			}
			styleElementsInsertedAtTop.push(styleElement);
		} else if (options.insertAt === "bottom") {
			head.appendChild(styleElement);
		} else {
			throw new Error("Invalid value for parameter 'insertAt'. Must be 'top' or 'bottom'.");
		}
	}
	
	function removeStyleElement(styleElement) {
		styleElement.parentNode.removeChild(styleElement);
		var idx = styleElementsInsertedAtTop.indexOf(styleElement);
		if(idx >= 0) {
			styleElementsInsertedAtTop.splice(idx, 1);
		}
	}
	
	function createStyleElement(options) {
		var styleElement = document.createElement("style");
		styleElement.type = "text/css";
		insertStyleElement(options, styleElement);
		return styleElement;
	}
	
	function createLinkElement(options) {
		var linkElement = document.createElement("link");
		linkElement.rel = "stylesheet";
		insertStyleElement(options, linkElement);
		return linkElement;
	}
	
	function addStyle(obj, options) {
		var styleElement, update, remove;
	
		if (options.singleton) {
			var styleIndex = singletonCounter++;
			styleElement = singletonElement || (singletonElement = createStyleElement(options));
			update = applyToSingletonTag.bind(null, styleElement, styleIndex, false);
			remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true);
		} else if(obj.sourceMap &&
			typeof URL === "function" &&
			typeof URL.createObjectURL === "function" &&
			typeof URL.revokeObjectURL === "function" &&
			typeof Blob === "function" &&
			typeof btoa === "function") {
			styleElement = createLinkElement(options);
			update = updateLink.bind(null, styleElement);
			remove = function() {
				removeStyleElement(styleElement);
				if(styleElement.href)
					URL.revokeObjectURL(styleElement.href);
			};
		} else {
			styleElement = createStyleElement(options);
			update = applyToTag.bind(null, styleElement);
			remove = function() {
				removeStyleElement(styleElement);
			};
		}
	
		update(obj);
	
		return function updateStyle(newObj) {
			if(newObj) {
				if(newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap)
					return;
				update(obj = newObj);
			} else {
				remove();
			}
		};
	}
	
	var replaceText = (function () {
		var textStore = [];
	
		return function (index, replacement) {
			textStore[index] = replacement;
			return textStore.filter(Boolean).join('\n');
		};
	})();
	
	function applyToSingletonTag(styleElement, index, remove, obj) {
		var css = remove ? "" : obj.css;
	
		if (styleElement.styleSheet) {
			styleElement.styleSheet.cssText = replaceText(index, css);
		} else {
			var cssNode = document.createTextNode(css);
			var childNodes = styleElement.childNodes;
			if (childNodes[index]) styleElement.removeChild(childNodes[index]);
			if (childNodes.length) {
				styleElement.insertBefore(cssNode, childNodes[index]);
			} else {
				styleElement.appendChild(cssNode);
			}
		}
	}
	
	function applyToTag(styleElement, obj) {
		var css = obj.css;
		var media = obj.media;
	
		if(media) {
			styleElement.setAttribute("media", media)
		}
	
		if(styleElement.styleSheet) {
			styleElement.styleSheet.cssText = css;
		} else {
			while(styleElement.firstChild) {
				styleElement.removeChild(styleElement.firstChild);
			}
			styleElement.appendChild(document.createTextNode(css));
		}
	}
	
	function updateLink(linkElement, obj) {
		var css = obj.css;
		var sourceMap = obj.sourceMap;
	
		if(sourceMap) {
			// http://stackoverflow.com/a/26603875
			css += "\n/*# sourceMappingURL=data:application/json;base64," + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + " */";
		}
	
		var blob = new Blob([css], { type: "text/css" });
	
		var oldSrc = linkElement.href;
	
		linkElement.href = URL.createObjectURL(blob);
	
		if(oldSrc)
			URL.revokeObjectURL(oldSrc);
	}


/***/ },

/***/ 8:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHqSURBVDiNpdOxquJAFAbgf5JsoriiRsTKwkqshGy5r5Bub2XnC9zOV1CwWgRfwmJbsRVEBReERbAVUSJa2EWdOXO2mly9brcDw8mEzJ/vDIlgZvzPcD7fCIIgdl3XAoBer+d6nodcLofD4cCLxUIzczwajTwhxJ/JZPLN+hxARCkhhMvMLgBkMhn4vo84jsVyubS11l+Z+QszB/8UaK1NEAAgnU4jlUrB931Uq1UwM7TWEEJ8tBAEQex5ngUAg8EAhr3f7zEcDqG1xng8hud5LwGWYQNwieiJfbvdsFwuE9n1ekWj0UCtVkuk1iPbVMMuFAqoVqvQWiczDEO0Wq3kWcdsZGbYto1+v49sNgvbtmFZFogIq9UqYZdKJURR9BzAzKjX6/B9P+mNmSGEADMjn8/jfD5js9lgu93CsiyY7ycRdLtdXC4XSCmhlIKUEkSUVCEE2u02isUiTqfTawtaa5TL5WSzqebasM36JUBKiePxiNvtBiJ6UiilEvZut4PjOAjD8DWgVCo9vf1RYdjz+fyX1lpNp9PfnU7nI0Aphfv9/kI31bD7/f6Pl5/p7e0NUkpEUYT7/f50gEopENET+3EIZkalUnlvNpvfpZQOETnM7BCRTUSWOSxmlrPZbLVer38CuAKImVn9BQ7ZlX92J+HcAAAAAElFTkSuQmCC"

/***/ },

/***/ 10:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAM7SURBVDiNlZSxSytZGMV/N3MnkxlRV5M8NUFB5MESTWEgliJYuHX+BQurXf0DtlvwT9DK1lJs11IbBTcoCjYbMKgpnhYSTDRm7r1bbOa+iQZ234XDzdz55sw55/smwhjDx1Uqlb75vv9Tp9N5E0Kwvr7uFwoF6fs+qVSKZDLJ09OTrlarYS6Xk9VqtX58fJwRQgTGmJ2Tk5PfEp9YAa11Vgjhaq2He5BCCHzfZ3R0lLGxMZrNZmJ/fz9Zr9cT7+/vs8aYYWOMI4T4FUAOIo5cGGMskskkqVSKIAhwXRfXdTHG4DgOWms+Oh9IHBVqrRFC/FsoJa7r2t1xHEscvTwuSgIsLS394XnelzAMOwDLy8vk83lc1yWRSCCl5Pr6GoAwDHl9faVWq1Eul1FKUavVrAgrBKDb7f7uui6dTgchBPPz8ywsLDA8PMzIyAie53FxccH29jaVSoXHx0fOz88RQnB5eWmfi69EZD2eaWQ9CAKGhoYIggDP8zDGIKVEa20BUC6XKRaLNj6r2BiDEKIvJ9d1SSaTFlGTHMdBKdXXrK2tLcIwZGdnh7Ozs++Ko6JIRavV+tSs2dlZNjY2KBQKtNvtvomp1+t0u13ryirWWtNsNgmCAGMMh4eHHB0dkUgkbEPiCp+fnwHsvYmJCZRSffHYKJRSvLy82OJWq2V/R42JX8ebFYahJe5TbIyhVCqxublpH9Ba9xXHG6a1ptPpsLe3x8PDA3d3d2QymT5iOxWLi4sUi0WCICCVSuF5nv1fkFIipcRxHBzHQQjBzMwMc3NzaK3JZrOW9JPiyFI+n0cpZRHZHHQWkcWvo4ztVGitCcPwhxAR39/f0+12yWazrK6u9k9FpOT29ta+/aPS+Fkmk7HWM5kMSina7TaNRqM/ikjx1NTUf0YRnUfWDw4O/uwpf2o0Gn/1Ecez+hFiYwy7u7u/8GFJgHQ6jRCCMAyp1+t9oxZvTHxPp9NIKRkfH//I+Z24UqmQTqdRSjE5Ofm/VEex5XK5gcTCGMP09PTN2trazysrKwM/hvgoRfeVUpyennJzc/P31dXV14HEQggH8AAfSPXgxxD0dgd4B96ANvDaw1tvj866/wAZT/Bx7BH3JQAAAABJRU5ErkJggg=="

/***/ },

/***/ 12:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAOCSURBVFiFxZW9T+tIFMXPHY8/8BrRJSAgDc2TKCMhpIiW4klP2pZiS2okGio6CuhoaFyy/Am8pdliEatEoBR0r4psPgoiIZIKIxJ7tiAzcsw4Thae3kijGY89d84992ebhBD4lY390tMB8KIHqtXqDyHEF8/znp+fn2MiwtTUFO3t7XkAYJomTNOE67owDAMA0G63k263KwCQ53lsf3//zyiKficiE0BfCPHt4uLin7EExHH8hYgAwE2SBEQEWTYigm3bcF0Xtm3DNE0wxuD7Pms0GlheXsbGxgZM0/wjiiIIIUBEIKLvAH4bS0CWESHE0BrnHI7jwHVdcP4WjjGmnuGcI0mSoT1E5Kr9kwiQczk6jgPbtmFZFjjnICIwxpRLRKQVkG6FAnQHy5ExBs45DMMAY0yN6TIZhoE4jpWgrJCxHUhvTgc0DEPV3rIsAMDKygqmp6dRLpchhEC/3y92II/2o6MjAHraHx4ecH9/DwDwPA8nJycIgkCJq1araDQaiKIIA5DzBfxP2pGmvd1uo9/vqz1XV1d4eXkZ6bAS8JNoz7V+pIDPpH1ra0slc3p6ijAM9QJ0B38G7aurq0iSBHEcw3VdHBwcjHbgs2m/vb0FAJTL5XeJagUIITAzM6PsPD4+RqVSUfAZhqGyjeMYtm3j8fERvu9raZ+dnVUO6Er0TsDT05MKQkRoNptoNpvyGz50T47p9WyTB0sRhQImaeNQns5ed86QACJCrVbD+vq6NpAOUl1P095qtQAA8/PzQ0xpBQBvr83S0hKAYfvSmRTN07QvLi5OxgDnHEII3N3dodfrDW3MCsp24D3tco/MvlCA3CTpTasfx5FspnnruQImtTtvnhUgO2NstAD5fo9zUN69dLwgCEBEmJubQ5IkODw8xOXlZXEJWq0WXl9f39VfNxdCqIOztC8sLAwl5Ps+Op0OdnZ2RjtQqVQmtl5X63q9ruDrdru4vr4G5/zvkQxMAl1e/WW83d1d/SeyqAQfhXHcL6sSIP/xHwUwj/ZCAZubm6jVagqoIAgUhLIXwTiK9rxG0qq1tTVRKpWwvb2NUqn0IQBvbm5wfn6OTqeDs7Oz8RgIw/CvMAy/1ut1OI6jMtP19D3dc5J2xti/RDQHoA+glxp7QohEOUBvvyc2EGQNRnPQrcFoD+ZWZh0A4kHw10Hvpebyupda7wGIhRDJf87CAqpgeW6iAAAAAElFTkSuQmCC"

/***/ },

/***/ 13:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,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"

/***/ },

/***/ 20:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAAnNCSVQICFXsRgQAAAAJcEhZcwAAAbsAAAG7ATrs4+IAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAABY0lEQVQoz0WRvUrDYBSGT67DzSGX4OwuUg1pREq1Bf/QQvmaYq0/xCB108FJvI8UcfASpKAOUlxcYkUJn8I3xK88DsZ63uGBw+EdziPIb3ruSRwnURqlcXIS99y/vSBI5ByprmnRJiKiTYuuOVKRUxzsO91+kw43DHhiyAM37NKk2993EEFCtcM597yS8ckXmjeeOWOHUCGi3IYJeeQDwzdjxlhyNC+0aRjlynZc55Z3DJf0AOhQx6IZUGf7WNaTDe7QWC5oANBkFsgZscV6IrU0ZECGpcMcADWmAUvGAbVUqmmLRzRj5hGAgmM0h1RTqSS1osFjCqCgJWONSiKV2OeaETkrzAAUzBniUzmWZbdsNnlGY/kfiyakbJZdQQK1wCkvaHLs5A9XLBAoRJAlJ+iX2GLAiAxNxpAWJYL+klPIChxfeaZElV32WKWEZ3wVOBObCFJ2/dhLFtPF1Ev8uDzR/QMSiW8z9mjaNwAAAABJRU5ErkJggg=="

/***/ },

/***/ 21:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAAnNCSVQICFXsRgQAAAAJcEhZcwAAAbsAAAG7ATrs4+IAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAABdElEQVQYGQXBQUtTARwA8P879RHq2qF9hC5dPEYXdW2zGJZCmqggbxNrlsyH6M26dOpjBG+EQV+gqEF5CPHiZRnFegbvMN749fuFEEIc1g6yLO+P+qMsP8gOa0IIEUL0k720V3Zs6+vb1tEr99J+IkSI3aQ32PLMiaEfznx3YseW3mA3ESG66YZXvvlp7Mo/hV/OHdvQTUWktc2y69QfpXeuTFUmChe2bZZpLdazZR/9Vpo6duQrqBSGlq3vx0q+6otChT2rHnjtChOX1qzksTTqGhqrsGrejBmPfFYZe2FpFIujjlOFKW677ppb7vtkqvDS4ija+ZKhsQp33HRDx19Uxp5o59HOGt67NME9d30ATJxpaO/Hw1qzfOpcofJGAagUuprlw1qIVjrnyIXCRGWqMlF4a04rFSEWktZg1pqhS2OFsTMds1qDhUSEEK2kkdbLWYt2PPfYrHrZSFuJECGEEM1aI6vn86P5UT1vZM2aEEL8B3stbp8vLTeMAAAAAElFTkSuQmCC"

/***/ },

/***/ 47:
/***/ function(module, exports) {

	module.exports = "data:image/gif;base64,R0lGODlhEAAQAIcAADFKY0L/QplnAZpoApxqBJ5sBqBuCKNxC6VzDad1D6h2EKt5E6x6FK58FrB+GLOBG7WCHbeEH7qHIr2KJcCNKMKPKsWSLceUL8iVMMmWMcuYM8yZNNu3Utu3cf/Ub//bdf/kf5SlvZylvZytxqW11qm92r3GxrnK5P/vif/4k///mf//nP//usDAwMvLy8zMzNPT09bW1sbW69jh8efv9+vz/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAMAAAEALAAAAAAQABAAAAiVAAMIHEiwoMGDBzds0JABA0KBG2xIZMGiAsINHTho1NhhgoQIEB44EKhBosmTJhnECJBBxYqXMGOqSPAiwAUVOHPqxHnARQALKlIIHUpUhQGfFVSgWMq0qYoCPimoAEG1qlUVBHxOUPGhq9evKgb4lKDCg9mzaFUIqBkgpIMGCxQgOGCgAAEBLWAMhOGir9+/eh8eDAgAOw=="

/***/ },

/***/ 55:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAG/SURBVHjaldA/aBNhGMfx7/vec5fUK6ZTq9YpIEKkiEM2cRCdXLoJdigOVUHdRILFxUW76lzFuUrJpOCgRdAhFurQydr4p7SNUagpbWp7d4/3BkERArkP/Hh57+73wD2oak/hIROlp6VPY6/HdkpPSnWmueKe91R2H5dfluPKYkWdW+lZflWOecQlATh9b2kX8PmH75l3SZycf1E5skzEjcZ2w76tV6F0l89rVRLdssTcNKrKmamP0cWTBc9aQ4fCwsqvaL6+TaLIXDhCfL3N/8wD05azU0t5VUysiiZ/X44MB5IGZ7FxAHlsOAHUxpXLVcO8ghkyaxL4tg0wU9ukm6HCBM3CbVbbCc4C8D6yHNu8U5RADKeOFti/z8PSzVXmopBnep/8bEihv8hofI1odRTJiUE8w4f1XRKlq0EuMJ7GsRtwaEB4Iz+RQCxiLWHOIwvfs7hu5xd839LfRyau47qdAfn0AoYM0o5xA9wOLPnAQzwlC7c315Wcb6I00hdYsohVcV1XfL6+sXOuOBgaN7UXe7Gy3NhK0u6stH58m2x93xv+2jx4HIylJxq3ml9qamTSAC6H3Zlhk/onK78B7TbWT23RkgwAAAAASUVORK5CYII="

/***/ },

/***/ 56:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAG7AAABuwE67OPiAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAH5QTFRF////AAAAAAD/AID/VaqqAAAAAAAAXYvRAAAAAAAAAAAAAAAAAAAAAAAAAAAAUorPq8bnXJDSUYrRSYXOZJbVQH/Lor7jOHvLMHTHmLfgWpDSY5bUjLDdUovQgajaSYXOOHrKQX/MSYTNSYXOUonPUovQW5DSXZDRaZjUdaDXge6uxAAAACB0Uk5TAAEBAgMMDRYXGCAiKCkrO15ndIKFj5GcpbS9v9fl+vtAhYLqAAAAaklEQVQYGX3BBw6CABAAwaUoCiq99w7//6AlBL2EOAPHtCTR+KHGTROrfIXtS8jO7+uuq3ufjTeW9jDY5ejx4U6ZwTxjZJPLWx7osCygBzm7dUWqKqSiQEpTpChCchz+UM5X6/64mZeTAk8dbwaliveFTAAAAABJRU5ErkJggg=="

/***/ },

/***/ 63:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAMKSURBVHjabZPJa1NRGMXPG5OXpElqTEybNLbVxjhU0VZFRcWCY2msm1ZNXLjzL3DhALrULhRxJUrFlSO4ccCVUKdNRRSVBiuxtWPUl6F5L2+8XiMGK57LXdzF/d3zne+7DCEE/xNDlU6nvd09+/eFGiN9jOjvgOgKijzP379xac3A+XMfQMX/ufDg4aPTzS2tKUHyRkuKKo18/c5Kkhu6BVQMG4ZFoJs2LJugfdWqPgBnagCG6sXH3NlFIZ6RC0Uwlo6ZyUkomg6RQjRVgUMU4A9FYTM8/OHFO/8AWFARqjlVJxVVRTTaRF+x0bYsgcnxLCy1iGIhj8xoFprFVR0IUv0yUNUc9CR7Z23Wwe7ZtQOpI0fhqfOiNFdCa3w5NFpDQyyMoAWYpg6GE8FLHu88QCgU6mvblhrsP7C52QQDVTfBkwqisVaaAYFKS1FVDZzggEnPokPiadUcNW5VS7h29cpTeXbi2cTUN2gmgce3AIVSmQb3OzSG5SE6XSAEdP8COBifz+eqOeg/eGjI5fJsGklEoBkGWI6HWtHx6vkQGmMtcHvr8f7tmypIcDgQj6/EiZOntgB4XHVw+9bN7dcHr9a5G5bDoA6c7jrYhEGifR0+vn+H8S9ZZEcz1IUEtVzG2FgWi5tbe/+eA9J/KHXxyb1BdHZ2IKQ2IdgYo134Qh0sgUNyYWliNXRNQ9uKNeB5AUWUt9YAyWQy0tG5vifcvpsEPCzjdHsxMT6GYLiJOgENUEEgxMK/YCFM06hmwTm9UVDNG+ULd4bljWvjfgLUAtMNHXJulsIisEwThbwMb30AhlKw9m5o4WujfPBwauh7XvF9erkS/ceOAwRVsQxHQ+VQLObB0kUvV8GC6OQACDVAQ6TxVnz96sKm7bu6iU3+/lSoDywCxwJOjoEoAAJLYCoa3G63h6/ZHxi43JVMP97StbfbJ7EQKZ+YOgxdgV0pkUq5qOdkuZDLffs8PT01nMvlXpTL5QLNYN5r/O27d0dNw5ibmp55I/+QX2cyI09pmzMAlF+Th3/0E+BtWn9pUkycAAAAAElFTkSuQmCC"

/***/ },

/***/ 67:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAM0SURBVDiNdZO7b1t1AIW/+7Cvr29sE6dxEpPYeTSPSlVCQxShKIUgJIaIqUMXBibEwkgrBKhVEAgkJOjAgCBCiJE/ALaqImrLQ1WqvEiaBje2G9fvRxzb9/ljKkolONMZzvmmcyQhBKe1vLwsxeJvvpUc63ujXGwk63UzZDv2bqXS+C11UPl+f+da4XReOg34+NNf5iRF+XZ0vP/C5sMie+kakqqiCZeAT0K4bn1vI/Xe3ZtXVp925Kfm0uVvFsMh/VbPYM+FkfNDJGZH8I30M/pCgv7JOMaZMEowEJmaP/fd7MJnN54BrK7ejszMJH8wYhFjZHqIQDhASw8yPNnPE1uwVTxhPVtnPV1HC+sMn0+8u/jqyuV/AXf+ePR5tDc81jMU5exQN23VRzCi0xeL4OkBOqqK0AOYEuykSmwfVJRI/+CNQPC6IgMUiydzsqETec7A8sBxXJIhjXLbJtc0MYVER4BQfdROXManE7i6NhCJlhYUw7gYeXBQWMmj6mMTMbqCGi3bo9g0eVJrge1QqLTotGxkx8Enebw0PYjtQCNf/Uv9dW1z0nL93Q/TddY28uTaLk1XQkgCu2URkkH1PFQh8DwPCRnLk3A9B09Io6rZ8W1Jslc+rrd6DrNlhE9loLeLu39XyZZPkB0Xp2Vhtm1Ux6Xb8JPJlKgeVZFcMyUJIVhc+ur3etCYl89ESI7HsBSFc4koHrB9UKJSPsY+6aALD0OWefTgMWHFobSfW1IB/D75T6vRmQ8GNcxqEzQ/L0/10rY9pvpC3LmfIZ+rYQibja0crungyu3U0ePwbRlgf/fwSsTPfcV2yB6UsGotKqUmQVUmrMkszcR55cVhtnfyCNNCC2A5HfG+ENcdGSCT+bIdpPOhKomKHg5QzNVYW9sjEdWYiIeIhfxsb6RRNRWtu0uY5dqPu+vXfnpmyrduXv2ZQu712eeNzZnZJIMTA1gCyo0OlWYHLRaiq8tXtrNHV9Nbn7z9n2cCkKQVeWZB+0BLxi+Onu0bPzbdQLXcyFvF2t5hqvRFYeOje//7RoC5d+75Km4+7kgi4bVKI57TCSqqVpAC0bSnG6ns16+VT+f/AdUpgg43u9ZnAAAAAElFTkSuQmCC"

/***/ },

/***/ 68:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAGzSURBVHjanZM/TBNhGMZ/1ztOCDRCGlqDMTWcGzI10cStCSEO4MAKi3HVxIGFf6NhrnFwuy4MOup2A5OKDAwMutVBG/4kdMC21/ZKez7DNYQcNtZf8ibf8DxPvu9574wwDEEYhpEFHtIfifkqzy8irMh8r1Ao7OTz+Qc60w/P8/akWVHIDyKyxWLxs+/74b+O67qfkE8hGMBiqVT6wIA4jvNEAR97T2DhbY3McMDsLTjed3lffEOP5WfPmZ17SqMJZ4HN6vwYVzpIJBI0mwHm3RykYXzS48XGNrYFBpCZus30/RznVTg5OED6qwG94pI23NBkl9ZIp2AiCUPSBk2o16ALRPp4QKtV5/j7Lu0yHI3BuMymBYhOB34rwPehEVjSp+NP2N9yGID4DR6/rjA1GjCj8PKey7u/lFhp26wvpOI3qDcCgjs5wkmYyHi83NzGNC9LdFRitQan/UoctRUmk7O4RiYF6ZswYqINwbnMF4gwXmKUKLEFlsYe0tgySFftQgedZexGI/31Wyh/26XxE8rJaAsmQiaF6BugVodW27p+jYevZvgfDCAFPGJwvuhfqPwB25vCkOvr78wAAAAASUVORK5CYII="

/***/ },

/***/ 76:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAMYSURBVHjapdNNaFxVGIfx5z3n3nPvTDKNppOYTsd+RbEWaSkIQqhIKQSqRboQqmKlrgSrYMDiQsG1CG5K7KYrdwWlutFuigqmtGCDi5p2RqdN0qZJJ+lkptNkvu9rinQ22ph2fnC2D3/O4Yiq8jBkVCwhHxhr3km79AZ1GswUZ7KRRN+wjS91rzYAHiosX0s/Nc7ve3bf1kOpQ2hNQUB84dTVU5y9dDbHeob0bc2vOSw/iU+G34cGh3bsH9zP7MxNRl/8CoCRsfdIbkjxQ+5HzmXPXQe2eqzVNCOu2+1I96XJ1Scol+e4b+HuFYwW2dKf5reye7K+UP+wHT56Mnu5sNTYDv+IBbbQl4y98vlrm88DUOEN7VF+ufgzG8MQ8hV4GQCmspeYL+WYqVVRp2A50r6Kt45P1A48/4RzvgEgN7fMeK6oCioC37oXTKO0hH6srMb7Qmj1cKu92BqDGOG+wYH4vSOAAJy52kXxzhL/x3jQWkfYDvu+lXpTiSLlvyTC9RSfztN1QkjHoGsRxkcUgOFRQZMwXYFoEwA5b+dHFyJVFYALmds8SDM9DE9dZjkF0g0upC3YCKTgTgFaTRj46/3dnghyeO+20rq432OFB4r4lE8q37FQmeJaEVI12m5UYTYPt6rweGJLq+/m68bzrY3Gp+qtnrjFiLKaA+YM3/cfZJEMk01wJwQJoJmECEj0buKl7OnyddNKeM73GyLGhqFDWD0ckOLw4hgXw+Nkk6cp9U7im5BE1MtzlSPsmn+XeV2WwM03vDDwqwIm5ixr+4WWPa1j7Cke4188QViygfMrXizwy0LUG/hCFCmdMEYQ1MYDV/C6QrdojCRjgdBsCZ3wrCCCxEP/9krYz6vqM6FvaBilE741iGBWwnNePLAzy7WGhA5MQ3jUtADOB4NKd2CnVxbba9V63QReBBrxyAScB8bcW2xyXiyQjBU1lhqBieiExWBETVfo/eHNZcambf9uCnfrNFva8eNZI9y48uufsn341fibR0+WNg885kHnJmeLjc8O9oeiqojITmAXIHQmAsZVdeJvjA4tLDyFo/kAAAAASUVORK5CYII="

/***/ },

/***/ 77:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKxSURBVHjapZVLaBNRGIXPvTPNqyZNE2trrZvS7sSFWkSXirhpY0FqoOpSRHBZCi7EvTtBEEUQFLQIiuALF1YtiCBtLd1ooYEmtjQ16WNSm/fDP3dmwqS3nSw8cDg3meHLn/MPCatUKqiKMdZDcRj/p1nizYOkwhRBfy8uveCcgTEOPRklNz9YN0iWtKrV7z9PIYEFpB6sG4S5/SaOqm6EOsG4ATbgkmSwmFCYgDU/GE/gy69NVBX0JnDtTIfOtAFzy1mCcvKryQ28m9HgVLnw2x8bePl9DYpxL91jpt3EAlrLiZ+bGPu2BmcTh2XJePo1ib0+B04f8gNyJfLEVuhsLINHE0mCMjQpDNlCWZjO4r2H43HMRNPifsM2VRgVLCTyuP8pAZUgR7v3IF8owaGyqsW5r8cnrt39sITISlavznZizrGSKuLexz9iMQNHAhjpPwAXVeHRLc6joYMY7GtDVXfeLyKuFcAaVfGcOlUYx9VT7Rg60UaTKXA7uNViceGT+3D9bBcBGB5/XpbA6nbw4LEAPC4Vna2OWjVetwKLTIiopCvoQjpXagzubndJz7HXpUpgU50BJyRJYMAKNAEEtk4swxuDTZgFSqlPJUPFs10ul0Xag00oUDfx/lanBC0Wi8jlcsL5fB6RyPwcgHg9WK6jDtTud0rQZDIJLaXB5/UhFotuhkLnbgGY3BlsTLxdQW+TSPPrZzIZaJqG3t4eTE9P58LhodH19fXXdC2/+/IgL6atxYFCUe9R4RWkUkk0NzdjiqCXLl6+GYstPSNoeqeObbfe4lFrr7PZLBJ/t7C6upoaHr4wStAxgmp2P5slWkIG9hJVRKMLcwMD/VcI+kSHyrL+53VQHCcraKxl8pTZ6a5gglZhTrKb7BLWzx4zDXNygZwmZ4zMirOeW0YW/gFmhvUQTe9pwQAAAABJRU5ErkJggg=="

/***/ },

/***/ 82:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAPmSURBVHjatZVLTxtXHMWbRT9A203VL8AX6aKrLrpCajZdpFJ2VXetuqwaKWrThPAy2CQQCJgADhiMzdjG7+fYBvzCDwzYBkzAHo9fMQZz+r8z1BLK0EWlXOlodKXRb8495381nwDoidaXpH7S/f+pfsZgrFvgbx4+1QiNS7Quuqi976LSuEJJvERBuMDeWRup0nvEjlqIHDYRyDXgytZh2xVhjlexviNgyl5oM/gtMK17Dx+/5TpXXXS7wLlQBx+JweGLwOoOIVUo4+D8Atl3bWRO2zgoXyBf7SBD+yh9LLDfgC1ZvWbOb4En1Gqh1WxBNaxC8biEZCYHkVwflgT4tnah51zYzpaQOm4gd0bQSgeHwg242ELwLrB6bKzGwMODw4hEE6i1Oqi3u7C5/Sg3r/CufonpN8sYnZzDhmcLqmkdJpfMMAVz8O3V4c7UKBYFMK0vvv9l3JbNn6JMOW8l9lAsN2H376BIzryxfahf67CyGcSM3oaBiQUsmEOSUy+BXQTeTCqD7z34Y5EriR2c1i5xQrJ4QsiVqKRIGpvBJFbtIcwbXXhrDcHoS4Hj92GLncJDYCeB78r4rCbWr1Uj45LDQoXyO67B7NlGLF9BmgpLntBUHLdg8qexZI1gxRnvxeBIk+OEAlijUtVZxkMDw8hR+0zZs7Y0BakSQUsydLvQQjjfBH/QgJ9GznMTgz0lKoP7+vq+uv/rmN0Tz2OXIJw/QUcPQ2f2Q2twwps4+QAqZ8vcirDTPFsTwodgnuc/ffBItxE/amJ5k8dOoSE5XDD5EMhW8IJNQCArQX0MmBbg2CWRU5Lk2BoXFDMW5XEbhY7KiZCzUE6ElsBhummLlKl60QIjFfaXegGPx+YxNGvCs1dr+FOjI8dVWJTAapWqIoq166HnowjmqIjtI8xzPLxZQbpVQzNrmDXxGJwx4NnUKp68WMaMKYRHI3PS/pUhCLMSmNbn3/08YuHCBZafpPE3Zmi5MOYIoHMm8Zqey+4MXq56MW3k8ZSAL/VeLDlTWHKkYI5VlDP+4fdFoytdhTsrj5A1eorN+Lk0o860XNJ6qIgnE8t4PmOkKRCw4s3ROwIrDlysgv/M2CFD5LalcuTW9b59TK762dVlt4yNF3MqgS0E5aJl3Jnx4MCIBOlJhkrlaHSuHpDBJla8dIITCWqOVrCxowCm9dm3Pw1x+sABcyQreVtaawyGYJEdm4rbIkVgiRJUUhmmbQUwU/9vs2sst39lIzFncoYkei7S0acMPHSurAwkceSUuV3fOlcGf/3j3xqOXuzBbmSRM+wduQeMMiCJnBoJqnUfdXp/kI/5z/so+gff94rhTn92XQAAAABJRU5ErkJggg=="

/***/ },

/***/ 84:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,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"

/***/ },

/***/ 85:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKfSURBVHjapZU9aBNxGMafu0uT9CP9MDUSa5FWVIrNFHRw6iBuIgpmFFtoQNBFqDQguqkgiIPoJC5xMptbh4IEgktIsLSiDh2sdbCtYr/uM+fzz13pndXr2T7w8MLd//29T9/+j0i2bcMrSZKOsozQEsLrLTnz8CjyBzSWz+cfj42NXcZ/qFgsvmFvjnAVrnyJM5lMvlQqPYrFYp3+gcHhdV1fzeVyk7Va7Rm2JMAu/ES5XJ5TVdUOY03TfK5UKnOC4fJ8qziZTCaHCoUC9qLx8fEhwaA/7dgxV4Bq1ygn6DicALriQHXqJYovnvog1/I3MHJxFJYJqLQuRZu9Qf88LKzoMHqy6O0GevuAVHoKE3cfQJaBrVUfSvfh2Kksdwts0rV6le86/g2W2S0UV4Afm8DHJWDgQgEpDulmX2uUZxoALMAgUG+wisQ0e4MTAwTwaYtriUMatCE7EKE1DlXXAdsAojagmU5vIFjT1vHtwzTMdqCjjWZNsCqekxYTrxK8tsEBqngXYW8qGPzuziD2qGDw9VcrGOjW0dvKpDHuufIaz588hFc3b03izLkrMC1nDSZvxaXTB4LBs191pAez6D8C9HANX2amcPseb4W0fSvaO7twfDgLwwBUul6v7r5joZlFoL+DiZn6/NUC2uJAPMrDMmDbaCY1dLpBW03vAMt/A7fITLoCfF5mIoswyTkpKU4lG5awTQs4HSqxACuErBvA/E9gDcBBPkvQLZIY5EBNN7FphgUrBMuu3ZQ6Xy3raErd4BkCZdtJa9ohwREW2QPmNfWpweeLv5hcAxKKSB0SLICyB077m9y/aEkFvtOmFfLLW5idxmbzq6NZE6yK4knc2P7yWLnvyO7g9/eHsU/5f5oITbKcxf5UIW8Z1G8F5zE7Ieu22QAAAABJRU5ErkJggg=="

/***/ },

/***/ 94:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAATWSURBVHjaxdVbaBxVHMfx7/+cM7Oz16RJatNUW9q0aW1tUTRq0bZKKYL4oEQtPmjxQQSxFC94edC+KKigUiiKWF/EgoiCDyKoaL3hBQpeUKm2udgmbZIm2SSb7O7s7MxxR9sQahBT6/bDnt2Hffj+ZnZgxVrLuSR7ZSlJduOzmZAMkMYwRpWPaeBZe5f9jVnO2QB5RRyE16hw++ZVmxPbLtpGe7YdBLonuvno2Ed83vO5RXiTA9xp37LhORsgt4vmOj5OZBNbdl2xizW5NYRRSKlUAoGkl0RbzaHxQ+z5aQ/+uP8Fmq32Xhso/iOpYTNvSE62dK3pwvM8jgV9HBr8np0dO9m5aidHhr9nmD5SaY+uji4kI5uosF9qDKfc/XL/h5FlG2cwmnwQ2Dtev/+iD5jLXtYibG9rbMNkDCcqfWQN5AvDnDZe6CbRXGAKSKYMbYvbGJgYuJknaJ8ZEMdvvDzJmcamwgUHj1TeveeVgdtevXfJe3+7+hd4lAYk3ZSm3++jxQVXw3RxlNNKpWNEFPEtFICMk4ZGHCxPzzwDO17qt1s3eMxlshjxXW9ANbTMFoVV3rFXUlpxEgmFBSdc2rwUzY5QOhHw7cOTxLa8mGPBEod8YDnhFxlqrTA5YmGUfsMsfhAxl4QDV3c4nCnwI946OgUVsEcso4+UmctnD0wyW+55gRXAGGnDLL0nS8xH4BeR0EAECP+aFsAB0njS+djBIT+oXsBZiIIyh9beQvXCPATQNAgL3dpJQHUQvn7IErthj5Btg6EKnPRhpBVGS2DyuchEloW7t6+eUkqUtTbFPFT8Mk8dXsdPwZfggKyEdBouSEKQZsaidmjqAFuEYgl6xwEHUoOrxbhGh+8cnCrWPrVSzGtAVA1Y2L8DdcU3RFGViSkYs5AMwUTMGAOmJ2DIh4H4kQkg1nr81si4rqnW2uI6DiKWedGapYuupXlgPSdXfke1CIPjQAVSITOGqxCOw3EfhsuAB809G4LmdGdtgDGB1lqceAAR86UyjVzT/SQHsg8ysbiXchmO5iEtsHi/oICqhvESVBJAQ+11fLntPPZEMcg2K+M6xtdKq4RjbA3z5WjDkvaruf6X5/iq/BTDK38gSkBhrHY0oPhLDlRkaOlZx8bex8PGFZ3RSKES1AbosmtIJ105qwEgJN00yQ2byHQ/Q8+Pn9C39lNG238lpIISg664NP62jNWHb2JJ00Za118alUKHST8qm9qVl4yWTDKhCCPOmutmWH7JVbQu6+DiwRvIf/g7QXka7bgY1yPXtJiWzjUkUlmMkyCYKEvcrg1QRaORZEKohsLZE0h4pFOLaGppIbr4MsDOfKe0rh0HEakdiJt/thOumdYK5TkiVcU5oE4d5x//wuNm3DaeowtaidR+AgmqlnoQEeJm3DauqyZVPMBFtJI6DUDiZtw2nqsnAOUlFKLqdgfiASpuG6N1PggisRbBUi9iIxHHUfnaADVWCawAUre+tVhE4rYxSkatFWWtrdsdsILEzbhttFEjiJXIout3BxBESdw2hP5ILulKf77sRFFEfQi5pFFx23zz/r7D23fcN5X1vAbqaHzar7z9xr7DAqSBdcAKIAso/l8RUAB6gJ/lVDAFeIAGhP+XBUKgDBSx1nK+xG2J386nPwAukOpAV8yivAAAAABJRU5ErkJggg=="

/***/ },

/***/ 95:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAARMSURBVHjaxVVbaBxVGP7msrPZ7WablI1JaqWxxUtfJMWHolVRX6Q+qVSxUkEQfPdNLLnUKxR9VOtDJLFNqWKwD41ILVFsCtWmWtoYiHek2Y3SyV6yaXZndvf4z+FwONmzywyK+JMv/5x/D+f7/sucMRhj+D/NVheGYewkN4j/1i5T0r+0FBCQF4rFT3zPC9TQnwCwYc2XkKqFkxG5v9ksy0IykdgPoK0A+J4Pz6/xA1WYpiQSBJpvS25IH9ICboLMMHSQyWev1sDwVJbHXntyGxxbF6IfrUdNLSDJdZjCNxiRnsrh0q9rHK9+mgVjRGCa6r5grSFUgAGIkpstRTAYeGt6GXO/3UDMNjkukogjp3NgkOSqGAkDCBeA1uTy0KNn/8L5H8uIWcYGzC6u4t0zy3KfJG1C2Axw8kajoU6+xIfnrmNmocT73crOzhfQmbDw/EN9WlJk0QQYAlKx8FPfruCzywWeLYQ1mBCtnHv6uxWkOiw8fe9NgjDaEOqKFfLPr5Rwai4gNzm6N8VgUZwKwUHPQUz+PvWNi+nv83oLwwXoZf96sYyPL7g0bAbHnTcncOSZ7bBNyP4Hz28/uwO7tiXlvsnZPzHzQwGahQlQyedouk+cvy6JHrmrC0OP34JM2hFEEjw2un8A+wa3yP3jX+Vw4adSlCHUBcxfq+DYrEvZGYjHTBy8vwd7dnbK3+O2pp2/ks892E9VShL5Mqp+A2MzOSQcC4MDKZBFH8IzV4v8UurvdvDCw73o63KUTLiotgN2z+1dGOhJ4L0vssjlqzQPLnbf2hleAfWwx+7uxh+uhwd2pdERs5qHiWLaYSoBCY/j0BPb8eV8Hjt6k+K3aN8Cjtv6E7hja7LdJGstEHH1mQvftzsDzaLeA2hNLipgtq+AHosuQJIChPYHdTghFdAtegWYlr1+eHcqFilbxtg/qABjMntVgOrTCVuLqUbfEw4y6Q3TjFgBhbidbU7aauYase/7qNVqqNfrUkDFr1XJrbYSENJP3aeTVityTlipVDgKhSLWbqzxjFLpdH1oZHgMwMUQAdEmeFOH2gLeay5gfX0drutiKZtF3ImjpyfD2zo8Onryo8nJ12lfPkRAtEmmT67W82q1inK5jGtLS7hv716qRg253DIOHR6ZPj4xMUTk2cg3YZu49Fs6Hax7db6mu56X3vM8uCsriNm2JH/lzTfOHf9g/CUAv0e/CRkLFdS72ZFxyj7oOS9/sVhCf1+vJB87+v6LABaY8j7++xnQ33UhosrFm5aFl0dGpifHg8w5eSP6PRDdtCEM2tCVydC0Hz554tjEUFB2RhamXoLs0dLqaoWGiVE/Gb3LHPQ+cxDBBlDWAfieQrHEFhZ/rjx14MA7ALaKM0Nh0D81mz5yewgpgtUEcyO0zwUTl8wVQp5QJ9QU+NITRFtgcBVk4lCb4AgfE3CEj4tnpykOhcwT8LlX1xJyXQ9E/A19/fQN6YNALwAAAABJRU5ErkJggg=="

/***/ },

/***/ 100:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,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"

/***/ },

/***/ 102:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,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"

/***/ },

/***/ 103:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAR2SURBVHjaxZdfaBxVFMa/+bOz2c3GmCg1UTFNa/yXqgXTogQJwQS6TwkVoUUCgvjkS4iQh2KbtxoEpfjgkxQkgg9C0PeCfZII6YNJlVLxD1UaWpLGms0mszNz1+9w75BhWDrssuAHv5zdmTv3fPfMuXeJW6/X8X/KJQ1lWdYRhjfbkOM7LvJmUwaYvGd+fv6riYmJ16RCSik4jgORbduJqCVjoiiScRLlXjwPVlZWzjCWOeZupgHzkF0ulz+anp4+6XkehFwul0QSyDgIscEgCFCr1QT92cSxsbHjU1NTH3PsuxwbZRoYGBg4u7CwcKavr8+R5K7rQqJUQBKnEcUrl6S+76fN2HNzc6fX19e/B/DlAw3Q5dDy8vL5wcHB7mQSXk+WW2NWHl8TiVkxKtdjxER3d3fX4uLiOc7zA8f++qAKPDc+Pv7s1tYW2qHkDpucnHxG5idpA40fXFpaQrs0MzOTvQ3Trq9Yb+GNV4/hUAno6QC68kCHB1z95hIufjiLRrpw8RLKb89CRcB+SBhv3riOBsquwMb2Pr79GRg7DLzyBBDmgIjeDg+fwPnFz1Db34UFQNpDPOcLnTh67AQiBQQRx5JaAOxU9nk/T+rZBtJyLODWPSYIgYFDwFOPAEeOj+KFk6PwXMB1tAGldMIg0IRKE4gJQjX3CgRR3mHZOcJmvO8Df94H7tHMwyWguwgUmNyzeV+eI8piYpC6ThwaOF9Tr6BOLG1A4xCX5FyNxc+K7EYaUXUPCHyOi/iMpVdvaKkH9E2bCYmj0UaMibR4QGKPBrZopFKhCQBdvFZrugJGluOh+tcqtjuBgFQLwA7jP4ylImDbadOsRpXJE/g+jXV4zfeA6Mdzj6Nd2tzcbG4XyOB3vriNoz01FFyW0gOKxMsB1658jcuff4JGeu/9DzBaPgsl714Bfggo28OpYa/5CvyyUUPvwAiGngR6pezmIPJsHxfMOQBzDsCcA6+fOo2hF0cQMHFIdsn1n1YBeK014bW/gceK3Hb9cggRAE+/PIrhkVE2ojSl2YJyz2y5SFYt3xUjCVptwngX3LgDlHLA82yJfF0WS2TVxDIRSq4RSHJNREIlsfmDSGQBsgWJA9yt8PodmuiniQ6zS2z5o4kNKYZIiE0oDedr/ihOnwOh0ifhDud5VH6gaKxLTkmphKkMkFq9qUDrB5ElySUJMUZkwl0FZtBmPDEpBYh4XwwkTCgx0HoP6ISuTm4wp6FBVFOEserTE3nINk1pUC30wIEBUwErbYI0MltVwO87QCeAkqtfQRgh2QNWloGcMWEMaOzYRExjA7ynM2xUAI9T9OaRroCXZaCYrECc1NKfk5VIyZgULM0mTVR2dTMm1JlloBCXS36MKrdWsVUC/CInI/+SbVIiVrqYdY7Zk6SkeoByveRrLWQYOPj+26cvoV3i/wQwcrMMhHEPrK2toZ0yVQizDFzt7++fNc2SN03pSUzgEps4JKkoQZCgZqIv82cZ+INcNtedFLbBMqRbUZG6QRmiFHtI6T9wfkuU6V1W8gAAAABJRU5ErkJggg=="

/***/ },

/***/ 108:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 *
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiß <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Filemanager.nodeActions');
	
	/**
	 * @singleton
	 */
	Tine.Filemanager.nodeActionsMgr = new (Ext.extend(Tine.widgets.ActionManager, {
	    actionConfigs: Tine.Filemanager.nodeActions
	}))();
	
	// /**
	//  * reload
	//  */
	// Tine.Filemanager.nodeActions.Reload = {
	//     app: 'Filemanager',
	//     text: 'Reload', // _('Reload),
	//     iconCls: 'x-tbar-loading',
	//     handler: function() {
	//         var record = this.initialConfig.selections[0];
	//         // arg - does not trigger tree children reload!
	//         Tine.Filemanager.fileRecordBackend.loadRecord(record);
	//     }
	// };
	
	/**
	 * create new folder, needs a single folder selection with addGrant
	 */
	Tine.Filemanager.nodeActions.CreateFolder = {
	    app: 'Filemanager',
	    requiredGrant: 'addGrant',
	    allowMultiple: false,
	    // actionType: 'add',
	    text: 'Create Folder', // _('Create Folder')
	    disabled: true,
	    iconCls: 'action_create_folder',
	    scope: this,
	    handler: function() {
	        var app = this.initialConfig.app,
	            currentFolderNode = this.initialConfig.selections[0],
	            nodeName = Tine.Filemanager.Model.Node.getContainerName();
	
	        Ext.MessageBox.prompt(app.i18n._('New Folder'), app.i18n._('Please enter the name of the new folder:'), function(btn, text) {
	            if(currentFolderNode && btn == 'ok') {
	                if (! text) {
	                    Ext.Msg.alert(String.format(app.i18n._('No {0} added'), nodeName), String.format(app.i18n._('You have to supply a {0} name!'), nodeName));
	                    return;
	                }
	
	                var filename = currentFolderNode.get('path') + '/' + text;
	                Tine.Filemanager.fileRecordBackend.createFolder(filename);
	            }
	        }, this);
	    },
	    actionUpdater: function(action, grants, records, isFilterSelect) {
	        var enabled = !isFilterSelect
	            && records && records.length == 1
	            && records[0].get('type') == 'folder'
	            && window.lodash.get(records, '[0].data.account_grants.addGrant', false);
	
	        action.setDisabled(!enabled);
	    }
	};
	
	/**
	 * show native file select, upload files, create nodes
	 * a single directory node with create grant has to be selected
	 * for this action to be active
	 */
	// Tine.Filemanager.nodeActions.UploadFiles = {};
	
	/**
	 * single file or directory node with readGrant
	 */
	Tine.Filemanager.nodeActions.Edit = {
	    app: 'Filemanager',
	    requiredGrant: 'readGrant',
	    allowMultiple: false,
	    text: 'Edit Properties', // _('Edit Properties')
	    iconCls: 'action_edit_file',
	    disabled: true,
	    // actionType: 'edit',
	    scope: this,
	    handler: function () {
	        if(this.initialConfig.selections.length == 1) {
	            Tine.Filemanager.NodeEditDialog.openWindow({record: this.initialConfig.selections[0]});
	        }
	    },
	    actionUpdater: function(action, grants, records, isFilterSelect) {
	        // run default updater
	        Tine.widgets.ActionUpdater.prototype.defaultUpdater(action, grants, records, isFilterSelect);
	
	        var _ = window.lodash,
	            disabled = _.isFunction(action.isDisabled) ? action.isDisabled() : action.disabled;
	
	        // if enabled check for not accessible node and disable
	        if (! disabled) {
	            action.setDisabled(window.lodash.reduce(records, function(disabled, record) {
	                return disabled || record.isVirtual();
	            }, false));
	        }
	    }
	};
	
	/**
	 * single file or directory node with editGrant
	 */
	Tine.Filemanager.nodeActions.Rename = {
	    app: 'Filemanager',
	    requiredGrant: 'editGrant',
	    allowMultiple: false,
	    text: 'Rename', // _('Rename')
	    iconCls: 'action_rename',
	    disabled: true,
	    // actionType: 'edit',
	    scope: this,
	    handler: function () {
	        var _ = window.lodash,
	            app = this.initialConfig.app,
	            record = this.initialConfig.selections[0],
	            nodeName = record.get('type') == 'folder' ?
	                Tine.Filemanager.Model.Node.getContainerName() :
	                Tine.Filemanager.Model.Node.getRecordName();
	
	        Ext.MessageBox.show({
	            title: String.format(i18n._('Rename {0}'), nodeName),
	            msg: String.format(i18n._('Please enter the new name of the {0}:'), nodeName),
	            buttons: Ext.MessageBox.OKCANCEL,
	            value: record.get('name'),
	            fn: function (btn, text) {
	                if (btn == 'ok') {
	                    if (!text) {
	                        Ext.Msg.alert(String.format(i18n._('Not renamed {0}'), nodeName), String.format(i18n._('You have to supply a {0} name!'), nodeName));
	                        return;
	                    }
	
	                    // @TODO validate filename
	                    var targetPath = record.get('path').replace(new RegExp(record.get('name') +'$'), text);
	                    Tine.Filemanager.fileRecordBackend.copyNodes([record], targetPath, true);
	
	                }
	            },
	            scope: this,
	            prompt: true,
	            icon: Ext.MessageBox.QUESTION
	        });
	    }
	};
	
	/**
	 * single file or directory node with editGrant
	 */
	Tine.Filemanager.nodeActions.SystemLink = {
	    app: 'Filemanager',
	    requiredGrant: 'readGrant',
	    allowMultiple: false,
	    text: 'System Link', // _('System Link')
	    iconCls: 'action_system_link',
	    disabled: true,
	    // actionType: 'edit',
	    scope: this,
	    handler: function () {
	        var _ = window.lodash,
	            app = this.initialConfig.app,
	            record = this.initialConfig.selections[0];
	
	        Ext.MessageBox.show({
	            title: i18n._('System Link'),
	            // minWidth:
	            maxWidth: screen.availWidth,
	            msg: '<b>' + i18n._('Use this link to share the entry with other system users') + ':</b><br>'
	                    + record.getSystemLink(),
	            buttons: Ext.MessageBox.OK,
	            // value: record.getSystemLink(),
	            // prompt: true,
	            icon: Ext.MessageBox.INFO
	        });
	    }
	};
	
	/**
	 * one or multiple nodes, all need deleteGrant
	 */
	Tine.Filemanager.nodeActions.Delete = {
	    app: 'Filemanager',
	    requiredGrant: 'deleteGrant',
	    allowMultiple: true,
	    text: 'Delete', // _('Delete')
	    disabled: true,
	    iconCls: 'action_delete',
	    scope: this,
	    handler: function (button, event) {
	        var app = this.initialConfig.app,
	            nodeName = '',
	            nodes = this.initialConfig.selections;
	
	        if (nodes && nodes.length) {
	            for (var i = 0; i < nodes.length; i++) {
	                var currNodeData = nodes[i].data;
	
	                if (typeof currNodeData.name == 'object') {
	                    nodeName += currNodeData.name.name + '<br />';
	                }
	                else {
	                    nodeName += currNodeData.name + '<br />';
	                }
	            }
	        }
	
	        this.conflictConfirmWin = Tine.widgets.dialog.FileListDialog.openWindow({
	            modal: true,
	            allowCancel: false,
	            height: 180,
	            width: 300,
	            title: app.i18n._('Do you really want to delete the following files?'),
	            text: nodeName,
	            scope: this,
	            handler: function (button) {
	                if (nodes && button == 'yes') {
	                    Tine.Filemanager.fileRecordBackend.deleteItems(nodes);
	                }
	
	                for (var i = 0; i < nodes.length; i++) {
	                    var node = nodes[i];
	
	                    if (node.fileRecord) {
	                        var upload = Tine.Tinebase.uploadManager.getUpload(node.fileRecord.get('uploadKey'));
	                        upload.setPaused(true);
	                        Tine.Tinebase.uploadManager.unregisterUpload(upload.id);
	                    }
	
	                }
	            }
	        });
	    }
	};
	
	/**
	 * one node with readGrant
	 */
	// Tine.Filemanager.nodeActions.Copy = {};
	
	/**
	 * one or multiple nodes with read, edit AND deleteGrant
	 */
	Tine.Filemanager.nodeActions.Move = {
	    app: 'Filemanager',
	    requiredGrant: 'editGrant',
	    allowMultiple: true,
	    text: 'Move', // _('Move')
	    disabled: true,
	    actionType: 'edit',
	    scope: this,
	    iconCls: 'action_move',
	    handler: function() {
	        var app = this.initialConfig.app,
	            i18n = app.i18n,
	            records = this.initialConfig.selections;
	
	        var filePickerDialog = new Tine.Filemanager.FilePickerDialog({
	            title: app.i18n._('Move Items'),
	            singleSelect: true,
	            constraint: 'folder'
	        });
	
	        filePickerDialog.on('selected', function(nodes) {
	            var node = nodes[0];
	            Tine.Filemanager.fileRecordBackend.copyNodes(records, node.path, true);
	        });
	
	        filePickerDialog.openWindow();
	    },
	};
	
	/**
	 * one file node with download grant
	 */
	Tine.Filemanager.nodeActions.Download = {
	    app: 'Filemanager',
	    requiredGrant: 'downloadGrant',
	    allowMultiple: false,
	    actionType: 'download',
	    text: 'Save locally', // _('Save locally')
	    iconCls: 'action_filemanager_save_all',
	    disabled: true,
	    scope: this,
	    handler: function() {
	        Tine.Filemanager.downloadFile(this.initialConfig.selections[0]);
	    },
	    actionUpdater: function(action, grants, records, isFilterSelect) {
	        var enabled = !isFilterSelect
	            && records && records.length == 1
	            && records[0].get('type') != 'folder'
	            && window.lodash.get(records, '[0].data.account_grants.downloadGrant', false);
	
	        action.setDisabled(!enabled);
	    }
	};
	
	/**
	 * one file node with readGrant
	 */
	Tine.Filemanager.nodeActions.Preview = {
	    app: 'Filemanager',
	    allowMultiple: false,
	    requiredGrant: 'readGrant',
	    text: 'Preview', // _('Preview')
	    disabled: true,
	    iconCls: 'previewIcon',
	    scope: this,
	    handler: function () {
	        var selections = this.initialConfig.selections;
	
	        if (selections.length > 0) {
	            var selection = selections[0];
	
	            if (selection && selection.get('type') === 'file') {
	                Tine.Filemanager.DocumentPreview.openWindow({
	                    record: selection
	                });
	            }
	        }
	    }
	};
	
	/**
	 * one node with publish grant
	 */
	Tine.Filemanager.nodeActions.Publish = {
	    app: 'Filemanager',
	    allowMultiple: false,
	    text: 'Publish', // _('Publish')
	    disabled: true,
	    iconCls: 'action_publish',
	    scope: this,
	    handler: function() {
	        var app = this.initialConfig.app,
	            i18n = app.i18n,
	            selections = this.initialConfig.selections;
	
	        if (selections.length != 1) {
	            return;
	        }
	
	        var passwordDialog = new Tine.Tinebase.widgets.dialog.PasswordDialog({
	            allowEmptyPassword: true
	        });
	        passwordDialog.openWindow();
	
	        passwordDialog.on('passwordEntered', function (password) {
	            var date = new Date();
	            date.setDate(date.getDate() + 30);
	
	            var record = new Tine.Filemanager.Model.DownloadLink({
	                node_id: selections[0].id,
	                expiry_time: date,
	                password: password
	            });
	
	            Tine.Filemanager.downloadLinkRecordBackend.saveRecord(record, {
	                success: function (record) {
	                    Tine.Filemanager.FilePublishedDialog.openWindow({
	                        title: selections[0].data.type == 'folder' ? app.i18n._('Folder has been published successfully') : app.i18n._('File has been published successfully'),
	                        record: record,
	                        password: password
	                    });
	                }, failure: Tine.Tinebase.ExceptionHandler.handleRequestException, scope: this
	            });
	        }, this);
	    },
	    actionUpdater: function(action, grants, records, isFilterSelect) {
	        var enabled = !isFilterSelect
	            && records && records.length == 1
	            && window.lodash.get(records, '[0].data.account_grants.publishGrant', false);
	
	        action.setDisabled(!enabled);
	    }
	};
	
	/**
	 * one or multiple file nodes currently uploaded
	 */
	Tine.Filemanager.nodeActions.PauseUploadAction = {};
	
	/**
	 * one or multiple file nodes currently upload paused
	 */
	Tine.Filemanager.nodeActions.ResumeUploadAction = {};
	
	/**
	 * one or multiple file nodes currently uploaded or upload paused
	 * @TODO deletes node as well?
	 */
	Tine.Filemanager.nodeActions.CancelUploadAction = {};


/***/ },

/***/ 109:
/***/ function(module, exports, __webpack_require__) {

	/*
	 * Tine 2.0
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Martin Jatho <m.jatho@metaways.de>
	 * @copyright   Copyright (c) 2007-2012 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Filemanager');
	
	__webpack_require__(108);
	
	Tine.Filemanager.nodeContextMenu = {
	    actionMgr: Tine.Filemanager.nodeActionsMgr,
	
	    /**
	     * on pause
	     * @param {} button
	     * @param {} event
	     */
	    onPause: function (button, event) {
	
	        var grid = this.scope;
	        var gridStore = grid.store;
	        gridStore.suspendEvents();
	        var selectedRows = grid.selectionModel.getSelections();
	        for(var i=0; i < selectedRows.length; i++) {
	            var fileRecord = selectedRows[i];
	            if(fileRecord.fileRecord) {
	                fileRecord = fileRecord.fileRecord;
	            }
	            var upload = Tine.Tinebase.uploadManager.getUpload(fileRecord.get('uploadKey'));
	            upload.setPaused(true);
	        }
	        gridStore.resumeEvents();
	        grid.actionUpdater.updateActions(gridStore);
	        this.scope.selectionModel.deselectRange(0, this.scope.selectionModel.getCount());
	    },
	
	    
	    /**
	     * on resume
	     * @param {} button
	     * @param {} event
	     */
	    onResume: function (button, event) {
	        
	        var grid = this.scope;
	        var gridStore = grid.store;
	        gridStore.suspendEvents();
	        var selectedRows = grid.selectionModel.getSelections();
	        for(var i=0; i < selectedRows.length; i++) {
	            var fileRecord = selectedRows[i];
	            if(fileRecord.fileRecord) {
	                fileRecord = fileRecord.fileRecord;
	            }
	            var upload = Tine.Tinebase.uploadManager.getUpload(fileRecord.get('uploadKey'));
	            upload.resumeUpload();
	        }
	        gridStore.resumeEvents();
	        grid.actionUpdater.updateActions(gridStore);
	        this.scope.selectionModel.deselectRange(0, this.scope.selectionModel.getCount());
	
	    },
	    
	    /**
	     * checks whether resume button shuold be enabled or disabled
	     * 
	     * @param action
	     * @param grants
	     * @param records
	     */
	    isResumeEnabled: function(action, grants, records) {
	        
	        for(var i=0; i<records.length; i++) {
	            
	            var record = records[i];
	            if(record.fileRecord) {
	                record = record.fileRecord;
	            }
	            
	            if(record.get('type') == 'folder') {
	                action.hide();
	                return;
	            }
	        }
	       
	        for(var i=0; i < records.length; i++) {
	            
	            var record = records[i];
	            if(record.fileRecord) {
	                record = record.fileRecord;
	            }
	            if(!record.get('status') || (record.get('type') != 'folder' &&  record.get('status') != 'uploading' 
	                    &&  record.get('status') != 'paused' && record.get('status') != 'pending')) {
	                action.hide();
	                return;
	            }
	        }
	        
	        action.show();
	        
	        for(var i=0; i < records.length; i++) {
	            
	            var record = records[i];
	            if(record.fileRecord) {
	                record = record.fileRecord;
	            }
	            
	            if(record.get('status')) {
	                action.setDisabled(false);
	            }
	            else {
	                action.setDisabled(true);
	            }
	            if(record.get('status') && record.get('status') != 'paused') {
	                action.setDisabled(true);
	            }
	            
	        }   
	    },
	    
	    /**
	     * checks whether pause button shuold be enabled or disabled
	     * 
	     * @param action
	     * @param grants
	     * @param records
	     */
	    isPauseEnabled: function(action, grants, records) {
	        
	        for(var i=0; i<records.length; i++) {
	            
	            var record = records[i];
	            if(record.fileRecord) {
	                record = record.fileRecord;
	            }
	            
	            if(record.get('type') === 'folder') {
	                action.hide();
	                return;
	            }
	        }
	        
	        for(var i=0; i < records.length; i++) {
	            
	            var record = records[i];
	            if(record.fileRecord) {
	                record = record.fileRecord;
	            }
	            
	            if(!record.get('status') || (record.get('type ') != 'folder' && record.get('status') != 'paused'
	                    &&  record.get('status') != 'uploading' && record.get('status') != 'pending')) {
	                action.hide();
	                return;
	            }
	        }
	        
	        action.show();
	        
	        for(var i=0; i < records.length; i++) {
	            
	            var record = records[i];
	            if(record.fileRecord) {
	                record = record.fileRecord;
	            }
	            
	            if(record.get('status')) {
	                action.setDisabled(false);
	            }
	            else {
	                action.setDisabled(true);
	            }
	            if(record.get('status') && record.get('status') !=='uploading'){
	                action.setDisabled(true);
	            }
	            
	        }
	    }
	};
	
	// extends Tine.widgets.tree.ContextMenu
	Ext.applyIf(Tine.Filemanager.nodeContextMenu, Tine.widgets.tree.ContextMenu);


/***/ },

/***/ 357:
/***/ function(module, exports) {

	Ext.ns('Tine.Filemanager');
	
	Tine.Filemanager.DocumentPreview = Ext.extend(Ext.Panel, {
	    /**
	     * Node record to preview
	     */
	    record: null,
	
	    /**
	     * filemanager
	     */
	    app: null,
	
	    /**
	     * Required for overflow auto
	     */
	    autoScroll: true,
	
	    /**
	     * Overflow auto to enable scrollbar automatically
	     */
	    overflow: 'auto',
	
	    /**
	     * Layout
	     */
	    layout: 'hfit',
	
	    /**
	     * Enable scrollbar
	      */
	    containsScrollbar: true,
	
	    initComponent: function () {
	        this.addEvents(
	            /**
	             * Fires if no preview is available. Later it should be used to be fired if the browser is not able to load images.
	             */
	            'noPreviewAvailable'
	        );
	
	        Tine.Filemanager.DocumentPreview.superclass.initComponent.apply(this, arguments);
	
	        this.on('noPreviewAvailable', this.onNoPreviewAvailable.createDelegate(this));
	
	        if (!this.app) {
	            this.app = Tine.Tinebase.appMgr.get('Filemanager');
	        }
	
	        if (!this.record) {
	            this.fireEvent('noPreviewAvailable');
	            return;
	        }
	
	        this.loadPreview();
	    },
	
	    loadPreview: function () {
	        var me = this;
	
	        if ('0' === this.record.get('preview_count')) {
	            this.fireEvent('noPreviewAvailable');
	            return;
	        }
	
	        lodash.range(this.record.get('preview_count')).forEach(function (previewNumber) {
	            var path = this.record.get('path'),
	                revision = this.record.get('revision');
	
	            var url = Ext.urlEncode({
	                method: 'Filemanager.downloadPreview',
	                frontend: 'http',
	                _path: path,
	                _type: 'previews',
	                _num: previewNumber,
	                _revision: revision
	            }, Tine.Tinebase.tineInit.requestUrl + '?');
	
	            me.add({
	                html: '<img style="width: 100%;" src="' + url + '" />',
	                xtype: 'panel',
	                frame: true,
	                border: true
	            });
	        }, this);
	    },
	
	    /**
	     * Fires if no previews are available
	     */
	    onNoPreviewAvailable: function () {
	        this.html = '<b>' + this.app.i18n._('No preview available.') + '</b>';
	    }
	});
	
	Tine.Filemanager.DocumentPreview.openWindow = function (config) {
	    var id = (config.record && config.record.id) ? config.record.id : 0;
	    return Tine.WindowFactory.getWindow({
	        width: (screen.height * 0.8) / Math.sqrt(2), // DIN A4 and so on
	        height: screen.height * 0.8,
	        name: Tine.Filemanager.DocumentPreview.prototype.windowNamePrefix + id,
	        contentPanelConstructor: 'Tine.Filemanager.DocumentPreview',
	        contentPanelConstructorConfig: config,
	        modal: false,
	        windowType: 'Browser'
	    });
	};


/***/ },

/***/ 358:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2014 Metaways Infosystems GmbH (http://www.metaways.de)
	 * 
	 * TODO         maybe we don't need this
	 */
	Ext.ns('Tine.Filemanager');
	
	/**
	 * @namespace   Tine.Filemanager
	 * @class       Tine.Filemanager.DownloadLinkDialog
	 * @extends     Tine.widgets.dialog.EditDialog
	 * 
	 * <p>Sieve Filter Dialog</p>
	 * <p>This dialog is for editing sieve filters (rules).</p>
	 * <p>
	 * </p>
	 * 
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new RulesDialog
	 */
	Tine.Filemanager.DownloadLinkDialog = Ext.extend(Tine.widgets.dialog.EditDialog, {
	
	    /**
	     * @cfg {Tine.Felamimail.Model.Account}
	     * 
	     * TODO use node record?
	     */
	    node: null,
	
	    /**
	     * @private
	     */
	    windowNamePrefix: 'DownloadLinkWindow_',
	    appName: 'Filemanager',
	//    loadRecord: false,
	    mode: 'local',
	    tbarItems: [],
	    evalGrants: false,
	    
	    //private
	    initComponent: function(){
	        Tine.Filemanager.DownloadLinkDialog.superclass.initComponent.call(this);
	        
	        this.i18nRecordName = this.app.i18n._('Node Download Links');
	    },
	    
	    /**
	     * overwrite update toolbars function (we don't have record grants yet)
	     * 
	     * @private
	     */
	    updateToolbars: Ext.emptyFn,
	    
	    /**
	     * init record to edit
	     * -> we don't have a real record here
	     */
	    initRecord: function() {
	//        this.onRecordLoad();
	    },
	    
	    /**
	     * executed after record got updated from proxy
	     * -> we don't have a real record here
	     * 
	     * @private
	     */
	    onRecordLoad: function() {
	    },
	        
	    /**
	     * returns dialog
	     * 
	     * NOTE: when this method gets called, all initalisation is done.
	     * 
	     * @return {Object}
	     * @private
	     * 
	     */
	    getFormItems: function() {
	        this.linkGrid = new Tine.Filemanager.DownloadLinkGridPanel({
	            //account: this.account
	        });
	        
	        return [this.linkGrid];
	    }
	});
	
	/**
	 * DownloadLink Edit Popup
	 * 
	 * @param   {Object} config
	 * @return  {Ext.ux.Window}
	 */
	Tine.Filemanager.DownloadLinkDialog.openWindow = function (config) {
	    var window = Tine.WindowFactory.getWindow({
	        width: 800,
	        height: 400,
	        name: Tine.Filemanager.DownloadLinkDialog.prototype.windowNamePrefix + Ext.id(),
	        contentPanelConstructor: 'Tine.Filemanager.DownloadLinkDialog',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};


/***/ },

/***/ 359:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2014 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Filemanager');
	
	/**
	 * File grid panel
	 * 
	 * @namespace   Tine.Filemanager
	 * @class       Tine.Filemanager.DownloadLinkGridPanel
	 * @extends     Tine.widgets.grid.GridPanel
	 * 
	 * <p>DownloadLink Grid Panel</p>
	 * <p><pre>
	 * </pre></p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2014 Metaways Infosystems GmbH (http://www.metaways.de)
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Filemanager.FileGridPanel
	 */
	Tine.Filemanager.DownloadLinkGridPanel = Ext.extend(Ext.grid.EditorGridPanel, {
	    /* config */
	    frame: true,
	    border: true,
	    autoScroll: true,
	    layout: 'fit',
	    autoExpandColumn: 'url',
	    
	    enableHdMenu: false,
	    /**
	     * inits this cmp
	     * @private
	     */
	    initComponent: function() {
	        this.recordProxy = Tine.Filemanager.downloadLinkRecordBackend;
	        this.recordClass = Tine.Filemanager.Model.DownloadLink;
	        
	        this.store = new Ext.data.Store({
	            fields: this.recordClass,
	            proxy: this.recordProxy,
	            reader: this.recordProxy.getReader(),
	            remoteSort: false,
	            sortInfo: {
	                field: 'expiry_time',
	                direction: 'DESC'
	            },
	            listeners: {
	                scope: this,
	                'beforeload': this.onStoreBeforeload,
	                'update': this.onStoreUpdate
	            }
	        });
	        
	        this.actionCreate = new Ext.Action({
	            text: this.app.i18n._('Create Public Link'),
	            disabled: false,
	            scope: this,
	            handler: this.onCreate,
	            iconCls: 'action_add'
	        });
	        
	        this.actionRemove = new Ext.Action({
	            text: i18n._('Remove record'),
	            disabled: true,
	            scope: this,
	            handler: this.onRemove,
	            iconCls: 'action_delete'
	        });
	        
	        this.tbar = [
	            this.actionCreate,
	            this.actionRemove
	        ];
	        
	        this.contextMenu = new Ext.menu.Menu({
	            plugins: [{
	                ptype: 'ux.itemregistry',
	                key:   'Tinebase-MainContextMenu'
	            }],
	            items: [
	                this.actionCreate,
	                this.actionRemove
	            ]
	        });
	        
	        this.cm = this.getColumnModel();
	        this.sm = new Ext.grid.RowSelectionModel({multiSelect:true});
	
	        this.plugins = this.plugins ? this.plugins : [];
	        this.plugins.push(new Ext.ux.grid.GridViewMenuPlugin({}));
	        this.stripeRows = Tine.Tinebase.registry.get('preferences').get('gridStripeRows')
	            ? Tine.Tinebase.registry.get('preferences').get('gridStripeRows')
	            : false,
	        
	        // on selectionchange handler
	        this.sm.on('selectionchange', function(sm) {
	            var rowCount = sm.getCount();
	            this.actionRemove.setDisabled(rowCount == 0);
	        }, this);
	        
	        // on rowcontextmenu handler
	        this.on('rowcontextmenu', this.onRowContextMenu.createDelegate(this), this);
	        
	        Tine.Filemanager.DownloadLinkGridPanel.superclass.initComponent.call(this);
	        
	        this.initialLoad();
	    },
	    
	    /**
	     * that's the context menu handler
	     * @param {} grid
	     * @param {} row
	     * @param {} e
	     */
	    onRowContextMenu: function(grid, row, e) {
	        e.stopEvent();
	        
	        this.fireEvent('beforecontextmenu', grid, row, e);
	        
	        var sm = grid.getSelectionModel();
	        if (!sm.isSelected(row)) {
	            sm.selectRow(row);
	        }
	        
	        this.contextMenu.showAt(e.getXY());
	    },
	    
	    onCreate: function() {
	        if (! this.createMask) {
	            this.createMask = new Ext.LoadMask(this.getEl(), {
	                msg: this.app.i18n._('Creating new Download Link...')
	            });
	        }
	        this.createMask.show();
	        
	        var date = new Date();
	        date.setDate(date.getDate() + 30);
	        
	        var record = new this.recordClass({node_id: this.editDialog.record.get('id'), expiry_time: date});
	        this.recordProxy.saveRecord(record, {success: this.onAfterCreate, scope: this});
	    },
	    
	    onAfterCreate: function() {
	        this.store.load();
	        this.createMask.hide();
	    },
	    
	    onAfterDelete: function() {
	        this.store.load();
	        this.deleteMask.hide();
	    },
	    
	    /**
	     * remove handler
	     * 
	     * @param {} button
	     * @param {} event
	     */
	    onRemove: function(button, event) {
	        
	        var selectedRows = this.getSelectionModel().getSelections();
	        
	        if (selectedRows.length == 0) {
	            return;
	        }
	        
	        if (! this.deleteMask) {
	            this.deleteMask = new Ext.LoadMask(this.getEl(), {
	                msg: selectedRows.length > 1 ? this.app.i18n._('Deleting Download Links...') : this.app.i18n._('Deleting Download Link...')
	            });
	        }
	        
	        this.deleteMask.show();
	        
	        this.recordProxy.deleteRecords(selectedRows, {success: this.onAfterDelete, scope: this});
	    },
	    
	    /**
	     * called before store queries for data
	     */
	    onStoreBeforeload: function(store, options) {
	        options.params = options.params || {};
	        // allways start with an empty filter set!
	        // this is important for paging and sort header!
	        options.params.filter = [{field: 'node_id', operator: 'in', value: this.editDialog.record.get('id') }];
	    },
	    
	    /**
	     * called when the store gets updated, e.g. from editgrid
	     * 
	     * @param {Ext.data.store} store
	     * @param {Tine.Tinebase.data.Record} record
	     * @param {String} operation
	     */
	    onStoreUpdate: function(store, record, operation) {
	        switch (operation) {
	            case Ext.data.Record.EDIT:
	                // don't save these records. Add them to the parents' record store
	                this.recordProxy.saveRecord(record, {
	                    scope: this,
	                    success: function(updatedRecord) {
	                        store.commitChanges();
	
	                        // update record in store to prevent concurrency problems
	                        record.data = updatedRecord.data;
	                    }
	                });
	                break;
	            case Ext.data.Record.COMMIT:
	                //nothing to do, as we need to reload the store anyway.
	                break;
	        }
	    },
	    
	    /**
	     * returns cm
	     * 
	     * @return Ext.grid.ColumnModel
	     * @private
	     * 
	     * TODO    add more columns
	     */
	    getColumnModel: function(){
	        var columns = [{ 
	                id: 'url',
	                header: this.app.i18n._('Url'),
	                dataIndex: 'url',
	                width: 250,
	                //sortable: false,
	                hidden: false,
	                editor: new Ext.form.Field({
	                    listeners: {
	                        change: function() {
	                            this.setValue(this.startValue);
	                        }
	                    }
	                }),
	                readOnly: true,
	                disabled: true
	            }, {
	                id: 'created_by',
	                header: this.app.i18n._("Created By"),
	                width: 150,
	                sortable: true,
	                dataIndex: 'created_by',
	                hidden: false,
	                renderer: Tine.Tinebase.common.usernameRenderer
	            }, {
	                id: 'creation_time',
	                header: this.app.i18n._("Creation Time"),
	                width: 100,
	                sortable: true,
	                dataIndex: 'creation_time',
	                renderer: Tine.Tinebase.common.dateTimeRenderer,
	                hidden: true
	            }, {
	                id: 'expiry_time',
	                header: this.app.i18n._("Expiration Time"),
	                width: 100,
	                sortable: true,
	                dataIndex: 'expiry_time',
	                hidden: false,
	                renderer: Tine.Tinebase.common.dateTimeRenderer,
	                editor: new Ext.ux.form.ClearableDateField()
	            }, {
	                id: 'access_count',
	                header: this.app.i18n._("Access Count"),
	                width: 70,
	                sortable: true,
	                dataIndex: 'access_count',
	                hidden: false
	            }, {
	                id: 'last_modified_time',
	                header: this.app.i18n._("Last Modified Time"),
	                width: 100,
	                sortable: true,
	                dataIndex: 'last_modified_time',
	                hidden: true,
	                renderer: Tine.Tinebase.common.dateTimeRenderer
	            }, {
	                id: 'last_modified_by',
	                header: this.app.i18n._("Last Modified By"),
	                width: 150,
	                sortable: true,
	                dataIndex: 'last_modified_by',
	                hidden: true,
	                renderer: Tine.Tinebase.common.usernameRenderer 
	            }
	        ];
	        
	        return new Ext.grid.ColumnModel({
	            defaults: {
	                sortable: true,
	                resizable: true
	            },
	            columns: columns
	        });
	    },
	    
	    /**
	     * preform the initial load of grid data
	     */
	    initialLoad: function() {
	        this.store.load.defer(10, this.store);
	    }
	});


/***/ },

/***/ 360:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Alexander Stintzing <a.stintzing@metaways.de>
	 * @copyright   Copyright (c) 2007-2014 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	
	Ext.ns('Tine.Filemanager');
	
	/**
	 * generic exception handler for filemanager
	 * 
	 * @namespace Tine.Filemanager
	 * @param {Tine.Exception} exception
	 * @param {Object} request
	 */
	Tine.Filemanager.handleRequestException = function(exception, request) {
	
	    var app = Tine.Tinebase.appMgr.get('Filemanager'),
	        existingFilenames = [],
	        nonExistantFilenames = [],
	        i,
	        filenameWithoutPath = null;
	
	    switch(exception.code) {
	        // overwrite default 503 handling and add a link to the wiki
	        case 503:
	            Ext.MessageBox.show({
	                buttons: Ext.Msg.OK,
	                icon: Ext.MessageBox.WARNING,
	                title: i18n._('Service Unavailable'),
	                msg: String.format(app.i18n._('The Filemanager is not configured correctly. Please refer to the {0}Tine 2.0 Admin FAQ{1} for configuration advice or contact your administrator.'),
	                    '<a href="http://wiki.tine20.org/Admin_FAQ#The_message_.22filesdir_config_value_not_set.22_appears_in_the_logfile_and_I_can.27t_open_the_Filemanager" target="_blank">',
	                    '</a>')
	            });
	            break;
	
	        case 901:
	            if (request) {
	                Tine.log.debug('Tine.Filemanager.handleRequestException - request exception:');
	                Tine.log.debug(exception);
	
	                if (exception.existingnodesinfo) {
	                    for (i = 0; i < exception.existingnodesinfo.length; i++) {
	                        existingFilenames.push(exception.existingnodesinfo[i].name);
	                    }
	                }
	
	                this.conflictConfirmWin = Tine.widgets.dialog.FileListDialog.openWindow({
	                    modal: true,
	                    allowCancel: false,
	                    height: 180,
	                    width: 300,
	                    title: app.i18n._('Files already exists') + '. ' + app.i18n._('Do you want to replace the following file(s)?'),
	                    text: existingFilenames.join('<br />'),
	                    scope: this,
	                    handler: function(button) {
	                        var params = request.params,
	                            uploadKey = exception.uploadKeyArray;
	                        params.method = request.method;
	                        params.forceOverwrite = true;
	
	                        if (button == 'no') {
	                            if (params.method == 'Filemanager.moveNodes') {
	                                // reload grid
	                                var app = Tine.Tinebase.appMgr.get('Filemanager');
	                                app.getMainScreen().getCenterPanel().grid.getStore().reload();
	                                // do nothing, other nodes has been moved already
	                                return;
	                            }
	                            
	                            Tine.log.debug('Tine.Filemanager.handleRequestException::' + params.method + ' -> only non-existant nodes.');
	                            
	                            Ext.each(params.filenames, function(filename) {
	                                filenameWithoutPath = filename.match(/[^\/]*$/);
	                                if (filenameWithoutPath && existingFilenames.indexOf(filenameWithoutPath[0]) === -1) {
	                                    nonExistantFilenames.push(filename);
	                                }
	                            });
	                            
	                            params.filenames = nonExistantFilenames;
	                            
	                            uploadKey = nonExistantFilenames;
	                        } else {
	                            Tine.log.debug('Tine.Filemanager.handleRequestException::' + params.method + ' -> replace all existing nodes.');
	                        }
	
	                        if (params.method == 'Filemanager.copyNodes' || params.method == 'Filemanager.moveNodes' ) {
	                            Tine.Filemanager.fileRecordBackend.copyNodes(null, null, null, params);
	                        } else if (params.method == 'Filemanager.createNodes' ) {
	                            Tine.Filemanager.fileRecordBackend.createNodes(params, uploadKey, exception.addToGridStore);
	                        }
	                    }
	                });
	
	            } else {
	                Ext.Msg.show({
	                  title:   app.i18n._('Failure on create folder'),
	                  msg:     app.i18n._('Item with this name already exists!'),
	                  icon:    Ext.MessageBox.ERROR,
	                  buttons: Ext.Msg.OK
	               });
	            }
	            break;
	        case 902: // Filemanager_Exception_DestinationIsOwnChild
	            Ext.MessageBox.show({
	                buttons: Ext.Msg.OK,
	                icon: Ext.MessageBox.ERROR,
	                title: app.i18n._(exception.title),
	                msg: app.i18n._(exception.message)
	            });
	            break;
	        case 903: // Filemanager_Exception_DestinationIsSameNode
	            Ext.MessageBox.show({
	                buttons: Ext.Msg.OK,
	                icon: Ext.MessageBox.INFO,
	                title: app.i18n._(exception.title),
	                msg: app.i18n._(exception.message)
	            });
	            break;
	        default:
	            Tine.Tinebase.ExceptionHandler.handleRequestException(exception);
	            break;
	    }
	};

/***/ },

/***/ 361:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 *
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Michael Spahn <m.spahn@metaways.de>
	 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Filemanager');
	
	/**
	 * FilePicker component.
	 *
	 * Standalone file picker for selecting a node or a folder from filemanager.
	 * The filepicker does require the filemanager to be enabled!
	 *
	 * The filepicker offers two events:
	 *  - nodeSelected
	 *  - invalidNodeSelected
	 */
	Tine.Filemanager.FilePicker = Ext.extend(Ext.Container, {
	    /**
	     * Filemanager app
	     * @private
	     */
	    app: null,
	
	    /**
	     * Layout.
	     * @private
	     */
	    layout: 'fit',
	
	    /**
	     * NodeTreePanel instance
	     * @private
	     */
	    treePanel: null,
	
	    /**
	     * NodeGridPanel instance
	     * @private
	     */
	    gridPanel: null,
	
	    /**
	     * Selected nodes
	     * @private
	     */
	    selection: [],
	
	    /**
	     * Last clicked node
	     * @private
	     */
	    lastClickedNode: null,
	
	    /**
	     * Allow to select one or more node
	     */
	    singleSelect: true,
	
	    /**
	     * A constraint allows to alter the selection behaviour of the picker, for example only allow to select files.
	     *
	     * By default, file and folder are allowed to be selected, the concrete implementation needs to define it's purpose
	     *
	     * Valids constraints:
	     *  - file
	     *  - folder
	     *  - null (take all)
	     */
	    constraint: null,
	
	    /**
	     * Constructor.
	     */
	    initComponent: function () {
	        var model = Tine.Filemanager.Model.Node;
	        this.app = Tine.Tinebase.appMgr.get(model.getMeta('appName'));
	
	        this.treePanel = this.getTreePanel();
	        this.gridPanel = this.getGridPanel();
	
	        this.addEvents(
	            /**
	             * Fires when a file was selected which fulfills all constraints
	             *
	             * @param nodeData selected node data
	             */
	            'nodeSelected',
	            /**
	             * Fires if a node is selected which does not fulfill the provided constraints
	             */
	            'invalidNodeSelected'
	        );
	
	        this.items = [{
	            layout: 'border',
	            border: false,
	            frame: false,
	            items: [{
	                layout: 'fit',
	                region: 'west',
	                frame: false,
	                width: 200,
	                border: false,
	                split: true,
	                collapsible: true,
	                header: false,
	                collapseMode: 'mini',
	                items: [
	                    this.treePanel
	                ]
	            }, {
	                layout: 'fit',
	                split: true,
	                frame: false,
	                border: false,
	                region: 'center',
	                width: 300,
	                items: [
	                    this.gridPanel
	                ]
	            }]
	        }];
	
	        Tine.Filemanager.FilePicker.superclass.initComponent.call(this);
	    },
	
	    /**
	     * Updates selected element and triggers an event
	     */
	    updateSelection: function (nodes) {
	        // If selection doesn't fullfil constraint, we don't throw a selectionChange event
	        if (!this.checkConstraint(nodes)) {
	            this.fireEvent('invalidNodeSelected');
	            return false;
	        }
	
	        //  Clear previous selection
	        this.selection = [];
	
	        var me = this;
	        Ext.each(nodes, function (node) {
	            me.selection.push(node.data || node);
	        });
	
	        this.fireEvent('nodeSelected', this.selection);
	    },
	
	    /**
	     * @returns {Tine.Filemanager.NodeTreePanel}
	     */
	    getTreePanel: function () {
	        if (this.treePanel) {
	            return this.treePanel;
	        }
	
	        var me = this;
	        var treePanel = new Tine.Filemanager.NodeTreePanel({
	            height: 200,
	            width: 200,
	            readOnly: true,
	            filterMode: 'filterToolbar',
	            // fixme: NodeTreePanel fetches grid via app registry
	            onSelectionChange: Tine.widgets.container.TreePanel.prototype.onSelectionChange
	        });
	
	        treePanel.getSelectionModel().on('selectionchange', function (selectionModel) {
	            var treeNode = selectionModel.getSelectedNode();
	            me.updateSelection([
	                treeNode.attributes
	            ]);
	        });
	
	        return treePanel;
	    },
	
	    /**
	     * @returns {*}
	     */
	    getGridPanel: function () {
	        if (this.gridPanel) {
	            return this.gridPanel;
	        }
	
	        var me = this;
	
	        var gridPanel = new Tine.Filemanager.NodeGridPanel({
	            app: me.app,
	            height: 200,
	            width: 200,
	            border: false,
	            frame: false,
	            readOnly: true,
	            enableDD: false,
	            enableDrag: false,
	            treePanel: this.getTreePanel(),
	            hasQuickSearchFilterToolbarPlugin: false,
	            stateIdSuffix: '-FilePicker',
	            plugins: [this.getTreePanel().getFilterPlugin()]
	        });
	
	        gridPanel.getGrid().reconfigure(gridPanel.getStore(), this.getColumnModel());
	        gridPanel.getGrid().getSelectionModel().singleSelect = this.singleSelect;
	        gridPanel.getGrid().getSelectionModel().on('rowselect', function (selModel) {
	            var record = selModel.getSelections();
	            me.updateSelection(record);
	        });
	
	        // Hide filter toolbar
	        gridPanel.filterToolbar.hide();
	
	        return gridPanel;
	    },
	
	    /**
	     * Check if selection fits current constraint
	     * @returns {boolean}
	     */
	    checkConstraint: function (nodes) {
	        var me = this;
	        var valid = true;
	
	        Ext.each(nodes, function (node) {
	            if (!me.checkNodeConstraint(node.data || node)) {
	                valid = false;
	                return false;
	            }
	        });
	
	        return valid;
	    },
	
	    /**
	     * Checks if a single node matches the constraints
	     *
	     * @param node
	     * @returns {boolean}
	     */
	    checkNodeConstraint: function (node) {
	        // Minimum information to proceed here
	        if (!node.path || !node.id) {
	            return false;
	        }
	
	        // If no constraints apply, skip here
	        if (this.constraint === null) {
	            return true;
	        }
	
	        switch (this.constraint) {
	            case 'file':
	                if (node.type !== 'file') {
	                    return false;
	                }
	                break;
	            case 'folder':
	                if (node.type !== 'folder') {
	                    return false;
	                }
	                break;
	        }
	
	        return true;
	    },
	
	    /**
	     * Customized column model for the grid
	     * @returns {*}
	     */
	    getColumnModel: function () {
	        var columns = [{
	            id: 'name',
	            header: this.app.i18n._("Name"),
	            width: 70,
	            sortable: true,
	            dataIndex: 'name',
	            renderer: Ext.ux.PercentRendererWithName
	        }, {
	            id: 'size',
	            header: this.app.i18n._("Size"),
	            width: 40,
	            sortable: true,
	            dataIndex: 'size',
	            renderer: Tine.Tinebase.common.byteRenderer.createDelegate(this, [2, true], 3)
	        }, {
	            id: 'contenttype',
	            header: this.app.i18n._("Contenttype"),
	            width: 50,
	            sortable: true,
	            dataIndex: 'contenttype',
	            renderer: function (value, metadata, record) {
	
	                var app = Tine.Tinebase.appMgr.get('Filemanager');
	                if (record.data.type == 'folder') {
	                    return app.i18n._("Folder");
	                }
	                else {
	                    return value;
	                }
	            }
	        }];
	
	        return new Ext.grid.ColumnModel({
	            defaults: {
	                sortable: true,
	                resizable: true
	            },
	            columns: columns
	        });
	    }
	});


/***/ },

/***/ 362:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 *
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Michael Spahn <m.spahn@metaways.de>
	 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Filemanager');
	
	/**
	 * File picker dialog
	 *
	 * @namespace   Tine.Filemanager
	 * @class       Tine.Filemanager.FilePickerDialog
	 * @extends     Ext.Panel
	 * @constructor
	 * @param       {Object} config The configuration options.
	 */
	Tine.Filemanager.FilePickerDialog = Ext.extend(Ext.Panel, {
	    layout: 'fit',
	    border: false,
	    frame: false,
	
	    /**
	     * ok button action held here
	     */
	    okAction: null,
	
	    /**
	     * Dialog window
	     */
	    window: null,
	
	    /**
	     * Window title
	     */
	    title: null,
	
	    /**
	     * Hide panel header by default
	     */
	    header: false,
	
	    /**
	     * The validated and choosen node
	     */
	    nodes: null,
	
	    /**
	     * @todo: maybe remove
	     */
	    windowNamePrefix: 'test',
	
	    /**
	     * Allow to select one or more node
	     */
	    singleSelect: true,
	
	    /**
	     * A constraint allows to alter the selection behaviour of the picker, for example only allow to select files.
	     *
	     * By default, file and folder are allowed to be selected, the concrete implementation needs to define it's purpose
	     *
	     * Valids constraints:
	     *  - file
	     *  - folder
	     *  - null (take all)
	     */
	    constraint: null,
	
	    cls: 'tw-editdialog',
	
	    /**
	     * Constructor.
	     */
	    initComponent: function () {
	        this.addEvents(
	            /**
	             * If the dialog will close and an valid node was selected
	             * @param node
	             */
	            'selected'
	        );
	
	        this.items = [{
	            layout: 'fit',
	            items: [
	                this.getFilePicker()
	            ]
	        }];
	
	        var me = this;
	        this.okAction = new Ext.Action({
	            disabled: true,
	            text: 'Ok',
	            iconCls: 'action_saveAndClose',
	            minWidth: 70,
	            handler: this.onOk.createDelegate(me),
	            scope: this
	        });
	
	        this.fbar = [
	            '->',
	            this.okAction
	        ];
	
	        Tine.Filemanager.FilePickerDialog.superclass.initComponent.call(this);
	    },
	
	    /**
	     * button handler
	     */
	    onOk: function () {
	        this.fireEvent('selected', this.nodes);
	        this.window.close();
	    },
	
	    /**
	     * Create a new filepicker and register listener
	     * @returns {*}
	     */
	    getFilePicker: function () {
	        var picker = new Tine.Filemanager.FilePicker({
	            constraint: this.constraint,
	            singleSelect: this.singleSelect
	        });
	
	        picker.on('nodeSelected', this.onNodesSelected.createDelegate(this));
	        picker.on('invalidNodeSelected', this.onInvalidNodesSelected.createDelegate(this));
	
	        return picker;
	    },
	
	    /**
	     * If a node was selected
	     * @param node
	     */
	    onNodesSelected: function (nodes) {
	        this.nodes = nodes;
	        this.okAction.setDisabled(false);
	    },
	
	    /**
	     * If an invalid node was selected
	     */
	    onInvalidNodesSelected: function () {
	        this.okAction.setDisabled(true);
	    },
	
	    /**
	     * Creates a new pop up dialog/window (acc. configuration)
	     *
	     * @returns {null}
	     */
	    openWindow: function () {
	        this.window = Tine.WindowFactory.getWindow({
	            title: this.title,
	            closeAction: 'close',
	            modal: true,
	            width: 550,
	            height: 500,
	            layout: 'fit',
	            plain: true,
	            bodyStyle: 'padding:5px;',
	
	            items: [
	                this
	            ]
	        });
	
	        return this.window;
	    }
	});


/***/ },

/***/ 363:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 *
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Michael Spahn <m.spahn@metaways.de>
	 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	
	Ext.ns('Tine.Filemanager');
	
	Tine.Filemanager.FilePublishedDialog = Ext.extend(Ext.Panel, {
	    /**
	     * Tine.Filemanager.Model.DownloadLink
	     */
	    record: null,
	
	    /**
	     * Password used to protect downloadlink
	     */
	    password: null,
	
	    /**
	     * Filemanager
	     */
	    app: null,
	
	    windowNamePrefix: 'FilePublishedDialog_',
	
	    layout: 'fit',
	    border: false,
	    frame: false,
	
	    /**
	     * Constructor.
	     */
	    initComponent: function () {
	        if (!this.app) {
	            this.app = Tine.Tinebase.appMgr.get('Filemanager');
	        }
	
	        this.items = [{
	            border: false,
	            frame: true,
	            layout: 'border',
	            items: [{
	                region: 'center',
	                xtype: 'columnform',
	                labelAlign: 'top',
	                formDefaults: {
	                    xtype: 'textfield',
	                    anchor: '100%',
	                    labelSeparator: '',
	                    columnWidth: .333
	                },
	                items: [
	                    [{
	                        columnWidth: 1,
	                        fieldLabel: i18n._('Url'),
	                        name: 'url',
	                        value: this.record.get('url'),
	                        maxLength: 100,
	                        allowBlank: true,
	                        readOnly: true
	                    }, {
	                        columnWidth: 1,
	                        fieldLabel: i18n._('Password'),
	                        name: 'url',
	                        value: this.password,
	                        xtype: 'tw-passwordTriggerField',
	                        allowBlank: true,
	                        editable: false
	                    }, {
	                        columnWidth: 1,
	                        fieldLabel: i18n._('Valid until'),
	                        name: 'url',
	                        xtype: 'datefield',
	                        editable: false,
	                        readOnly: true,
	                        value: this.record.get('expiry_time')
	                    }]
	                ]
	            }]
	        }];
	
	        var me = this;
	
	        this.tbar = [];
	
	        if (Tine.Tinebase.appMgr.isEnabled('Felamimail')) {
	            this.sendByMailAction = new Ext.Action({
	                disabled: false,
	                text: this.app.i18n._('Send as e-mail'),
	                iconCls: 'action_composeEmail',
	                minWidth: 70,
	                handler: this.onSendAsMail.createDelegate(me),
	                scope: this
	            });
	            this.tbar.push(this.sendByMailAction);
	        }
	
	
	        Tine.Filemanager.FilePublishedDialog.superclass.initComponent.call(this);
	    },
	
	    onSendAsMail: function () {
	        var body =  this.app.i18n._("Download") + ": " + this.record.get('url');
	
	        if (this.password) {
	            body += "\n" + this.app.i18n._("Password") + ": " + this.password;
	        }
	
	        var record = new Tine.Felamimail.Model.Message({
	            'body': body
	        });
	
	        Tine.Felamimail.MessageEditDialog.openWindow({
	            record: record
	        });
	    }
	});
	
	Tine.Filemanager.FilePublishedDialog.openWindow = function (config) {
	    var id = (config.record && config.record.id) ? config.record.id : 0;
	    return Tine.WindowFactory.getWindow({
	        width: 350,
	        height: 200,
	        name: Tine.Filemanager.FilePublishedDialog.prototype.windowNamePrefix + id,
	        contentPanelConstructor: 'Tine.Filemanager.FilePublishedDialog',
	        contentPanelConstructorConfig: config,
	        modal: true
	    });
	};


/***/ },

/***/ 364:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 *
	 * @package     Tinebase
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010-2015 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	
	Ext.ns('Tine.Filemanager');
	
	/**
	 * @namespace Tine.Filemanager
	 * @class Tine.Filemanager.Application
	 * @extends Tine.Tinebase.Application
	 */
	Tine.Filemanager.Application = Ext.extend(Tine.Tinebase.Application, {
	    /**
	     * Get translated application title of this application
	     *
	     * @return {String}
	     */
	    getTitle : function() {
	        return this.i18n.gettext('Filemanager');
	    },
	
	    routes: {
	        'showNode(.*)': 'showNode'
	    },
	
	    /**
	     * display file/directory in mainscreen
	     * /#/Filemanager/showNode/shared/someFolder/someFile
	     */
	    showNode: function(path) {
	        this.getMainScreen().getCenterPanel().initialLoadAfterRender = false;
	        Tine.Tinebase.MainScreenPanel.show(this);
	        // NOTE: decodeURIComponent can't cope with +
	        path = Ext.ux.util.urlCoder.decodeURIComponent(path);
	
	        // if file, show directory file is in
	        var dirPath = path;
	        if (String(path).match(/\/.*\.[a-zA-Z0-9]+$/)) {
	            var pathParts = path.split('/');
	            pathParts.pop();
	            dirPath = pathParts.join('/');
	        }
	
	        (function() {
	            var cp = this.getMainScreen().getCenterPanel(),
	                grid = cp.getGrid(),
	                store = cp.getStore(),
	                ftb = cp.filterToolbar,
	                highlight = function() {
	                    store.un('load', highlight);
	                    var sm = grid.getSelectionModel(),
	                        idx = store.find('path', path);
	                    if (idx) {
	                        sm.selectRow(idx);
	                    }
	                };
	
	            store.on('load', highlight);
	            ftb.setValue([{field: 'path', operator: 'equals', value: dirPath}]);
	            ftb.onFiltertrigger();
	        }).defer(500, this);
	    }
	});
	
	/*
	 * register additional action for genericpickergridpanel
	 */
	Tine.widgets.relation.MenuItemManager.register('Filemanager', 'Node', {
	    text: 'Save locally',   // i18n._('Save locally')
	    iconCls: 'action_filemanager_save_all',
	    requiredGrant: 'readGrant',
	    actionType: 'download',
	    allowMultiple: false,
	    handler: function(action) {
	        var node = action.grid.store.getAt(action.gridIndex).get('related_record');
	        Tine.Filemanager.downloadFile(node);
	    }
	});
	
	/**
	 * @namespace Tine.Filemanager
	 * @class Tine.Filemanager.MainScreen
	 * @extends Tine.widgets.MainScreen
	 */
	Tine.Filemanager.MainScreen = Ext.extend(Tine.widgets.MainScreen, {
	    activeContentType: 'Node'
	});
	
	/**
	 * download file into browser
	 *
	 * @param {String|Tine.Filemanager.Model.Node}
	 * @param revision
	 * @returns {Ext.ux.file.Download}
	 */
	Tine.Filemanager.downloadFile = function(path, revision) {
	    path = lodash.get(path, 'data.path') || lodash.get(path, 'path') || path;
	
	    return new Ext.ux.file.Download({
	        params: {
	            method: 'Filemanager.downloadFile',
	            requestType: 'HTTP',
	            id: '',
	            path: path,
	            revision: revision
	        }
	    }).start();
	};

/***/ },

/***/ 365:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 *
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiß <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Filemanager');
	
	Tine.Filemanager.GrantsPanel = Ext.extend(Ext.Panel, {
	
	    /**
	     * @cfg {Tine.widgets.dialog.EditDialog}
	     */
	    editDialog: null,
	
	    /**
	     * @cfg {Tine.Tinebase.Application} app
	     */
	    app: null,
	
	    /**
	     * @property {Tine.Filemanager.Model.Node} recordClass
	     */
	    recordClass: Tine.Filemanager.Model.Node,
	
	    layout: 'fit',
	    border: false,
	
	    initComponent: function() {
	        this.app = this.app || Tine.Tinebase.appMgr.get('Filemanager');
	        this.title = this.title || this.app.i18n._('Grants');
	
	        this.editDialog.on('load', this.onRecordLoad, this);
	        this.editDialog.on('recordUpdate', this.onRecordUpdate, this);
	
	        this.hasOwnGrantsCheckbox = new Ext.form.Checkbox({
	            disabled: true,
	            boxLabel: this.app.i18n._('This folder has own grants'),
	            listeners: {scope: this, check: this.onOwnGrantsCheck}
	        });
	        this.hasOwnRightsDescription = new Ext.form.Label({
	            text: this.app.i18n._("Grants of a folder also apply recursively for all of its sub folders as long they don't have own grants itself.")
	        });
	        this.grantsGrid = new Tine.widgets.container.GrantsGrid({
	            downloadGrantTitle: 'Download', // i18n._('Download')
	            downloadGrantDescription: 'The grant to download files', // i18n._('The grant to download files')
	            publishGrantTitle: 'Publish', // i18n._('Publish')
	            publishGrantDescription: 'The grant to create anonymous download links for files', // i18n._('The grant to create anonymous download links for files')
	            grantContainer: 'Filemanager_Model_Node',
	            alwaysShowAdminGrant: true,
	            store: new Ext.data.JsonStore({
	                fields: Tine.Tinebase.Model.Grant,
	                root: 'grants'
	            }),
	            readOnly: true,
	            flex: 1
	        });
	
	        this.items = [{
	            layout: 'vbox',
	            align: 'stretch',
	            pack: 'start',
	            border: false,
	            items: [{
	                layout: 'form',
	                frame: true,
	                hideLabels: true,
	                width: '100%',
	                items: [
	                    this.hasOwnGrantsCheckbox,
	                    this.hasOwnRightsDescription
	                ]},
	                this.grantsGrid
	            ]
	        }];
	
	        this.supr().initComponent.call(this);
	    },
	
	    onOwnGrantsCheck: function(cb, checked) {
	        this.grantsGrid.setReadOnly(!checked);
	    },
	
	    onRecordLoad: function(editDialog, record, ticketFn) {
	        this.hasOwnGrantsCheckbox.setDisabled(! lodash.get(record, 'data.account_grants.adminGrant', false)
	            || record.get('type') != 'folder');
	        this.hasOwnGrantsCheckbox.setValue(record.get('acl_node') == record.id);
	
	        this.grantsGrid.useGrant('admin', !!String(record.get('path')).match(/^\/shared/));
	        this.grantsGrid.getStore().loadData(record.data);
	
	        // this.ownerCt[(record.get('type') == 'folder' ? 'un' : '') + 'hideTabStripItem'](this);
	    },
	
	    onRecordUpdate: function(editDialog, record) {
	        var acl_node = this.hasOwnGrantsCheckbox.getValue() ? record.id : '',
	            grants = [];
	
	        this.grantsGrid.getStore().each(function(r) {grants.push(r.data)});
	
	        record.set('acl_node', acl_node);
	        record.set('grants', '');
	        record.set('grants', grants);
	    }
	});

/***/ },

/***/ 366:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2007-2014 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Filemanager.Model');
	    
	/**
	 * @namespace   Tine.Filemanager.Model
	 * @class       Tine.Filemanager.Model.Node
	 * @extends     Tine.Tinebase.data.Record
	 * Example record definition
	 * 
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 */
	Tine.Filemanager.Model.Node = Tine.Tinebase.data.Record.create(Tine.Tinebase.Model.Tree_NodeArray, {
	    appName: 'Filemanager',
	    modelName: 'Node',
	    idProperty: 'id',
	    titleProperty: 'name',
	    // ngettext('File', 'Files', n); gettext('File');
	    recordName: 'File',
	    recordsName: 'Files',
	    // ngettext('Folder', 'Folders', n); gettext('Folder');
	    containerName: 'Folder',
	    containersName: 'Folders',
	
	    
	    isDropFilesAllowed: function() {
	        var grants = this.get('account_grants');
	        if(!grants) {
	            return false;
	        }
	        else if(!grants.addGrant) {
	            return false;
	        }
	        return true;
	    },
	
	    /**
	     * virtual nodes are part of the tree but don't exists / are editable
	     *
	     * NOTE: only "real" virtual node is node with path "otherUsers". all other nodes exist
	     *
	     * @returns {boolean}
	     */
	    isVirtual: function() {
	        var _ = window.lodash;
	
	        return _.indexOf(['/', Tine.Tinebase.container.getMyFileNodePath(), '/personal', '/shared'], this.get('path')) >= 0;
	    },
	
	    getSystemLink: function() {
	        var _ = window.lodash,
	            encodedPath = _.map(String(this.get('path')).replace(/(^\/|\/$)/, '').split('/'), Ext.ux.util.urlCoder.encodeURIComponent).join('/');
	
	        return [Tine.Tinebase.common.getUrl().replace(/\/$/, ''), '#/Filemanager/showNode', encodedPath].join('/');
	
	
	    }
	});
	
	// register grants for nodes
	Tine.widgets.container.GrantsManager.register('Filemanager_Model_Node', function(container) {
	    var grants = Tine.widgets.container.GrantsManager.defaultGrants();
	    grants.push('download', 'publish');
	
	    return grants;
	});
	
	/**
	 * create Node from File
	 * 
	 * @param {File} file
	 */
	Tine.Filemanager.Model.Node.createFromFile = function(file) {
	    return new Tine.Filemanager.Model.Node({
	        name: file.name ? file.name : file.fileName,  // safari and chrome use the non std. fileX props
	        size: file.size || 0,
	        type: 'file',
	        contenttype: file.type ? file.type : file.fileType, // missing if safari and chrome 
	        revision: 0
	    });
	};
	
	// NOTE: atm the activity records are stored as Tinebase_Model_Tree_Node records
	Tine.widgets.grid.RendererManager.register('Tinebase', 'Tree_Node', 'revision', function(revision, metadata, record) {
	    revision = parseInt(revision, 10);
	    var revisionString = Tine.Tinebase.appMgr.get('Filemanager').i18n._('Revision') + " " + revision,
	        availableRevisions = record.get('available_revisions');
	
	    return Ext.isArray(availableRevisions) && availableRevisions.indexOf(String(revision)) >= 0 ?
	        '<a href="#"; onclick="Tine.Filemanager.downloadFile(\'' + record.get('path')+ '\',' + revision + '); return false;">' + revisionString + '</a>' :
	        revisionString;
	});
	
	
	/**
	 * default ExampleRecord backend
	 */
	Tine.Filemanager.FileRecordBackend = Ext.extend(Tine.Tinebase.data.RecordProxy, {
	    appName: 'Filemanager',
	    modelName: 'Node',
	    recordClass: Tine.Filemanager.Model.Node,
	    
	    /**
	     * creating folder
	     * 
	     * @param name      folder name
	     * @param options   additional options
	     * @returns
	     */
	    createFolder: function(name, options) {
	        
	        options = options || {};
	        var params = {
	                application : this.appName,
	                filename : name,
	                type : 'folder',
	                method : this.appName + ".createNode"  
	        };
	        
	        options.params = params;
	        
	        options.beforeSuccess = function(response) {
	            var folder = this.recordReader(response);
	            folder.set('client_access_time', new Date());
	            this.postMessage('create', folder.data);
	            return [folder];
	        };
	
	        return this.doXHTTPRequest(options);
	    },
	    
	    /**
	     * is automatically called in generic GridPanel
	     */
	    saveRecord : function(record, request) {
	        if(record.hasOwnProperty('fileRecord')) {
	            return;
	        } else {
	            Tine.Tinebase.data.RecordProxy.prototype.saveRecord.call(this, record, request);
	        }
	    },
	
	    /**
	     * deleting file or folder
	     *
	     * overridden cause json fe works on filenames / not id's
	     *
	     * @param items     files/folders to delete
	     * @param options   additional options
	     * @returns
	     */
	    deleteItems: function(items, options) {
	        options = options || {};
	
	        var _ = window.lodash,
	            me = this,
	            filenames = new Array(),
	            nodeCount = items.length;
	
	        for(var i=0; i<nodeCount; i++) {
	            filenames.push(items[i].data.path );
	        }
	
	        var params = {
	            application: this.appName,
	            filenames: filenames,
	            method: this.appName + ".deleteNodes",
	            timeout: 300000 // 5 minutes
	        };
	
	        options.params = params;
	
	        options.beforeSuccess = function(response) {
	            var folder = this.recordReader(response);
	            folder.set('client_access_time', new Date());
	            return [folder];
	        };
	
	        // announce delte before server delete to improve ux
	        _.each(items, function(record) {
	            me.postMessage('delete', record.data);
	        });
	
	        return this.doXHTTPRequest(options);
	    },
	    
	    /**
	     * copy/move folder/files to a folder
	     *
	     * @param items files/folders to copy
	     * @param targetPath
	     *
	     * @param move
	     */
	    copyNodes : function(items, target, move, params) {
	        
	        var message = '',
	            app = Tine.Tinebase.appMgr.get(this.appName);
	        
	        if(!params) {
	        
	            if(!target || !items || items.length < 1) {
	                return false;
	            }
	            
	            var sourceFilenames = new Array(),
	                destinationFilenames = new Array(),
	                forceOverwrite = false,
	                treeIsTarget = false,
	                targetPath = target;
	            
	            if(target.data) {
	                targetPath = target.data.path + (target.data.type == 'folder' ? '/' : '');
	            }
	            else if (target.attributes) {
	                targetPath = target.attributes.path + '/';
	                treeIsTarget = true;
	            }
	
	            for(var i=0; i<items.length; i++) {
	                var item = items[i];
	                var itemData = item.data;
	                if(!itemData) {
	                    itemData = item.attributes;
	                }
	                sourceFilenames.push(itemData.path);
	                
	                var itemName = itemData.name;
	                if(typeof itemName == 'object') {
	                    itemName = itemName.name;
	                }
	
	                destinationFilenames.push(targetPath + (targetPath.match(/\/$/) ? itemName : ''));
	            }
	            
	            var method = this.appName + ".copyNodes",
	                message = app.i18n._('Copying data .. {0}');
	            if(move) {
	                method = this.appName + ".moveNodes";
	                message = app.i18n._('Moving data .. {0}');
	            }
	            
	            params = {
	                    application: this.appName,
	                    sourceFilenames: sourceFilenames,
	                    destinationFilenames: destinationFilenames,
	                    forceOverwrite: forceOverwrite,
	                    method: method
	            };
	            
	        } else {
	            message = app.i18n._('Copying data .. {0}');
	            if(params.method == this.appName + '.moveNodes') {
	                message = app.i18n._('Moving data .. {0}');
	            }
	        }
	        
	        this.loadMask = new Ext.LoadMask(app.getMainScreen().getCenterPanel().getEl(), {msg: String.format(i18n._('Please wait')) + '. ' + String.format(message, '' )});
	        app.getMainScreen().getWestPanel().setDisabled(true);
	        app.getMainScreen().getNorthPanel().setDisabled(true);
	        this.loadMask.show();
	        
	        Ext.Ajax.request({
	            params: params,
	            timeout: 300000, // 5 minutes
	            scope: this,
	            success: function(result, request){
	                
	                this.loadMask.hide();
	                app.getMainScreen().getWestPanel().setDisabled(false);
	                app.getMainScreen().getNorthPanel().setDisabled(false);
	
	                // send updates
	                var _ = window.lodash,
	                    me = this,
	                    recordsData = Ext.util.JSON.decode(result.responseText);
	
	                _.each(recordsData, function(recordData) {
	                    me.postMessage('update', recordData);
	                });
	
	
	                // var nodeData = Ext.util.JSON.decode(result.responseText),
	                //     treePanel = app.getMainScreen().getWestPanel().getContainerTreePanel(),
	                //     grid = app.getMainScreen().getCenterPanel();
	                //
	                // // Tree refresh
	                // if(treeIsTarget) {
	                //
	                //     for(var i=0; i<items.length; i++) {
	                //
	                //         var nodeToCopy = items[i];
	                //
	                //         if(nodeToCopy.data && nodeToCopy.data.type !== 'folder') {
	                //             continue;
	                //         }
	                //
	                //         if(move) {
	                //             var copiedNode = treePanel.cloneTreeNode(nodeToCopy, target),
	                //                 nodeToCopyId = nodeToCopy.id,
	                //                 removeNode = treePanel.getNodeById(nodeToCopyId);
	                //
	                //             if(removeNode && removeNode.parentNode) {
	                //                 removeNode.parentNode.removeChild(removeNode);
	                //             }
	                //
	                //             target.appendChild(copiedNode);
	                //             copiedNode.setId(nodeData[i].id);
	                //         }
	                //         else {
	                //             var copiedNode = treePanel.cloneTreeNode(nodeToCopy, target);
	                //             target.appendChild(copiedNode);
	                //             copiedNode.setId(nodeData[i].id);
	                //
	                //         }
	                //     }
	                // }
	                //
	                // // Grid refresh
	                // grid.getStore().reload();
	            },
	            failure: function(response, request) {
	                var nodeData = Ext.util.JSON.decode(response.responseText),
	                    request = Ext.util.JSON.decode(request.jsonData);
	                
	                this.loadMask.hide();
	                app.getMainScreen().getWestPanel().setDisabled(false);
	                app.getMainScreen().getNorthPanel().setDisabled(false);
	                
	                Tine.Filemanager.fileRecordBackend.handleRequestException(nodeData.data, request);
	            }
	        });
	    },
	    
	    /**
	     * upload file 
	     * 
	     * @param {} params Request parameters
	     * @param String uploadKey
	     * @param Boolean addToGridStore 
	     */
	    createNode: function(params, uploadKey, addToGridStore) {
	        var app = Tine.Tinebase.appMgr.get(this.appName),
	            me = this,
	            grid = app.getMainScreen().getCenterPanel(),
	            gridStore = grid.getStore();
	        
	        params.application = this.appName;
	        params.method = this.appName + '.createNode';
	        params.uploadKey = uploadKey;
	        params.addToGridStore = addToGridStore;
	        
	        var onSuccess = (function(result, request){
	
	            var nodeData = Ext.util.JSON.decode(response.responseText),
	                fileRecord = Tine.Tinebase.uploadManager.upload(this.uploadKey);
	
	            fileRecord.on('update', me.onUploadUpdate.createDelegate(me));
	
	            if(addToGridStore) {
	                var recordToRemove = gridStore.query('name', fileRecord.get('name'));
	                if(recordToRemove.items[0]) {
	                    gridStore.remove(recordToRemove.items[0]);
	                }
	                
	                fileRecord = Tine.Filemanager.fileRecordBackend.updateNodeRecord(nodeData[i], fileRecord);
	                var nodeRecord = new Tine.Filemanager.Model.Node(nodeData[i]);
	                
	                nodeRecord.fileRecord = fileRecord;
	                gridStore.add(nodeRecord);
	                
	            }
	        }).createDelegate({uploadKey: uploadKey, addToGridStore: addToGridStore});
	        
	        var onFailure = (function(response, request) {
	            
	            var nodeData = Ext.util.JSON.decode(response.responseText);
	            request = Ext.util.JSON.decode(request.jsonData);
	            
	            nodeData.data.uploadKey = this.uploadKey;
	            nodeData.data.addToGridStore = this.addToGridStore;
	            Tine.Filemanager.fileRecordBackend.handleRequestException(nodeData.data, request);
	            
	        }).createDelegate({uploadKey: uploadKey, addToGridStore: addToGridStore});
	        
	        Ext.Ajax.request({
	            params: params,
	            timeout: 300000, // 5 minutes
	            scope: this,
	            success: onSuccess || Ext.emptyFn,
	            failure: onFailure || Ext.emptyFn
	        });
	    },
	    
	    /**
	     * upload files
	     * 
	     * @param {} params Request parameters
	     * @param [] uploadKeyArray
	     * @param Boolean addToGridStore
	     */
	    createNodes: function (params, uploadKeyArray, addToGridStore) {
	        var app = Tine.Tinebase.appMgr.get(this.appName),
	            grid = app.getMainScreen().getCenterPanel(),
	            me = this,
	            gridStore = grid.store;
	
	        params.application = this.appName;
	        params.method = this.appName + '.createNodes';
	        params.uploadKeyArray = uploadKeyArray;
	        params.addToGridStore = addToGridStore;
	
	
	        var onSuccess = (function (response, request) {
	
	            var nodeData = Ext.util.JSON.decode(response.responseText);
	
	            for (var i = 0; i < this.uploadKeyArray.length; i++) {
	                var fileRecord = Tine.Tinebase.uploadManager.upload(this.uploadKeyArray[i]);
	
	                Tine.Tinebase.uploadManager.getUpload(this.uploadKeyArray[i]).on('update', me.onUploadUpdate.createDelegate(me));
	
	                if (addToGridStore) {
	                    fileRecord = Tine.Filemanager.fileRecordBackend.updateNodeRecord(nodeData[i], fileRecord);
	                    var nodeRecord = new Tine.Filemanager.Model.Node(nodeData[i]);
	
	                    nodeRecord.fileRecord = fileRecord;
	
	                    var existingRecordIdx = gridStore.find('name', fileRecord.get('name'));
	                    if (existingRecordIdx > -1) {
	                        gridStore.removeAt(existingRecordIdx);
	                        gridStore.insert(existingRecordIdx, nodeRecord);
	                    } else {
	                        gridStore.add(nodeRecord);
	                    }
	                }
	            }
	
	        }).createDelegate({uploadKeyArray: uploadKeyArray, addToGridStore: addToGridStore});
	
	        var onFailure = (function (response, request) {
	
	            var nodeData = Ext.util.JSON.decode(response.responseText),
	                request = Ext.util.JSON.decode(request.jsonData);
	
	            nodeData.data.uploadKeyArray = this.uploadKeyArray;
	            nodeData.data.addToGridStore = this.addToGridStore;
	            Tine.Filemanager.fileRecordBackend.handleRequestException(nodeData.data, request);
	
	        }).createDelegate({uploadKeyArray: uploadKeyArray, addToGridStore: addToGridStore});
	
	        Ext.Ajax.request({
	            params: params,
	            timeout: 300000, // 5 minutes
	            scope: this,
	            success: onSuccess || Ext.emptyFn,
	            failure: onFailure || Ext.emptyFn
	        });
	    },
	
	    /**
	     * Is fired if there is any change for an uploading file
	     *
	     * Is bind to the record proxy scope
	     */
	    onUploadUpdate: function (change, upload, fileRecord) {
	        var app = Tine.Tinebase.appMgr.get(this.appName),
	            grid = app.getMainScreen().getCenterPanel(),
	            rowsToUpdate = grid.store.query('name', fileRecord.get('name'));
	
	        if (change === 'uploadstart') {
	            Tine.Tinebase.uploadManager.onUploadStart();
	        } else if (change === 'uploadfailure') {
	            grid.onUploadFail();
	        }
	
	        if (rowsToUpdate.get(0)) {
	            if (change === 'uploadcomplete') {
	                this.onUploadComplete.call(grid, this, upload, fileRecord);
	            } else if (change === 'uploadfinished') {
	                rowsToUpdate.get(0).set('size', fileRecord.get('size'));
	                rowsToUpdate.get(0).set('contenttype', fileRecord.get('contenttype'));
	            }
	
	            rowsToUpdate.get(0).afterEdit();
	            rowsToUpdate.get(0).commit(false);
	        }
	    },
	
	    /**
	     * updating fileRecord after creating node
	     *
	     * @param response
	     * @param request
	     * @param upload
	     */
	    onNodeCreated: function (response, request, upload) {
	        var record = Ext.util.JSON.decode(response.responseText);
	
	        var fileRecord = upload.fileRecord;
	        fileRecord.beginEdit();
	        fileRecord.set('contenttype', record.contenttype);
	        fileRecord.set('created_by', Tine.Tinebase.registry.get('currentAccount'));
	        fileRecord.set('creation_time', record.creation_time);
	        fileRecord.set('revision', record.revision);
	        fileRecord.set('last_modified_by', record.last_modified_by);
	        fileRecord.set('last_modified_time', record.last_modified_time);
	        fileRecord.set('name', record.name);
	        fileRecord.set('path', record.path);
	        fileRecord.set('status', 'complete');
	        fileRecord.set('progress', 100);
	        fileRecord.commit(false);
	
	        upload.fireEvent('update', 'uploadfinished', upload, fileRecord);
	
	        var allRecordsComplete = true;
	        var storeItems = this.getStore().getRange();
	        for (var i = 0; i < storeItems.length; i++) {
	            if (storeItems[i].get('status') && storeItems[i].get('status') !== 'complete') {
	                allRecordsComplete = false;
	                break;
	            }
	        }
	
	        if (allRecordsComplete) {
	            this.pagingToolbar.refresh.enable();
	        }
	    },
	
	    /**
	     * copies uploaded temporary file to target location
	     *
	     * @param proxy  {Tine.Filemanager.fileRecordBackend}
	     * @param upload  {Ext.ux.file.Upload}
	     * @param file  {Ext.ux.file.Upload.file}
	     */
	    onUploadComplete: function(proxy, upload, file) {
	        Ext.Ajax.request({
	            timeout: 10*60*1000, // Overriding Ajax timeout - important!
	            params: {
	                method: proxy.appName + '.createNode',
	                filename: upload.id,
	                type: 'file',
	                tempFileId: file.get('id'),
	                forceOverwrite: true
	            },
	            success: proxy.onNodeCreated.createDelegate(this, [upload], true),
	            failure: proxy.onNodeCreated.createDelegate(this, [upload], true)
	        });
	
	    },
	
	    /**
	     * exception handler for this proxy
	     * 
	     * @param {Tine.Exception} exception
	     */
	    handleRequestException: function(exception, request) {
	        var _ = window.lodash,
	            appNS = _.get(Tine, this.appName);
	        appNS.handleRequestException(exception, request);
	    },
	    
	    /**
	     * updates given record with nodeData from from response
	     */
	    updateNodeRecord : function(nodeData, nodeRecord) {
	        
	        for(var field in nodeData) {
	            nodeRecord.set(field, nodeData[field]);
	        }
	        
	        return nodeRecord;
	    }
	});
	Tine.Filemanager.fileRecordBackend = new Tine.Filemanager.FileRecordBackend({});
	
	/**
	 * get filtermodel of Node records
	 * 
	 * @namespace Tine.Filemanager.Model
	 * @static
	 * @return {Object} filterModel definition
	 */ 
	Tine.Filemanager.Model.Node.getFilterModel = function() {
	    var app = Tine.Tinebase.appMgr.get('Filemanager');
	       
	    return [
	        {label : i18n._('Quick Search'), field : 'query', operators : [ 'contains' ]},
	//        {label: app.i18n._('Type'), field: 'type'}, // -> should be a combo
	        {label: app.i18n._('Contenttype'), field: 'contenttype'},
	        {label: app.i18n._('Creation Time'), field: 'creation_time', valueType: 'date'},
	        {label: app.i18n._('Description'), field: 'description', operators: ['contains', 'notcontains']},
	        {filtertype : 'tine.filemanager.pathfiltermodel', app : app},
	        {filtertype : 'tinebase.tag', app : app} 
	    ].concat(Tine.Tinebase.configManager.get('filesystem.index_content', 'Tinebase') ? [
	        {label : i18n._('File Contents'), field : 'content', operators : [ 'wordstartswith' ]},
	        {label : i18n._('Indexed'), field : 'isIndexed', valueType: 'bool'}
	    ] : []);
	};
	
	/**
	 * @namespace   Tine.Filemanager.Model
	 * @class       Tine.Filemanager.Model.DownloadLink
	 * @extends     Tine.Tinebase.data.Record
	 * Example record definition
	 */
	Tine.Filemanager.Model.DownloadLink = Tine.Tinebase.data.Record.create(Tine.Tinebase.Model.modlogFields.concat([
	    { name: 'id' },
	    { name: 'node_id' },
	    { name: 'url' },
	    { name: 'expiry_time', type: 'datetime' },
	    { name: 'access_count' },
	    { name: 'password' }
	]), {
	    appName: 'Filemanager',
	    modelName: 'DownloadLink',
	    idProperty: 'id',
	    titleProperty: 'url',
	    // ngettext('Download Link', 'Download Links', n); gettext('Download Link');
	    recordName: 'Download Link',
	    recordsName: 'Download Links'
	});
	
	/**
	 * download link backend
	 */
	Tine.Filemanager.downloadLinkRecordBackend = new Tine.Tinebase.data.RecordProxy({
	    appName: 'Filemanager',
	    modelName: 'DownloadLink',
	    recordClass: Tine.Filemanager.Model.DownloadLink
	});


/***/ },

/***/ 367:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Alexander Stintzing <a.stintzing@metaways.de>
	 * @copyright   Copyright (c) 2012-2014 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Filemanager');
	
	/**
	 * @namespace   Tine.Filemanager
	 * @class       Tine.Filemanager.NodeEditDialog
	 * @extends     Tine.widgets.dialog.EditDialog
	 * 
	 * <p>Node Compose Dialog</p>
	 * <p></p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Alexander Stintzing <a.stintzing@metaways.de>
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Filemanager.NodeEditDialog
	 */
	Tine.Filemanager.NodeEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog, {
	    
	    /**
	     * @private
	     */
	    windowNamePrefix: 'NodeEditWindow_',
	    appName: 'Filemanager',
	    recordClass: Tine.Filemanager.Model.Node,
	    recordProxy: Tine.Filemanager.fileRecordBackend,
	    tbarItems: null,
	    evalGrants: true,
	    showContainerSelector: false,
	    displayNotes: true,
	    
	    /**
	     * @type Tine.Filemanager.DownloadLinkGridPanel
	     */
	    downloadLinkGrid: null,
	    
	    initComponent: function() {
	        this.app = Tine.Tinebase.appMgr.get('Filemanager');
	        this.downloadAction = new Ext.Action({
	            requiredGrant: 'readGrant',
	            allowMultiple: false,
	            actionType: 'download',
	            text: this.app.i18n._('Save locally'),
	            handler: this.onDownload,
	            iconCls: 'action_filemanager_save_all',
	            disabled: this.record.data.type === 'folder',
	            scope: this
	        });
	        
	        this.tbarItems = [this.downloadAction];
	        
	        Tine.Filemanager.NodeEditDialog.superclass.initComponent.call(this);
	    },
	    /**
	     * folder or file?
	     */
	    getFittingTypeTranslation: function (isWindowTitle) {
	        if (isWindowTitle) {
	            return this.record.data.type == 'folder' ? this.app.i18n._('Edit folder') : this.app.i18n._('edit file');
	        } else {
	            return this.record.data.type == 'folder' ? this.app.i18n._('Folder') : this.app.i18n._('File');
	        }
	    },
	    
	    /**
	     * executed when record is loaded
	     * @private
	     */
	    onRecordLoad: function() {
	        Tine.Filemanager.NodeEditDialog.superclass.onRecordLoad.apply(this, arguments);
	        
	        this.window.setTitle(this.getFittingTypeTranslation(true));
	    },
	    
	    /**
	     * download file
	     */
	    onDownload: function() {
	        Tine.Filemanager.downloadFile(this.record);
	    },
	
	    /**
	     * returns dialog
	     * @return {Object}
	     * @private
	     */
	    getFormItems: function() {
	        var me = this,
	            _ = window.lodash,
	            fsConfig = Tine.Tinebase.configManager.get('filesystem'),
	            formFieldDefaults = {
	            xtype:'textfield',
	            anchor: '100%',
	            labelSeparator: '',
	            columnWidth: .5,
	            readOnly: true,
	            disabled: true
	        };
	        
	        this.downloadLinkGrid = new Tine.Filemanager.DownloadLinkGridPanel({
	            node: this.record,
	            app: this.app,
	            title: this.app.i18n._('Public Links'),
	            editDialog: this
	        });
	
	        // require('./GrantsPanel');
	        var grantsPanel = new Tine.Filemanager.GrantsPanel({
	            app: this.app,
	            editDialog: this
	        });
	
	        var notificationPanel = new Tine.Filemanager.NotificationPanel({
	            app: this.app,
	            editDialog: this
	        });
	
	        var revisionPanel = {};
	
	        if (_.get(fsConfig, 'modLogActive', false)) {
	            revisionPanel = new Tine.Filemanager.RevisionPanel({
	                editDialog: this
	            });
	        }
	
	        return {
	            xtype: 'tabpanel',
	            border: false,
	            plain:true,
	            plugins: [{
	                ptype : 'ux.tabpanelkeyplugin'
	            }],
	            activeTab: 0,
	            border: false,
	            items:[{
	                title: this.getFittingTypeTranslation(false),
	                autoScroll: true,
	                border: false,
	                frame: true,
	                layout: 'border',
	                items: [{
	                    region: 'center',
	                    layout: 'hfit',
	                    border: false,
	                    items: [{
	                        xtype: 'fieldset',
	                        layout: 'hfit',
	                        autoHeight: true,
	                        title: this.getFittingTypeTranslation(false),
	                        items: [{
	                            xtype: 'columnform',
	                            labelAlign: 'top',
	                            formDefaults: formFieldDefaults,
	                            items: [[{
	                                    fieldLabel: this.app.i18n._('Name'),
	                                    name: 'name',
	                                    allowBlank: false,
	                                    readOnly: false,
	                                    columnWidth: .75,
	                                    disabled: false
	                                }, {
	                                    fieldLabel: this.app.i18n._('Type'),
	                                    name: 'contenttype',
	                                    columnWidth: .25
	                                }],[{
	                                    xtype: 'displayfield',
	                                    name: 'isIndexed',
	                                    hideLabel: true,
	                                    fieldClass: 'x-ux-displayfield-text',
	                                    width: 10,
	                                    setValue: function(value) {
	                                        var string, color, html = '';
	                                        if (Tine.Tinebase.configManager.get('filesystem.index_content', 'Tinebase') && me.record.get('type') == 'file') {
	                                            string = value ? me.app.i18n._('Indexed') : me.app.i18n._('Not yet indexed');
	                                            color = value ? 'green' : 'yellow';
	                                            html = ['<span style="color:', color, ' !important;" qtip="',string, '">&bull;</span>'].join('');
	                                        }
	
	                                        this.setRawValue(html);
	                                    }
	                                }, {
	                                    xtype: 'displayfield',
	                                    name: 'path',
	                                    hideLabel: true,
	                                    fieldClass: 'x-ux-displayfield-text',
	                                    columnWidth: 1
	                                }],[
	                                Tine.widgets.form.RecordPickerManager.get('Addressbook', 'Contact', {
	                                    userOnly: true,
	                                    useAccountRecord: true,
	                                    blurOnSelect: true,
	                                    fieldLabel: this.app.i18n._('Created By'),
	                                    name: 'created_by'
	                                }), {
	                                    fieldLabel: this.app.i18n._('Creation Time'),
	                                    name: 'creation_time',
	                                    xtype: 'datefield'
	                                }
	                                ],[
	                                Tine.widgets.form.RecordPickerManager.get('Addressbook', 'Contact', {
	                                    userOnly: true,
	                                    useAccountRecord: true,
	                                    blurOnSelect: true,
	                                    fieldLabel: this.app.i18n._('Modified By'),
	                                    name: 'last_modified_by'
	                                }), {
	                                    fieldLabel: this.app.i18n._('Last Modified'),
	                                    name: 'last_modified_time',
	                                    xtype: 'datefield'
	                                }
	                                ]]
	                        }]
	                    }, revisionPanel]
	                }, {
	                    // activities and tags
	                    layout: 'accordion',
	                    animate: true,
	                    region: 'east',
	                    width: 210,
	                    split: true,
	                    collapsible: true,
	                    collapseMode: 'mini',
	                    header: false,
	                    margins: '0 5 0 5',
	                    border: true,
	                    items: [
	                        new Ext.Panel({
	                            title: this.app.i18n._('Description'),
	                            iconCls: 'descriptionIcon',
	                            layout: 'form',
	                            labelAlign: 'top',
	                            border: false,
	                            items: [{
	                                style: 'margin-top: -4px; border 0px;',
	                                labelSeparator: '',
	                                xtype: 'textarea',
	                                name: 'description',
	                                hideLabel: true,
	                                grow: false,
	                                preventScrollbars: false,
	                                anchor: '100% 100%',
	                                emptyText: this.app.i18n._('Enter description'),
	                                requiredGrant: 'editGrant'
	                            }]
	                        }),
	                        new Tine.widgets.tags.TagPanel({
	                            app: 'Filemanager',
	                            border: false,
	                            bodyStyle: 'border:1px solid #B5B8C8;'
	                        })
	                    ]
	                }]
	            },
	            new Tine.widgets.activities.ActivitiesTabPanel({
	                app: this.appName,
	                record_id: this.record.id,
	                record_model: 'Tinebase_Model_Tree_Node'
	                }),
	                this.downloadLinkGrid,
	                {xtype: 'Tine.Filemanager.UsagePanel'},
	                grantsPanel,
	                notificationPanel
	            ]
	        }
	    }
	});
	
	/**
	 * Filemanager Edit Popup
	 * 
	 * @param   {Object} config
	 * @return  {Ext.ux.Window}
	 */
	Tine.Filemanager.NodeEditDialog.openWindow = function (config) {
	    var id = (config.record && config.record.id) ? config.record.id : 0;
	    var window = Tine.WindowFactory.getWindow({
	        width: 800,
	        height: 570,
	        name: Tine.Filemanager.NodeEditDialog.prototype.windowNamePrefix + id,
	        contentPanelConstructor: 'Tine.Filemanager.NodeEditDialog',
	        contentPanelConstructorConfig: config
	    });
	    
	    return window;
	};


/***/ },

/***/ 368:
/***/ function(module, exports, __webpack_require__) {

	/*
	 * Tine 2.0
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Martin Jatho <m.jatho@metaways.de>
	 * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Filemanager');
	
	__webpack_require__(108);
	__webpack_require__(109);
	
	/**
	 * File grid panel
	 *
	 * @namespace   Tine.Filemanager
	 * @class       Tine.Filemanager.NodeGridPanel
	 * @extends     Tine.widgets.grid.GridPanel
	 *
	 * <p>Node Grid Panel</p>
	 * <p><pre>
	 * </pre></p>
	 *
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Martin Jatho <m.jatho@metaways.de>
	 * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Filemanager.FileGridPanel
	 */
	Tine.Filemanager.NodeGridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
	    /**
	     * @cfg filesProperty
	     * @type String
	     */
	    filesProperty: 'files',
	
	    /**
	     * config values
	     * @private
	     */
	    header: false,
	    border: false,
	    deferredRender: false,
	    autoExpandColumn: 'name',
	    showProgress: true,
	    enableDD: true,
	
	    recordClass: Tine.Filemanager.Model.Node,
	    listenMessageBus: true,
	    hasDetailsPanel: false,
	    evalGrants: true,
	    // initialLoadAfterRender: false,
	
	    /**
	     * grid specific
	     * @private
	     */
	    currentFolderNode: null,
	
	    previewsEnabled: false,
	
	    /**
	     * inits this cmp
	     * @private
	     */
	    initComponent: function() {
	        Ext.applyIf(this.defaultSortInfo, {field: 'name', direction: 'DESC'});
	        Ext.applyIf(this.gridConfig, {
	            autoExpandColumn: 'name',
	            enableFileDialog: false,
	            enableDragDrop: true,
	            ddGroup: 'fileDDGroup',
	            listeners: {
	                scope: this,
	                afterrender: this.initDragDrop
	            }
	        });
	
	        if (this.readOnly || ! this.enableDD) {
	            this.gridConfig.enableDragDrop = false;
	        }
	
	        this.previewsEnabled = Tine.Tinebase.configManager.get('filesystem').createPreviews;
	
	        this.recordProxy = this.recordProxy || Tine.Filemanager.fileRecordBackend;
	
	        this.gridConfig.cm = this.getColumnModel();
	
	        this.defaultFilters = [
	            {field: 'query', operator: 'contains', value: ''},
	            {field: 'path', operator: 'equals', value: Tine.Tinebase.container.getMyFileNodePath()}
	        ];
	
	        this.plugins = this.plugins || [];
	
	        this.filterToolbar = this.filterToolbar || this.getFilterToolbar();
	
	        this.plugins.push(this.filterToolbar);
	
	        if (!this.readOnly) {
	            this.plugins.push({
	                ptype: 'ux.browseplugin',
	                multiple: true,
	                scope: this,
	                enableFileDialog: false,
	                handler: this.onFilesSelect.createDelegate(this)
	            });
	        }
	
	        if (this.hasQuickSearchFilterToolbarPlugin) {
	            this.filterToolbar.getQuickFilterPlugin().criteriaIgnores.push({field: 'path'});
	        }
	
	        Tine.Filemanager.NodeGridPanel.superclass.initComponent.call(this);
	        this.getStore().on('load', this.onLoad.createDelegate(this));
	
	        // // cope with empty selections - dosn't work. It's confusing if e.g. the delte btn is enabled with no selections
	        // this.selectionModel.on('selectionchange', function(sm) {
	        //     if (sm.getSelections().length) {
	        //         return;
	        //     }
	        //
	        //     var _ = window.lodash,
	        //         recordData = _.get(this, 'currentFolderNode.attributes'),
	        //         record = recordData ? Tine.Tinebase.data.Record.setFromJson(JSON.stringify(recordData), this.recordClass) : null;
	        //
	        //     if (record) {
	        //         this.actionUpdater.updateActions(record);
	        //     }
	        // }, this);
	    },
	
	    /**
	     * after grid renderd
	     */
	    initDragDrop: function () {
	        if (! this.enableDD) {
	            return;
	        }
	
	        var grid = this.grid,
	            view = grid.getView();
	
	        view.dragZone.onBeforeDrag = this.onBeforeDrag.createDelegate(this);
	
	        this.dropZone = new Ext.dd.DropZone(this.getEl(), {
	            ddGroup: 'fileDDGroup',
	            onNodeOver: this.onNodeOver.createDelegate(this),
	            onNodeDrop: this.onNodeDrop.createDelegate(this),
	            getTargetFromEvent: function(e) {
	                var idx = view.findRowIndex(e.target),
	                    record = grid.getStore().getAt(idx);
	
	                return record;
	            }
	        })
	    },
	
	    /**
	     * An empty function by default, but provided so that you can perform a custom action before the initial
	     * drag event begins and optionally cancel it.
	     * @param {Object} data An object containing arbitrary data to be shared with drop targets
	     * @param {Event} e The event object
	     * @return {Boolean} isValid True if the drag event is valid, else false to cancel
	     */
	    onBeforeDrag: function(data, e) {
	        var _ = window.lodash,
	            // @TODO: rethink: do I need delte on the record or parent?
	            requiredGrant = e.ctrlKey || e.altKey ? 'readGrant' : 'editGrant';
	
	        return !this.selectionModel.isFilterSelect &&
	            _.reduce(this.selectionModel.getSelections(), function(allowed, record) {
	                return allowed && !! _.get(record, 'data.account_grants.' + requiredGrant);
	            }, true);
	    },
	
	    /*
	     * @param {Object} nodeData The custom data associated with the drop node (this is the same value returned from {@link #getTargetFromEvent} for this node)
	     * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop zone
	     * @param {Event} e The event
	     * @param {Object} data An object containing arbitrary data supplied by the drag source
	     * @return {String} status The CSS class that communicates the drop status back to the source so that the underlying {@link Ext.dd.StatusProxy} can be updated
	     */
	    onNodeOver: function(record, source, e, data) {
	        var _ = window.lodash,
	            dropAllowed =
	                record.get('type') == 'folder'
	                && _.get(record, 'data.account_grants.addGrant', false)
	                && source == this.grid.getView().dragZone,
	            action = e.ctrlKey || e.altKey ? 'copy' : 'move'
	
	        return dropAllowed ?
	            'tinebase-dd-drop-ok-' + action :
	            Ext.dd.DropZone.prototype.dropNotAllowed;
	    },
	
	    /**
	     * Called when the DropZone determines that a {@link Ext.dd.DragSource} has been dropped onto
	     * the drop node.  The default implementation returns false, so it should be overridden to provide the
	     * appropriate processing of the drop event and return true so that the drag source's repair action does not run.
	     * @param {Object} nodeData The custom data associated with the drop node (this is the same value returned from
	     * {@link #getTargetFromEvent} for this node)
	     * @param {Ext.dd.DragSource} source The drag source that was dragged over this drop zone
	     * @param {Event} e The event
	     * @param {Object} data An object containing arbitrary data supplied by the drag source
	     * @return {Boolean} True if the drop was valid, else false
	     */
	    onNodeDrop: function(target, dd, e, data) {
	        Tine.Filemanager.fileRecordBackend.copyNodes(data.selections, target, !(e.ctrlKey || e.altKey));
	        this.grid.getStore().remove(data.selections);
	        return true;
	    },
	
	    /**
	     * returns cm
	     *
	     * @return Ext.grid.ColumnModel
	     * @private
	     */
	    getColumnModel: function(){
	        var columns = [{
	                id: 'tags',
	                header: this.app.i18n._('Tags'),
	                dataIndex: 'tags',
	                width: 50,
	                renderer: Tine.Tinebase.common.tagsRenderer,
	                sortable: false,
	                hidden: false
	            }, {
	                id: 'name',
	                header: this.app.i18n._("Name"),
	                width: 70,
	                sortable: true,
	                dataIndex: 'name',
	                renderer: Ext.ux.PercentRendererWithName
	            },{
	                id: 'size',
	                header: this.app.i18n._("Size"),
	                width: 40,
	                sortable: true,
	                dataIndex: 'size',
	                renderer: Tine.Tinebase.common.byteRenderer.createDelegate(this, [2, true], 3)
	            },{
	                id: 'contenttype',
	                header: this.app.i18n._("Contenttype"),
	                width: 50,
	                sortable: true,
	                dataIndex: 'contenttype',
	                renderer: function(value, metadata, record) {
	
	                    var app = Tine.Tinebase.appMgr.get('Filemanager');
	                    if(record.data.type == 'folder') {
	                        return app.i18n._("Folder");
	                    }
	                    else {
	                        return value;
	                    }
	                }
	            },{
	                id: 'creation_time',
	                header: this.app.i18n._("Creation Time"),
	                width: 50,
	                sortable: true,
	                dataIndex: 'creation_time',
	                renderer: Tine.Tinebase.common.dateTimeRenderer
	            },{
	                id: 'created_by',
	                header: this.app.i18n._("Created By"),
	                width: 50,
	                sortable: true,
	                dataIndex: 'created_by',
	                renderer: Tine.Tinebase.common.usernameRenderer
	            },{
	                id: 'last_modified_time',
	                header: this.app.i18n._("Last Modified Time"),
	                width: 80,
	                sortable: true,
	                dataIndex: 'last_modified_time',
	                renderer: Tine.Tinebase.common.dateTimeRenderer
	            },{
	                id: 'last_modified_by',
	                header: this.app.i18n._("Last Modified By"),
	                width: 50,
	                sortable: true,
	                dataIndex: 'last_modified_by',
	                renderer: Tine.Tinebase.common.usernameRenderer
	            }
	        ];
	
	        if (Tine.Tinebase.configManager.get('filesystem.modLogActive', 'Tinebase')) {
	            columns.push({
	                id: 'revision_size',
	                header: this.app.i18n._("Revision Size"),
	                tooltip: this.app.i18n._("Total size of all available revisions"),
	                width: 40,
	                sortable: true,
	                dataIndex: 'revision_size',
	                hidden: true,
	                renderer: Tine.Tinebase.common.byteRenderer.createDelegate(this, [2, true], 3)
	            });
	        }
	
	        if (Tine.Tinebase.configManager.get('filesystem.index_content', 'Tinebase')) {
	            columns.push({
	                id: 'isIndexed',
	                header: this.app.i18n._("Indexed"),
	                tooltip: this.app.i18n._("File contents is part of the search index"),
	                width: 40,
	                sortable: true,
	                dataIndex: 'isIndexed',
	                hidden: true,
	                renderer: function(value, i, node) {
	                    return node.get('type') == 'file' ? Tine.Tinebase.common.booleanRenderer(value) : '';
	                }
	            });
	        }
	
	        return new Ext.grid.ColumnModel({
	            defaults: {
	                sortable: true,
	                resizable: true
	            },
	            columns: columns
	        });
	    },
	
	    /**
	     * status column renderer
	     * @param {string} value
	     * @return {string}
	     */
	    statusRenderer: function(value) {
	        return this.app.i18n._hidden(value);
	    },
	
	    /**
	     * Capture space to toggle document preview
	     */
	    onKeyDown: function(e) {
	        Tine.Filemanager.NodeGridPanel.superclass.onKeyDown.apply(this, arguments);
	
	
	        if (!this.previewsEnabled) {
	            return true;
	        }
	
	        // Open preview on space if a node is selected and the node type equals file
	        if (e.getKey() === 32) {
	            this.action_preview.execute()
	        }
	    },
	
	    /**
	     * init ext grid panel
	     * @private
	     */
	    initGrid: function() {
	        Tine.Filemanager.NodeGridPanel.superclass.initGrid.call(this);
	
	        if (this.usePagingToolbar) {
	           this.initPagingToolbar();
	        }
	    },
	
	    /**
	     * inserts a quota Message when using old Browsers with html4upload
	     */
	    initPagingToolbar: function() {
	        if(!this.pagingToolbar || !this.pagingToolbar.rendered) {
	            this.initPagingToolbar.defer(50, this);
	            return;
	        }
	        // old browsers
	        if (!((! Ext.isGecko && window.XMLHttpRequest && window.File && window.FileList) || (Ext.isGecko && window.FileReader))) {
	            var text = new Ext.Panel({padding: 2, html: String.format(this.app.i18n._('The max. Upload Filesize is {0} MB'), Tine.Tinebase.registry.get('maxFileUploadSize') / 1048576 )});
	            this.pagingToolbar.insert(12, new Ext.Toolbar.Separator());
	            this.pagingToolbar.insert(12, text);
	            this.pagingToolbar.doLayout();
	        }
	    },
	
	    /**
	     * returns filter toolbar -> supress OR filters
	     * @private
	     */
	    getFilterToolbar: function(config) {
	        config = config || {};
	        var plugins = [];
	
	        if (this.hasQuickSearchFilterToolbarPlugin) {
	            this.quickSearchFilterToolbarPlugin = new Tine.widgets.grid.FilterToolbarQuickFilterPlugin();
	            plugins.push(this.quickSearchFilterToolbarPlugin);
	        }
	
	        return new Tine.widgets.grid.FilterToolbar(Ext.apply(config, {
	            app: this.app,
	            recordClass: this.recordClass,
	            filterModels: this.recordClass.getFilterModel().concat(this.getCustomfieldFilters()),
	            defaultFilter: 'query',
	            filters: this.defaultFilters || [],
	            plugins: plugins
	        }));
	    },
	
	    /**
	     * returns add action / test
	     *
	     * @return {Object} add action config
	     */
	    getAddAction: function () {
	        return {
	            requiredGrant: 'addGrant',
	            actionType: 'add',
	            text: this.app.i18n._('Upload'),
	            handler: this.onFilesSelect,
	            disabled: true,
	            scope: this,
	            plugins: [{
	                ptype: 'ux.browseplugin',
	                multiple: true,
	                enableFileDrop: false,
	                disable: true
	            }],
	            iconCls: this.app.appName + 'IconCls',
	            actionUpdater: function(action) {
	                var _ = window.lodash,
	                    allowAdd = _.get(this, 'currentFolderNode.attributes.account_grants.addGrant', false);
	
	                action.setDisabled(!allowAdd);
	            }.createDelegate(this)
	        };
	    },
	
	    initLayout: function() {
	        Tine.Filemanager.NodeGridPanel.superclass.initLayout.call(this);
	
	        var northPanel = lodash.find(this.items, function (i) {
	            return i.region == 'north'
	        });
	
	        northPanel.tbar = new Tine.Filemanager.RecursiveFilter({
	            gridPanel: this,
	            hidden: true
	        });
	    },
	
	    /**
	     * init actions with actionToolbar, contextMenu and actionUpdater
	     * @private
	     */
	    initActions: function() {
	        // generic node actions - work on selections grid/tree nodes
	        this.action_createFolder = Tine.Filemanager.nodeActionsMgr.get('createFolder');
	        this.action_editFile = Tine.Filemanager.nodeActionsMgr.get('edit');
	        this.action_deleteRecord = Tine.Filemanager.nodeActionsMgr.get('delete');
	        this.action_download = Tine.Filemanager.nodeActionsMgr.get('download');
	        this.action_moveRecord = Tine.Filemanager.nodeActionsMgr.get('move');
	        this.action_publish = Tine.Filemanager.nodeActionsMgr.get('publish');
	        this.action_systemLink = Tine.Filemanager.nodeActionsMgr.get('systemLink');
	
	        if (this.previewsEnabled) {
	            this.action_preview = Tine.Filemanager.nodeActionsMgr.get('preview');
	        }
	
	        // grid only actions - work on node which is displayed (this.currentFolderNode)
	        // @TODO: fixme - ux problems with filterselect / initialData
	        this.action_upload = new Ext.Action(this.getAddAction());
	        this.action_goUpFolder = new Ext.Action({
	            allowMultiple: true,
	            actionType: 'goUpFolder',
	            text: this.app.i18n._('Folder Up'),
	            handler: this.onLoadParentFolder,
	            iconCls: 'action_filemanager_folder_up',
	            disabled: true,
	            scope: this,
	            actionUpdater: function(action) {
	                var _ = window.lodash,
	                    path = _.get(this, 'currentFolderNode.attributes.path', false);
	
	                action.setDisabled(path == '/');
	            }.createDelegate(this)
	        });
	
	        var contextActions = [this.action_deleteRecord, 'rename', this.action_moveRecord, this.action_download, 'resume', 'pause', this.action_editFile, this.action_publish, this.action_systemLink];
	
	        if (this.previewsEnabled) {
	            contextActions.push(this.action_preview);
	        }
	
	        this.contextMenu = Tine.Filemanager.nodeContextMenu.getMenu({
	            nodeName: Tine.Filemanager.Model.Node.getRecordName(),
	            actions: contextActions,
	            scope: this,
	            backend: 'Filemanager',
	            backendModel: 'Node'
	        });
	
	        this.folderContextMenu = Tine.Filemanager.nodeContextMenu.getMenu({
	            nodeName: Tine.Filemanager.Model.Node.getContainerName(),
	            actions: [this.action_deleteRecord, 'rename', this.action_moveRecord, this.action_editFile, this.action_publish, this.action_systemLink],
	            scope: this,
	            backend: 'Filemanager',
	            backendModel: 'Node'
	        });
	
	        this.actionUpdater.addActions(this.contextMenu.items);
	        this.actionUpdater.addActions(this.folderContextMenu.items);
	
	        var actions = [
	            this.action_upload,
	            this.action_createFolder,
	            this.action_goUpFolder,
	            this.action_download,
	            this.action_deleteRecord,
	            this.action_editFile,
	            this.action_publish,
	            this.action_systemLink
	        ];
	
	        if (this.previewsEnabled) {
	            actions.push(this.action_preview);
	        }
	
	        this.actionUpdater.addActions(actions);
	    },
	
	    /**
	     * get the right contextMenu
	     */
	    getContextMenu: function(grid, row, e) {
	        var r = this.store.getAt(row),
	            type = r ? r.get('type') : null;
	
	        return type === 'folder' ? this.folderContextMenu : this.contextMenu;
	    },
	
	    /**
	     * get action toolbar
	     *
	     * @return {Ext.Toolbar}
	     */
	    getActionToolbar: function() {
	        if (! this.actionToolbar) {
	            var items = [
	                this.splitAddButton ?
	                    Ext.apply(new Ext.SplitButton(this.action_upload), {
	                        scale: 'medium',
	                        rowspan: 2,
	                        iconAlign: 'top',
	                        arrowAlign:'right',
	                        menu: new Ext.menu.Menu({
	                            items: [],
	                            plugins: [{
	                                ptype: 'ux.itemregistry',
	                                key:   'Tine.widgets.grid.GridPanel.addButton'
	                            }, {
	                                ptype: 'ux.itemregistry',
	                                key:   'Tinebase-MainContextMenu'
	                            }]
	                        })
	                    }) :
	                    Ext.apply(new Ext.Button(this.action_upload), {
	                        scale: 'medium',
	                        rowspan: 2,
	                        iconAlign: 'top'
	                    }),
	
	                Ext.apply(new Ext.Button(this.action_editFile), {
	                    scale: 'medium',
	                    rowspan: 2,
	                    iconAlign: 'top'
	                }),
	                Ext.apply(new Ext.Button(this.action_deleteRecord), {
	                    scale: 'medium',
	                    rowspan: 2,
	                    iconAlign: 'top'
	                }),
	                Ext.apply(new Ext.Button(this.action_createFolder), {
	                    scale: 'medium',
	                    rowspan: 2,
	                    iconAlign: 'top'
	                }),
	                Ext.apply(new Ext.Button(this.action_goUpFolder), {
	                    scale: 'medium',
	                    rowspan: 2,
	                    iconAlign: 'top'
	                }),
	                Ext.apply(new Ext.Button(this.action_download), {
	                    scale: 'medium',
	                    rowspan: 2,
	                    iconAlign: 'top'
	                }),
	                Ext.apply(new Ext.Button(this.action_publish), {
	                    scale: 'medium',
	                    rowspan: 2,
	                    iconAlign: 'top'
	                }),
	                Ext.apply(new Ext.Button(this.action_systemLink), {
	                    scale: 'medium',
	                    rowspan: 2,
	                    iconAlign: 'top'
	                })
	            ];
	
	            if (this.previewsEnabled) {
	                items.push(Ext.apply(new Ext.Button(this.action_preview), {
	                    scale: 'medium',
	                    rowspan: 2,
	                    iconAlign: 'top'
	                }));
	            }
	
	            this.actionToolbar = new Ext.Toolbar({
	                defaults: {height: 55},
	                items: [{
	                    xtype: 'buttongroup',
	                    layout: 'toolbar',
	                    buttonAlign: 'left',
	                    columns: 8,
	                    defaults: {minWidth: 60},
	                    items: items
	                }, this.getActionToolbarItems()]
	            });
	
	            this.actionToolbar.on('resize', this.onActionToolbarResize, this, {buffer: 250});
	            this.actionToolbar.on('show', this.onActionToolbarResize, this);
	
	            if (this.filterToolbar && typeof this.filterToolbar.getQuickFilterField == 'function') {
	                this.actionToolbar.add('->', this.filterToolbar.getQuickFilterField());
	            }
	        }
	
	        return this.actionToolbar;
	    },
	
	    /**
	     * grid row doubleclick handler
	     *
	     * @param {Tine.Filemanager.NodeGridPanel} grid
	     * @param {} row record
	     * @param {Ext.EventObjet} e
	     */
	    onRowDblClick: function (grid, row, e) {
	        var app = this.app;
	        var rowRecord = grid.getStore().getAt(row);
	        var _ = window.lodash;
	        var prefs = this.app.getRegistry().get('preferences');
	
	        if (prefs.get('dbClickAction') === 'download' && rowRecord.data.type == 'file' && !this.readOnly && _.get(rowRecord, 'data.account_grants.downloadGrant', false)) {
	            Tine.Filemanager.downloadFile(rowRecord);
	        } else if (this.previewsEnabled && prefs.get('dbClickAction') === 'preview' && rowRecord.data.type == 'file' && !this.readOnly && _.get(rowRecord, 'data.account_grants.readGrant', false)) {
	            this.action_preview.execute();
	        } else if (rowRecord.data.type == 'folder') {
	            var treePanel = this.treePanel || app.getMainScreen().getWestPanel().getContainerTreePanel();
	
	            var currentFolderNode = treePanel.getNodeById(rowRecord.id);
	
	            if (currentFolderNode) {
	                currentFolderNode.select();
	                currentFolderNode.expand();
	                this.currentFolderNode = currentFolderNode;
	            } else {
	                // get   ftb path filter
	                this.filterToolbar.filterStore.each(function (filter) {
	                    var field = filter.get('field');
	                    if (field === 'path') {
	                        filter.set('value', '');
	                        filter.set('value', rowRecord.data);
	                        filter.formFields.value.setValue(rowRecord.get('path'));
	
	                        this.filterToolbar.onFiltertrigger();
	                        return false;
	                    }
	                }, this);
	            }
	        }
	    },
	
	    /**
	     * on remove handler
	     *
	     * @param {} button
	     * @param {} event
	     */
	    onRemove: function (button, event) {
	        var selectedRows = this.selectionModel.getSelections();
	        for (var i = 0; i < selectedRows.length; i += 1) {
	            this.store.remove(selectedRows[i]);
	            var upload = Tine.Tinebase.uploadManager.getUpload(selectedRows[i].get('uploadKey'));
	
	            if (upload) {
	                upload.setPaused(true);
	            }
	        }
	    },
	
	    /**
	     * populate grid store
	     *
	     * @param {} record
	     */
	    loadRecord: function (record) {
	        if (record && record.get(this.filesProperty)) {
	            var files = record.get(this.filesProperty);
	            for (var i = 0; i < files.length; i += 1) {
	                var file = new Ext.ux.file.Upload.file(files[i]);
	                file.set('status', 'complete');
	                file.set('nodeRecord', new Tine.Filemanager.Model.Node(file.data));
	                this.store.add(file);
	            }
	        }
	    },
	
	    /**
	     * upload new file and add to store
	     *
	     * @param {ux.BrowsePlugin} fileSelector
	     * @param {} e
	     */
	    onFilesSelect: function (fileSelector, event) {
	        var app = Tine.Tinebase.appMgr.get('Filemanager'),
	            grid = this,
	            targetNode = grid.currentFolderNode,
	            gridStore = grid.store,
	            rowIndex = false,
	            targetFolderPath = grid.currentFolderNode.attributes.path,
	            addToGrid = true,
	            dropAllowed = false,
	            nodeRecord = null;
	
	        if(event && event.getTarget()) {
	            rowIndex = grid.getView().findRowIndex(event.getTarget());
	        }
	
	
	        if(targetNode.attributes) {
	            nodeRecord = targetNode.attributes.nodeRecord;
	        }
	
	        if(rowIndex !== false && rowIndex > -1) {
	            var newTargetNode = gridStore.getAt(rowIndex);
	            if(newTargetNode && newTargetNode.data.type == 'folder') {
	                targetFolderPath = newTargetNode.data.path;
	                addToGrid = false;
	                nodeRecord = new Tine.Filemanager.Model.Node(newTargetNode.data);
	            }
	        }
	
	        if(!nodeRecord.isDropFilesAllowed()) {
	            Ext.MessageBox.alert(
	                    i18n._('Upload Failed'),
	                    app.i18n._('Putting files in this folder is not allowed!')
	            ).setIcon(Ext.MessageBox.ERROR);
	
	            return;
	        }
	
	        var files = fileSelector.getFileList();
	
	        var filePathsArray = [], uploadKeyArray = [];
	
	        Ext.each(files, function (file) {
	            if ("" === file.type) {
	                return true;
	            }
	
	            var fileRecord = Tine.Filemanager.Model.Node.createFromFile(file),
	                filePath = targetFolderPath + '/' + fileRecord.get('name');
	
	            fileRecord.set('path', filePath);
	            var existingRecordIdx = gridStore.find('name', fileRecord.get('name'));
	            if(existingRecordIdx < 0) {
	                gridStore.add(fileRecord);
	            }
	
	            var upload = new Ext.ux.file.Upload({
	                fmDirector: grid,
	                file: file,
	                fileSelector: fileSelector,
	                id: filePath
	            });
	
	            var uploadKey = Tine.Tinebase.uploadManager.queueUpload(upload);
	
	            filePathsArray.push(filePath);
	            uploadKeyArray.push(uploadKey);
	
	        }, this);
	
	        if (0 === uploadKeyArray.length) {
	            return;
	        }
	
	        var params = {
	                filenames: filePathsArray,
	                type: "file",
	                tempFileIds: [],
	                forceOverwrite: false
	        };
	        Tine.Filemanager.fileRecordBackend.createNodes(params, uploadKeyArray, true);
	    },
	
	    /**
	     * grid on load handler
	     *
	     * @param grid
	     * @param records
	     * @param options
	     */
	    onLoad: function(store, records, options){
	        var grid = this;
	
	        for(var i=records.length-1; i>=0; i--) {
	            var record = records[i];
	            if(record.get('type') == 'file' && (!record.get('size') || record.get('size') == 0)) {
	                var upload = Tine.Tinebase.uploadManager.getUpload(record.get('path'));
	
	                if(upload) {
	                      if(upload.fileRecord && record.get('name') == upload.fileRecord.get('name')) {
	                          grid.updateNodeRecord(record, upload.fileRecord);
	                          record.afterEdit();
	                    }
	                }
	            }
	        }
	    },
	
	    /**
	     * update grid nodeRecord with fileRecord data
	     *
	     * @param nodeRecord
	     * @param fileRecord
	     */
	    updateNodeRecord: function(nodeRecord, fileRecord) {
	        for(var field in fileRecord.fields) {
	            nodeRecord.set(field, fileRecord.get(field));
	        }
	        nodeRecord.fileRecord = fileRecord;
	    }
	});


/***/ },

/***/ 369:
/***/ function(module, exports, __webpack_require__) {

	/*
	 * Tine 2.0
	 *
	 * @package     Tinebase
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010-2012 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	
	Ext.ns('Tine.Filemanager');
	
	__webpack_require__(109);
	
	/**
	 * @namespace Tine.Filemanager
	 * @class Tine.Filemanager.NodeTreePanel
	 * @extends Tine.widgets.container.TreePanel
	 *
	 * @author Martin Jatho <m.jatho@metaways.de>
	 */
	Tine.Filemanager.NodeTreePanel = Ext.extend(Tine.widgets.container.TreePanel, {
	
	    filterMode : 'filterToolbar',
	
	    recordClass : Tine.Filemanager.Model.Node,
	
	    allowMultiSelection : false,
	
	    ddGroup: 'fileDDGroup',
	    enableDD: true,
	
	    initComponent: function() {
	        this.on('nodedragover', this.onNodeDragOver, this);
	
	        if (! this.app) {
	            this.app = Tine.Tinebase.appMgr.get(this.recordClass.getMeta('appName'));
	        }
	
	        if (this.readOnly) {
	            this.enableDD = false;
	        }
	
	        this.defaultContainerPath = Tine.Tinebase.container.getMyFileNodePath();
	
	        this.dragConfig = {
	            ddGroup: this.ddGroup,
	            scroll: this.ddScroll,
	            onBeforeDrag: this.onBeforeDrag.createDelegate(this)
	        };
	
	        this.dropConfig = {
	            ddGroup: this.ddGroup,
	            appendOnly: this.ddAppendOnly === true,
	            onNodeOver: this.onNodeOver.createDelegate(this)
	        };
	
	        Tine.Filemanager.NodeTreePanel.superclass.initComponent.call(this);
	
	        this.plugins = this.plugins || [];
	
	        if (!this.readOnly && this.enableDD) {
	            this.plugins.push({
	                ptype : 'ux.browseplugin',
	                enableFileDialog: false,
	                multiple : true,
	                handler : this.dropIntoTree
	            });
	        }
	
	        postal.subscribe({
	            channel: "recordchange",
	            topic: [this.recordClass.getMeta('appName'), this.recordClass.getMeta('modelName'), '*'].join('.'),
	            callback: this.onRecordChanges.createDelegate(this)
	        });
	    },
	
	    onRecordChanges: function(data, e) {
	        if (data.type == 'folder') {
	            var me = this,
	                path = data.path,
	                parentPath = path.replace(new RegExp(data.name + '$'), ''),
	                node = this.getNodeById(data.id),
	                pathChange = node && node.attributes && node.attributes.nodeRecord.get('path') != path;
	
	            if (node && e.topic.match(/\.delete/)) {
	                try {
	                    node.cancelExpand();
	                    node.remove(true);
	                } catch (e) {}
	                return;
	            }
	
	            if (node) {
	                node.setText(Ext.util.Format.htmlEncode(data.name));
	                // NOTE: qtip dosn't work, but implementing is not worth the effort...
	                node.qtip = Tine.Tinebase.common.doubleEncode(data.name);
	                Ext.apply(node.attributes, data);
	                node.attributes.nodeRecord = new this.recordClass(data);
	
	                // in case of path change we need to reload the node (children) as well
	                // as the path of all children changed as well
	                if (node.hasChildNodes() && pathChange && ! node.loading) {
	                    node.reload();
	                }
	            }
	
	            // add / remount node
	            me.expandPath(parentPath, '', function(sucess, parentNode) {
	                var childNode = parentNode.findChild('name', data.name);
	                if (! childNode) {
	                    parentNode.appendChild(node || me.loader.createNode(data));
	                } else if (childNode != node) {
	                    // node got duplicated by expand load
	                    try {
	                        node.cancelExpand();
	                        node.remove(true);
	                    } catch (e) {}
	                }
	            });
	        }
	    },
	
	    /**
	     * autosort new nodes
	     *
	     * @param tree
	     * @param parent
	     * @param appendedNode
	     * @param idx
	     */
	    onAppendNode: function(tree, parent, appendedNode, idx) {
	        if (parent.getDepth() > 0) {
	            parent.sort(function (n1, n2) {
	                return n1.text.localeCompare(n2.text);
	            });
	        }
	    },
	
	    /**
	     * An empty function by default, but provided so that you can perform a custom action before the initial
	     * drag event begins and optionally cancel it.
	     * @param {Object} data An object containing arbitrary data to be shared with drop targets
	     * @param {Event} e The event object
	     * @return {Boolean} isValid True if the drag event is valid, else false to cancel
	     */
	    onBeforeDrag : function(data, e) {
	        var _ = window.lodash,
	            requiredGrant = e.ctrlKey || e.altKey ? 'readGrant' : 'editGrant';
	
	        // @TODO: rethink: do I need delte on the record or parent?
	        return !! _.get(data, 'node.attributes.nodeRecord.data.account_grants.' + requiredGrant);
	    },
	
	    onNodeOver : function(n, dd, e, data) {
	        var action = e.ctrlKey || e.altKey ? 'copy' : 'move',
	            cls = Ext.tree.TreeDropZone.prototype.onNodeOver.apply(this.dropZone, arguments);
	
	        return cls != this.dropZone.dropNotAllowed ?
	            'tinebase-dd-drop-ok-' + action :
	            this.dropZone.dropNotAllowed;
	    },
	
	    /**
	     * @param {Object} dragOverEvent
	     *
	     * tree - The TreePanel
	     * target - The node being targeted for the drop
	     * data - The drag data from the drag source
	     * point - The point of the drop - append, above or below
	     * source - The drag source
	     * rawEvent - Raw mouse event
	     * dropNode - Drop node(s) provided by the source.
	     * cancel - Set this to true to signal drop not allowed.
	     */
	    onNodeDragOver: function(dragOverEvent) {
	        var _ = window.lodash,
	            cancel = this.readOnly
	                || ! dragOverEvent.target.expanded
	                || dragOverEvent.target == dragOverEvent.source.dragData.node
	                || ! _.get(dragOverEvent, 'target.attributes.nodeRecord.data.account_grants.addGrant');
	
	        dragOverEvent.cancel = cancel;
	    },
	
	    /**
	     * files/folder got dropped on node
	     *
	     * @param {Object} dropEvent
	     * @private
	     */
	    onBeforeNodeDrop: function(dropEvent) {
	        var nodes, target = dropEvent.target;
	
	        if(dropEvent.data.selections) {
	            nodes = dropEvent.data.grid.selModel.selections.items;
	        }
	
	        if(!nodes && dropEvent.data.node) {
	            nodes = [dropEvent.data.node];
	        }
	
	        Tine.Filemanager.fileRecordBackend.copyNodes(nodes, target, !(dropEvent.rawEvent.ctrlKey  || dropEvent.rawEvent.altKey));
	
	        dropEvent.dropStatus = true;
	        return true;
	    },
	
	    /**
	     * load everything from server
	     * @returns {Object} root node definition
	     */
	    getRoot: function() {
	        return {
	            path: '/',
	            cls: 'tinebase-tree-hide-collapsetool'
	        };
	    },
	
	    /**
	     * Tine.widgets.tree.FilterPlugin
	     * returns a filter plugin to be used in a grid
	     */
	    getFilterPlugin: function() {
	        if (!this.filterPlugin) {
	            this.filterPlugin = new Tine.Filemanager.PathFilterPlugin({
	                treePanel: this,
	                field: 'path',
	                nodeAttributeField: 'path'
	            });
	        }
	
	        return this.filterPlugin;
	    },
	
	    /**
	     * returns params for async request
	     *
	     * @param {Ext.tree.TreeNode} node
	     * @return {Object}
	     */
	    onBeforeLoad: function(node) {
	        var path = node.attributes.path;
	        var type = Tine.Tinebase.container.path2type(path);
	        var owner = Tine.Tinebase.container.pathIsPersonalNode(path);
	        var loginName = Tine.Tinebase.registry.get('currentAccount').accountLoginName;
	
	        if (type === 'personal' && owner != loginName) {
	            type = 'otherUsers';
	        }
	
	        var newPath = path;
	
	        if (type === 'personal' && owner) {
	            var pathParts = path.toString().split('/');
	            newPath = '/' + pathParts[1] + '/' + loginName;
	            if(pathParts[3]) {
	                newPath += '/' + pathParts[3];
	            }
	        }
	
	        var params = {
	            method: this.recordClass.getMeta('appName') + '.searchNodes',
	            application: this.app.appName,
	            owner: owner,
	            filter: [
	                     {field: 'path', operator:'equals', value: newPath},
	                     {field: 'type', operator:'equals', value: 'folder'}
	                     ],
	            paging: {dir: 'ASC', sort: 'name'}
	        };
	
	        return params;
	    },
	
	    onBeforeCreateNode: function(attr) {
	        Tine.Filemanager.NodeTreePanel.superclass.onBeforeCreateNode.apply(this, arguments);
	
	        attr.leaf = false;
	
	        if(attr.name && typeof attr.name == 'object') {
	            Ext.apply(attr, {
	                text: Ext.util.Format.htmlEncode(attr.name.name),
	                qtip: Tine.Tinebase.common.doubleEncode(attr.name.name)
	            });
	        }
	
	        // copy 'real' data to a node record NOTE: not a full record as we have no record reader here
	        var nodeData = Ext.copyTo({}, attr, this.recordClass.getFieldNames());
	        attr.nodeRecord = new this.recordClass(nodeData);
	    },
	
	    /**
	     * initiates tree context menus
	     *
	     * @private
	     */
	    initContextMenu: function() {
	        this.ctxMenu = Tine.Filemanager.nodeContextMenu.getMenu({
	            actionMgr: Tine.Filemanager.nodeActionsMgr,
	            nodeName: this.recordClass.getContainerName(),
	            actions: ['reload', 'createFolder', 'delete', 'rename', 'move', 'edit', 'publish', 'systemLink'],
	            scope: this,
	            backend: 'Filemanager',
	            backendModel: 'Node'
	        });
	
	        this.actionUpdater = new Tine.widgets.ActionUpdater({
	            containerProperty: this.recordClass.getMeta('containerProperty'),
	            evalGrants: true,
	            actions: this.ctxMenu.items
	        });
	    },
	
	    /**
	     * show context menu
	     *
	     * @param {Ext.tree.TreeNode} node
	     * @param {Ext.EventObject} event
	     */
	    onContextMenu: function(node, event) {
	        Tine.log.debug(node);
	
	        // legacy for reload action
	        this.ctxNode = node;
	
	        //@TODO implement selection vs ctxNode if multiselect is allowed
	        var record = new this.recordClass(node.attributes.nodeRecord.data);
	        this.actionUpdater.updateActions([record]);
	
	        this.ctxMenu.showAt(event.getXY());
	    },
	
	    /**
	     * called when tree selection changes
	     *
	     * @param {} sm     SelectionModel
	     * @param {Ext.tree.TreeNode} node
	     */
	    onSelectionChange: function(sm, node) {
	        // this.updateActions(sm, node);
	        var grid = this.app.getMainScreen().getCenterPanel(),
	            gridSelectionModel = grid.selectionModel,
	            actionUpdater = grid.actionUpdater,
	            record = node ? new this.recordClass(window.lodash.get(node, 'attributes.nodeRecord.data')) : null,
	            selection = record ? [record] : [];
	
	        grid.currentFolderNode = node;
	
	        if (gridSelectionModel) {
	            gridSelectionModel.clearSelections();
	        }
	
	        if (actionUpdater) {
	            actionUpdater.updateActions(selection);
	        }
	
	        Tine.Filemanager.NodeTreePanel.superclass.onSelectionChange.call(this, sm, node);
	    },
	
	    /**
	     * convert filesystem path to treePath
	     *
	     * NOTE: only the first depth gets converted!
	     *       fs pathes of not yet loaded tree nodes can't be converted!
	     *
	     * @param {String} containerPath
	     * @return {String} tree path
	     */
	    getTreePath: function(containerPath) {
	        var treePath = '/' + this.getRootNode().id + containerPath
	            .replace(new RegExp('^' + Tine.Tinebase.container.getMyFileNodePath()), '/myUser')
	            .replace(/^\/personal/, '/otherUsers')
	            .replace(/\/$/, '');
	
	        return treePath;
	    },
	
	    /**
	     * Expands a specified path in this TreePanel. A path can be retrieved from a node with {@link Ext.data.Node#getPath}
	     *
	     * NOTE: path does not consist of id's starting from the second depth
	     *
	     * @param {String} path
	     * @param {String} attr (optional) The attribute used in the path (see {@link Ext.data.Node#getPath} for more info)
	     * @param {Function} callback (optional) The callback to call when the expand is complete. The callback will be called with
	     * (bSuccess, oLastNode) where bSuccess is if the expand was successful and oLastNode is the last node that was expanded.
	     */
	    expandPath : function(path, attr, callback){
	        if (! path.match(/^\/xnode-/)) {
	            path = this.getTreePath(path);
	        }
	
	        var keys = path.split(this.pathSeparator);
	        var curNode = this.root;
	        var curPath = curNode.attributes.path;
	        var index = 1;
	        var f = function(){
	            if(++index == keys.length){
	                if(callback){
	                    callback(true, curNode);
	                }
	                return;
	            }
	
	            if (index > 2) {
	                var c = curNode.findChild('path', curPath + '/' + keys[index]);
	            } else {
	                var c = curNode.findChild('id', keys[index]);
	            }
	            if(!c){
	                if(callback){
	                    callback(false, curNode);
	                }
	                return;
	            }
	            curNode = c;
	            curPath = c.attributes.path;
	            c.expand(false, false, f);
	        };
	        curNode.expand(false, false, f);
	    },
	
	    /**
	     * Selects the node in this tree at the specified path. A path can be retrieved from a node with {@link Ext.data.Node#getPath}
	     * @param {String} path
	     * @param {String} attr (optional) The attribute used in the path (see {@link Ext.data.Node#getPath} for more info)
	     * @param {Function} callback (optional) The callback to call when the selection is complete. The callback will be called with
	     * (bSuccess, oSelNode) where bSuccess is if the selection was successful and oSelNode is the selected node.
	     */
	    selectPath : function(path, attr, callback) {
	        var node = this.expandPath(path, attr, function(bSuccess, oLastNode){
	            if (oLastNode) {
	                oLastNode.select();
	                if (Ext.isFunction(callback)) {
	                    callback.call(true, oLastNode);
	                }
	            }
	        }.createDelegate(this));
	    },
	
	    /**
	     * clone a tree node / create a node from grid node
	     *
	     * @param node
	     * @returns {Ext.tree.AsyncTreeNode}
	     */
	    cloneTreeNode: function(node, target) {
	        var targetPath = target.attributes.path,
	            newPath = '',
	            copy;
	
	        if(node.attributes) {
	            var nodeName = node.attributes.name;
	            if(typeof nodeName == 'object') {
	                nodeName = nodeName.name;
	            }
	            newPath = targetPath + '/' + nodeName;
	
	            copy = new Ext.tree.AsyncTreeNode({text: node.text, path: newPath, name: node.attributes.name
	                , nodeRecord: node.attributes.nodeRecord, account_grants: node.attributes.account_grants});
	        }
	        else {
	            var nodeName = node.data.name;
	            if(typeof nodeName == 'object') {
	                nodeName = nodeName.name;
	            }
	
	            var nodeData = Ext.copyTo({}, node.data, this.recordClass.getFieldNames());
	            var newNodeRecord = new this.recordClass(nodeData);
	
	            newPath = targetPath + '/' + nodeName;
	            copy = new Ext.tree.AsyncTreeNode({text: nodeName, path: newPath, name: node.data.name
	                , nodeRecord: newNodeRecord, account_grants: node.data.account_grants});
	        }
	
	        copy.attributes.nodeRecord.beginEdit();
	        copy.attributes.nodeRecord.set('path', newPath);
	        copy.attributes.nodeRecord.endEdit();
	
	        copy.parentNode = target;
	        return copy;
	    },
	
	    /**
	     * handels tree drop of object from outside the browser
	     *
	     * @param fileSelector
	     * @param targetNodeId
	     */
	    dropIntoTree: function(fileSelector, event) {
	
	        var treePanel = fileSelector.component,
	            app = treePanel.app,
	            grid = app.getMainScreen().getCenterPanel(),
	            targetNode,
	            targetNodePath;
	
	
	        var targetNodeId;
	        var treeNodeAttribute = event.getTarget('div').attributes['ext:tree-node-id'];
	        if(treeNodeAttribute) {
	            targetNodeId = treeNodeAttribute.nodeValue;
	            targetNode = treePanel.getNodeById(targetNodeId);
	            targetNodePath = targetNode.attributes.path;
	
	        }
	
	        if(!targetNode.attributes.nodeRecord.isDropFilesAllowed()) {
	            Ext.MessageBox.alert(
	                    i18n._('Upload Failed'),
	                    app.i18n._('Putting files in this folder is not allowed!')
	                ).setIcon(Ext.MessageBox.ERROR);
	
	            return;
	        }
	
	        var files = fileSelector.getFileList(),
	            filePathsArray = [],
	            uploadKeyArray = [],
	            addToGridStore = false;
	
	        Ext.each(files, function (file) {
	            if ("" === file.type) {
	                return true;
	            }
	
	            var fileName = file.name || file.fileName,
	                filePath = targetNodePath + '/' + fileName;
	
	            var upload = new Ext.ux.file.Upload({
	                fmDirector: treePanel,
	                file: file,
	                fileSelector: fileSelector,
	                id: filePath
	            });
	
	            var uploadKey = Tine.Tinebase.uploadManager.queueUpload(upload);
	
	            filePathsArray.push(filePath);
	            uploadKeyArray.push(uploadKey);
	
	            addToGridStore = grid.currentFolderNode.id === targetNodeId;
	
	        }, this);
	
	        if (0 === uploadKeyArray.length) {
	            return;
	        }
	
	        var params = {
	                filenames: filePathsArray,
	                type: "file",
	                tempFileIds: [],
	                forceOverwrite: false
	        };
	        Tine.Filemanager.fileRecordBackend.createNodes(params, uploadKeyArray, addToGridStore);
	    }
	});


/***/ },

/***/ 370:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Michael Spahn <m.spahn@metaways.de>
	 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Filemanager');
	
	Tine.Filemanager.NotificationGridPanel = Ext.extend(Tine.widgets.account.PickerGridPanel, {
	    selectType: 'both',
	    selectAnyone: false,
	
	    userCombo: null,
	    groupCombo: null,
	
	    currentUser: null,
	
	    editDialog: null,
	
	    initComponent: function () {
	        this.currentUser = Tine.Tinebase.registry.get('currentAccount');
	        this.initColumns();
	        this.supr().initComponent.call(this);
	
	        this.on('beforeedit', this.onBeforeEdit.createDelegate(this));
	    },
	
	    initColumns: function () {
	        var me = this;
	        this.configColumns = [
	            new Ext.ux.grid.CheckColumn({
	                id: 'active',
	                header: i18n._('Notification'),
	                tooltip: i18n._('Notactiveification'),
	                dataIndex: 'active',
	                width: 55,
	                onBeforeCheck: function (checkbox, record) {
	                    return this.checkGrant(record);
	                }.createDelegate(me)
	            }), {
	                id: 'summary',
	                dataIndex: 'summary',
	                width: 100,
	                sortable: true,
	                header: i18n._('Summary'),
	                renderer: function (value) {
	                    if (value === 1) {
	                        return value + ' ' + i18n._('Day');
	                    }
	
	                    if (value > 1) {
	                        return value + ' ' + i18n._('Days');
	                    }
	
	                    return '';
	                },
	                editor: {
	                    xtype: 'numberfield'
	                }
	            }
	        ];
	    },
	
	    onBeforeEdit: function (e) {
	        return this.checkGrant(e.record);
	    },
	
	    checkGrant: function (record) {
	        var _ = window.lodash;
	
	        var userHasAdminGrant = _.get(this.editDialog, 'record.data.account_grants.adminGrant', false);
	
	        // get id if it's from notification props, if its a record which was added or if it's a group which was added
	        var id = _.get(record, 'data.account_id', _.get(record, 'data.accountId')) || _.get(record, 'data.group_id');
	
	        if (!userHasAdminGrant && id !== this.currentUser.accountId) {
	            return false;
	        }
	
	        return true;
	    },
	
	    getColumnModel: function () {
	        if (!this.colModel) {
	            this.colModel = new Ext.grid.ColumnModel({
	                defaults: {
	                    sortable: true
	                },
	                columns: [
	                    {
	                        id: 'name',
	                        header: i18n._('Name'),
	                        dataIndex: this.recordPrefix + 'name',
	                        renderer: this.accountRenderer.createDelegate(this)
	                    }
	                ].concat(this.configColumns)
	            });
	        }
	
	        return this.colModel;
	    },
	
	    accountRenderer: function (value, meta, record) {
	        if (!record) {
	            return '';
	        }
	
	        var _ = window.lodash;
	
	        var iconCls = _.get(record, 'data.accountType') === 'user' ? 'renderer renderer_accountUserIcon' : 'renderer renderer_accountGroupIcon';
	
	        return '<div class="' + iconCls + '">&#160;</div>' + Ext.util.Format.htmlEncode(_.get(record, 'data.accountName') || '');
	    },
	
	    resetCombobox: function (combo) {
	        combo.collapse();
	        combo.clearValue();
	        combo.reset();
	    },
	
	    onAddRecordFromCombo: function (recordToAdd, index, combo) {
	        var _ = window.lodash;
	
	        var id = _.get(recordToAdd, 'data.account_id') || _.get(recordToAdd, 'data.group_id');
	
	        // If there is no admin grant, only allow to edit the own record
	        if (!_.get(this.editDialog, 'record.data.account_grants.adminGrant', false) && id !== this.currentUser.accountId) {
	            Ext.Msg.alert(i18n._('No permission'), 'You are only allowed to edit your own notifications.');
	
	            this.resetCombobox(combo);
	            return false;
	        }
	
	        var record = {
	            'active': true,
	            'summary': null,
	            'accountId': id,
	            'accountType': _.get(recordToAdd, 'data.type', null),
	            'accountName': _.get(recordToAdd, 'data.n_fileas') || _.get(recordToAdd, 'data.name') || i18n._('all')
	        };
	
	        if (this.store.getById(id)) {
	            this.resetCombobox(combo);
	            return false;
	        }
	
	        this.store.loadData([record], true);
	
	        this.resetCombobox(combo);
	
	    },
	
	    getContactSearchCombo: function () {
	        if (! this.userCombo) {
	            this.userCombo = new Tine.Addressbook.SearchCombo({
	                hidden: true,
	                accountsStore: this.store,
	                emptyText: i18n._('Search for users ...'),
	                newRecordClass: this.recordClass,
	                newRecordDefaults: this.recordDefaults,
	                recordPrefix: this.recordPrefix,
	                userOnly: true,
	                additionalFilters: (this.showHidden) ? [{field: 'showDisabled', operator: 'equals', value: true}] : []
	            });
	
	            this.userCombo.onSelect = this.onAddRecordFromCombo.createDelegate(this, [this.userCombo], true);
	        }
	
	        return this.userCombo;
	    },
	
	    onRemove: function () {
	        var selectedRows = this.getSelectionModel().getSelections();
	        for (var i = 0; i < selectedRows.length; ++i) {
	            if (this.checkGrant(selectedRows[i])) {
	                this.store.remove(selectedRows[i]);
	            }
	        }
	    },
	
	    getGroupSearchCombo: function () {
	        if (! this.groupCombo) {
	            this.groupCombo = new Tine.Tinebase.widgets.form.RecordPickerComboBox({
	                hidden: true,
	                accountsStore: this.store,
	                blurOnSelect: true,
	                recordClass: this.groupRecordClass,
	                newRecordClass: this.recordClass,
	                newRecordDefaults: this.recordDefaults,
	                recordPrefix: this.recordPrefix,
	                emptyText: i18n._('Search for groups ...')
	            });
	
	            this.groupCombo.onSelect = this.onAddRecordFromCombo.createDelegate(this, [this.groupCombo], true);
	        }
	
	        return this.groupCombo;
	    }
	})
	;

/***/ },

/***/ 371:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 *
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Michael Spahn <m.spahn@metaways.de>
	 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Filemanager');
	
	Tine.Filemanager.NotificationPanel = Ext.extend(Ext.Panel, {
	    editDialog: null,
	    app: null,
	
	    layout: 'fit',
	    border: false,
	
	    notificationGrid: null,
	
	    initComponent: function () {
	        var _ = window.lodash;
	
	        this.app = this.app || Tine.Tinebase.appMgr.get('Filemanager');
	        this.title = this.title || this.app.i18n._('Notifications');
	
	        this.editDialog.on('load', this.onRecordLoad, this);
	        this.editDialog.on('save', this.onSave, this);
	
	        var store = new Ext.data.JsonStore({
	            fields: ['active', 'summary', 'accountId', 'accountType', 'accountName'],
	            idProperty: 'accountId'
	        });
	
	        var notificationProps = window.lodash.get(this.editDialog.record, 'data.notificationProps', []);
	        var disable = notificationProps === null || notificationProps.length === 0;
	
	        this.notificationGrid = new Tine.Filemanager.NotificationGridPanel({
	            store: store,
	            readOnly: disable,
	            flex: 1,
	            editDialog: this.editDialog
	        });
	
	        var featureEnabled = _.get(Tine.Tinebase.configManager.get('filesystem'), 'enableNotifications', false);
	
	        var disabled = false;
	
	        if (!featureEnabled) {
	            disabled = true;
	        } else if (!_.get(this.editDialog, 'record.data.account_grants.adminGrant', false)) {
	            disabled = true;
	        }
	
	        this.hasOwnNotificationSettings = new Ext.form.Checkbox({
	            checked: !disable,
	            disabled: disabled,
	            boxLabel: this.app.i18n._('This folder has own notification settings'),
	            listeners: {scope: this, check: this.onOwnNotificationCheck}
	        });
	
	        this.items = [{
	            layout: 'vbox',
	            align: 'stretch',
	            pack: 'start',
	            border: false,
	            items: [{
	                layout: 'form',
	                frame: true,
	                hideLabels: true,
	                width: '100%',
	                items: [
	                    this.hasOwnNotificationSettings
	                ]
	            },
	                this.notificationGrid
	            ]
	        }];
	
	        this.supr().initComponent.call(this);
	    },
	
	    onOwnNotificationCheck: function (cb, checked) {
	        this.notificationGrid.setReadOnly(!checked);
	
	        if (!checked) {
	            this.notificationGrid.getStore().removeAll();
	        }
	    },
	
	    onRecordLoad: function (editDialog, record, ticketFn) {
	        this.notificationGrid.getStore().loadData(window.lodash.get(record, 'data.notificationProps', []), false);
	    },
	
	    onSave: function (editDialog, record, ticketFn) {
	        var _ = window.lodash;
	
	        // Remove properties
	        _.get(record, 'data.notificationProps', []);
	
	        var data = [];
	
	        this.notificationGrid.getStore().each(function (record) {
	            // prevent to send accountName here
	            data.push({
	                'active': record.data.active,
	                'summary': record.data.summary,
	                'accountId': record.data.accountId,
	                'accountType': record.data.accountType
	            });
	        });
	
	        record.set('notificationProps', data);
	    }
	});

/***/ },

/***/ 372:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2010-2012 Metaways Infosystems GmbH (http://www.metaways.de)
	 * 
	 */
	Ext.ns('Tine.Filemanager');
	
	/**
	 * @namespace   Tine.widgets.container
	 * @class       Tine.Filemanager.PathFilterModel
	 * @extends     Tine.widgets.grid.FilterModel
	 * 
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * 
	 * @TODO make valueRenderer a path picker widget
	 */
	Tine.Filemanager.PathFilterModel = Ext.extend(Tine.widgets.grid.FilterModel, {
	    /**
	     * @cfg {Tine.Tinebase.Application} app
	     */
	    app: null,
	    
	    /**
	     * @cfg {Array} operators allowed operators
	     */
	    operators: ['equals'],
	    
	    /**
	     * @cfg {String} field path
	     */
	    field: 'path',
	    
	    /**
	     * @cfg {String} defaultOperator default operator, one of <tt>{@link #operators} (defaults to equals)
	     */
	    defaultOperator: 'equals',
	    
	    /**
	     * @cfg {String} defaultValue default value (defaults to all)
	     */
	    defaultValue: '/',
	    
	    /**
	     * @private
	     */
	    initComponent: function() {
	        this.label = this.app.i18n._('path');
	        
	        Tine.Filemanager.PathFilterModel.superclass.initComponent.call(this);
	    },
	    
	    /**
	     * value renderer
	     * 
	     * @param {Ext.data.Record} filter line
	     * @param {Ext.Element} element to render to 
	     */
	    valueRenderer: function(filter, el) {
	        var setValue = function(value) {
	            if (value && value.path) {
	                value = value.path;
	            }
	            else if(Ext.isString(value) && (!value.charAt(0) || value.charAt(0) != '/')) {
	                value = '/' + value;
	            }
	
	            return Ext.ux.form.ClearableTextField.prototype.setValue.call(this, value);
	        };
	
	        var value = new Ext.ux.form.ClearableTextField({
	            filter: filter,
	            width: this.filterValueWidth,
	            id: 'tw-ftb-frow-valuefield-' + filter.id,
	            renderTo: el,
	            value: filter.data.value ? filter.data.value : this.defaultValue,
	            emptyText: this.emptyText,
	            setValue: setValue
	        });
	        
	        value.on('specialkey', function(field, e){
	            if(e.getKey() == e.ENTER){
	                this.onFiltertrigger();
	            }
	        }, this);
	
	        return value;
	    }
	});
	
	Tine.widgets.grid.FilterToolbar.FILTERS['tine.filemanager.pathfiltermodel'] = Tine.Filemanager.PathFilterModel;
	


/***/ },

/***/ 373:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010-2012 Metaways Infosystems GmbH (http://www.metaways.de)
	 * 
	 */
	Ext.ns('Tine.Filemanager');
	
	/**
	 * filter plugin for container tree
	 * 
	 * @namespace Tine.widgets.tree
	 * @class     Tine.Filemanager.PathFilterPlugin
	 * @extends   Tine.widgets.grid.FilterPlugin
	 */
	Tine.Filemanager.PathFilterPlugin = Ext.extend(Tine.widgets.tree.FilterPlugin, {
	    
	    /**
	     * select tree node(s)
	     * 
	     * @param {String} value
	     */
	    selectValue: function(value) {
	        var values = Ext.isArray(value) ? value : [value];
	        Ext.each(values, function(value) {
	            var path = Ext.isString(value) ? value : (value ? value.path : '') || '/',
	                treePath = this.treePanel.getTreePath(path);
	            
	            this.selectPath.call(this.treePanel, treePath, null, function() {
	                // mark this expansion as done and check if all are done
	                value.isExpanded = true;
	                var allValuesExpanded = true;
	                Ext.each(values, function(v) {
	                    allValuesExpanded &= v.isExpanded;
	                }, this);
	                
	                if (allValuesExpanded) {
	                    this.treePanel.getSelectionModel().resumeEvents();
	                    
	                    // @TODO remove this code when fm is cleaned up conceptually
	                    //       currentFolderNode -> currentFolder
	                    // this.treePanel.updateActions(this.treePanel.getSelectionModel(), this.treePanel.getSelectionModel().getSelectedNode());
	                    // Tine.Tinebase.appMgr.get('Filemanager').getMainScreen().getCenterPanel().currentFolderNode = this.treePanel.getSelectionModel().getSelectedNode();
	                }
	            }.createDelegate(this), true);
	        }, this);
	    },
	
	    selectPath: Tine.Filemanager.NodeTreePanel.prototype.selectPath
	});


/***/ },

/***/ 374:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 *
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiß <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Filemanager');
	
	/**
	 * Recursive Filter
	 *
	 * @namespace   Tine.Filemanager
	 * @class       Tine.Filemanager.RecursiveFilter
	 * @extends     Ext.Toolbar
	 *
	 * @param       {Object} config
	 * @constructor
	 */
	Tine.Filemanager.RecursiveFilter = Ext.extend(Ext.Toolbar, {
	
	    /**
	     * @cfg {Tine.widgets.grid.GridPanel}
	     */
	    gridPanel: null,
	
	    field: 'recursive',
	    operator: 'equals',
	    style: 'background-image: none;',
	
	    initComponent: function() {
	        this.app = Tine.Tinebase.appMgr.get('Filemanager');
	
	        Ext.applyIf(this, new Tine.widgets.grid.FilterPlugin());
	        this.init(this.gridPanel);
	
	        this.globalBtn = new Ext.Button({
	            text: this.app.i18n._('Whole Filemanager'),
	            pressed: false,
	            ref: '../globalBtn',
	            xtype: 'tbbtnlockedtoggle',
	            toggleGroup: 'Calendar_Toolbar_tgViewTypes',
	            handler: this.onFilterChange,
	            scope: this
	        });
	
	        this.items = [{
	            xtype: 'tbtext',
	            text: this.app.i18n._('Search') + ': ',
	        }, this.globalBtn, {
	            text: this.app.i18n._('This Folder'),
	            pressed: true,
	            ref: '../localBtn',
	            xtype: 'tbbtnlockedtoggle',
	            toggleGroup: 'Calendar_Toolbar_tgViewTypes',
	            handler: this.onFilterChange,
	            scope: this
	        }];
	
	        this.supr().initComponent.call(this);
	    },
	
	    getValue: function() {
	        return this.globalBtn.pressed ?
	            {field: this.field, operator: this.operator, value: true} : null;
	    },
	
	    setValue: function(filters) {
	        // only show if we have a contributing filter
	        var setVisible = false;
	
	        for (var i=0; i<filters.length; i++) {
	            switch (filters[i].field) {
	                case 'query':
	                    setVisible |= !!filters[i].value;
	                    break;
	                case 'path':
	                    break;
	                case 'recursive':
	                    this.globalBtn.toggle(!!filters[i].value);
	                    break;
	                default:
	                    setVisible |= true;
	                    break;
	            }
	        }
	
	        this.setVisible(setVisible);
	
	        if (! setVisible) {
	            // reset own filter
	            this.globalBtn.toggle(false);
	        }
	    }
	});

/***/ },

/***/ 375:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 *
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Michael Spahn <m.spahn@metaways.de>
	 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Filemanager');
	
	Tine.Filemanager.RevisionPanel = Ext.extend(Ext.form.FieldSet, {
	
	    editDialog: null,
	    app: null,
	
	    layout: 'hfit',
	
	    keep: null,
	
	    keepNum: null,
	    keepNumInput: null,
	
	    keepMonth: null,
	    keepMonthInput: null,
	
	    config: null,
	    readOnly: false,
	
	    initComponent: function () {
	        var _ = window.lodash;
	
	        this.config = Tine.Tinebase.configManager.get('filesystem');
	
	        this.app = this.app || Tine.Tinebase.appMgr.get('Filemanager');
	        this.title = this.title || this.app.i18n._('Revision');
	
	        this.editDialog.on('load', this.onRecordLoad, this);
	        this.editDialog.on('save', this.onSave, this);
	
	        var type = _.get(this.editDialog, 'record.data.type');
	        var adminGrant = _.get(this.editDialog, 'record.data.account_grants.adminGrant', false);
	
	        if (type !== 'folder' || !adminGrant) {
	            this.readOnly = true;
	        }
	
	        this.hasOwnRevisionSettings = new Ext.form.Checkbox({
	            checked: false,
	            disabled: this.readOnly,
	            boxLabel: this.app.i18n._('This folder has own revision settings'),
	            listeners: {scope: this, check: this.onOwnRevisionCheck}
	        });
	
	        this.items = [{
	            items: [this.hasOwnRevisionSettings, [{
	                xtype: 'container',
	                cls: 'revision-container',
	                margins: '0 20 0 0',
	                items: [{
	                    xtype: 'checkbox',
	                    boxLabel: this.app.i18n._('Revision active'),
	                    name: 'keep',
	                    columnWidth: 1,
	                    readOnly: false,
	                    disabled: false,
	                    ref: '../../keep',
	                    listeners: {scope: this, check: this.onKeepCheck}
	                }, {
	                    xtype: 'container',
	                    cls: 'revision-checkbox-field',
	                    items: [{
	                        xtype: 'checkbox',
	                        boxLabel: this.app.i18n._('Limit revision amount to'),
	                        name: 'keepNum',
	                        columnWidth: 1,
	                        readOnly: false,
	                        disabled: false,
	                        ref: '../../../keepNum',
	                        listeners: {scope: this, check: this.onKeepNumCheck}
	                    }, {
	                        xtype: 'numberfield',
	                        ref: '../../../keepNumInput'
	                    }]
	                }, {
	                    xtype: 'container',
	                    cls: 'revision-checkbox-field',
	                    items: [{
	                        xtype: 'checkbox',
	                        boxLabel: this.app.i18n._('Hold-back in months'),
	                        name: 'keepMonth',
	                        columnWidth: 1,
	                        readOnly: false,
	                        disabled: false,
	                        ref: '../../../keepMonth',
	                        listeners: {scope: this, check: this.onKeepMonthCheck}
	                    }, {
	                        xtype: 'numberfield',
	                        ref: '../../../keepMonthInput'
	                    }]
	                }]
	            }]]
	        }];
	
	        this.supr().initComponent.call(this);
	
	        this.manageFields();
	    },
	
	    onKeepCheck: function (cb, checked) {
	        this.manageFields();
	
	        if (false === checked) {
	            this.keepNum.setValue(false);
	            this.keepMonth.setValue(false);
	        }
	    },
	
	    onKeepNumCheck: function (cb, checked) {
	        this.manageFields();
	
	        if (false === checked) {
	            this.keepNumInput.setValue(null);
	        }
	    },
	
	    onKeepMonthCheck: function (cb, checked) {
	        this.manageFields();
	
	        if (false === checked) {
	            this.keepMonthInput.setValue(null);
	        }
	    },
	
	    manageFields: function () {
	        this.keep.setDisabled(this.readOnly || false === this.hasOwnRevisionSettings.getValue());
	
	        this.keepNum.setDisabled(this.keep.disabled || false === this.keep.getValue());
	        this.keepNumInput.setDisabled(this.keep.disabled || false === this.keep.getValue() || false === this.keepNum.getValue());
	
	        this.keepMonth.setDisabled(this.keep.disabled || false === this.keep.getValue());
	        this.keepMonthInput.setDisabled(this.keep.disabled || false === this.keep.getValue() || false === this.keepMonth.getValue());
	    },
	
	    onOwnRevisionCheck: function (cb, checked) {
	        this.manageFields();
	    },
	
	    onRecordLoad: function (editDialog, record, ticketFn) {
	        var _ = window.lodash;
	
	        this.hasOwnRevisionSettings.setValue(record.id === _.get(record, 'data.revisionProps.nodeId'));
	        this.keep.setValue(_.get(record, 'data.revisionProps.keep', _.get(this.config, 'modLogActive', false)));
	
	        if (_.get(record, 'data.revisionProps.keepNum', _.get(this.config, 'numKeepRevisions', false))) {
	            this.keepNum.setValue(true);
	            this.keepNumInput.setValue(_.get(record, 'data.revisionProps.keepNum', _.get(this.config, 'numKeepRevisions')));
	        }
	
	        if (_.get(record, 'data.revisionProps.keepMonth', _.get(this.config, 'monthKeepRevisions', false))) {
	            this.keepMonth.setValue(true);
	            this.keepMonthInput.setValue(_.get(record, 'data.revisionProps.keepMonth', _.get(this.config, 'monthKeepRevisions')));
	        }
	    },
	
	    onSave: function (editDialog, record, ticketFn) {
	        if (this.readOnly) {
	            return;
	        }
	
	        var _ = window.lodash;
	
	        // In case there is no own setting, we don't need to persist current values we just empty it
	        // When reloaded the server is supposed to send the correct inherited values
	        if (false === this.hasOwnRevisionSettings.getValue()) {
	            _.set(record, 'data.revisionProps', {});
	            return;
	        }
	
	        var data = {};
	
	        _.set(data, 'nodeId', record.id);
	        _.set(data, 'keep', this.keep.getValue());
	        _.set(data, 'keepNum', this.keepNumInput.getValue());
	        _.set(data, 'keepMonth', this.keepMonthInput.getValue());
	
	        _.set(record, 'data.revisionProps', data);
	    }
	});

/***/ },

/***/ 376:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * Filemanager combo box and store
	 * 
	 * @package     Filemanager
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Alexander Stintzing <a.stintzing@metaways.de>
	 * @author      Michael Spahn <m.spahn@metaways.de>
	 * @copyright   Copyright (c) 2012-2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	
	Ext.ns('Tine.Filemanager');
	
	/**
	 * Node selection combo box
	 * 
	 * @namespace   Tine.Filemanager
	 * @class       Tine.Filemanager.SearchCombo
	 * @extends     Ext.form.TriggerField
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Alexander Stintzing <a.stintzing@metaways.de>
	 * @author      Michael Spahn <m.spahn@metaways.de>
	 * @copyright   Copyright (c) 2012-2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Filemanager.SearchCombo
	 */
	Tine.Filemanager.SearchCombo = Ext.extend(Ext.form.TriggerField, {
	    
	    allowBlank: false,
	    itemSelector: 'div.search-item',
	    minListWidth: 200,
	
	    app: null,
	    
	    recordClass: null,
	    recordProxy: null,
	    
	    initComponent: function(){
	        this.recordClass = Tine.Filemanager.Model.Node;
	        this.recordProxy = Tine.Filemanager.fileRecordBackend;
	
	        if (null === this.app) {
	            this.app = Tine.Tinebase.appMgr.get('Filemanager');
	        }
	
	        this.supr().initComponent.call(this);
	
	        this.addEvents(
	            /**
	             * @param selected node
	             */
	            'select'
	        );
	    },
	    
	    onTriggerClick: function () {
	        var filepicker = new Tine.Filemanager.FilePickerDialog({
	            title: this.app.i18n._('Select a file'),
	            singleSelect: true,
	            constraint: 'file'
	        });
	
	        filepicker.on('selected', function (node) {
	            if (!node || 0 === node.length) {
	                return true;
	            }
	
	            this.fireEvent('select', node[0]);
	            this.setValue(node[0].path);
	
	        }, this);
	
	        filepicker.openWindow();
	    }
	});
	
	Tine.widgets.form.RecordPickerManager.register('Filemanager', 'Node', Tine.Filemanager.SearchCombo);


/***/ },

/***/ 377:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 *
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiß <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Filemanager');
	
	/**
	 * @namespace   Tine.Filemanager
	 * @class       Tine.Filemanager.UsagePanel
	 * @extends     Ext.Panel
	 *
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiß <c.weiss@metaways.de>
	 *
	 * @param       {Object} config
	 * @constructor
	 */
	Tine.Filemanager.UsagePanel = Ext.extend(Ext.Panel, {
	
	    layout: 'fit',
	    border: false,
	
	    initComponent: function() {
	        this.app = this.app || Tine.Tinebase.appMgr.get('Filemanager');
	        this.title = this.app.i18n._('Usage');
	
	        this.byTypeStore = new Ext.data.ArrayStore({
	            fields: [
	                {name: 'type'},
	                {name: 'size', type: 'int'},
	                {name: 'revision_size', type: 'int'}
	            ]
	        });
	
	        this.byUserStore = new Ext.data.ArrayStore({
	            fields: [
	                {name: 'user'},
	                {name: 'size', type: 'int'},
	                {name: 'revision_size', type: 'int'}
	            ]
	        });
	
	        var bytesRenderer = Tine.Tinebase.common.byteRenderer.createDelegate(this, [2, true], 3),
	            columns = [
	            {header: this.app.i18n._('Size'), width: 150, sortable: true, renderer: bytesRenderer, dataIndex: 'size'}
	        ];
	
	        if (Tine.Tinebase.configManager.get('filesystem.modLogActive', 'Tinebase')) {
	            columns.push({header: this.app.i18n._('Revision Size'), width: 150, sortable: true, renderer: bytesRenderer, dataIndex: 'revision_size'});
	        }
	
	        this.byTypeGrid = new Ext.grid.GridPanel({
	            store: this.byTypeStore,
	            columns: [
	                {id:'type',header: this.app.i18n._('File Type'), width: 160, sortable: true, dataIndex: 'type'},
	            ].concat(columns),
	            stripeRows: true,
	            autoExpandColumn: 'type',
	            title: this.app.i18n._('Usage by File Type'),
	            // baseCls: 'ux-arrowcollapse'
	        });
	
	        this.byUserGrid = new Ext.grid.GridPanel({
	            store: this.byUserStore,
	            columns: [
	                {id:'user',header: this.app.i18n._('User'), width: 160, sortable: true, dataIndex: 'user'},
	            ].concat(columns),
	            stripeRows: true,
	            autoExpandColumn: 'user',
	            title: this.app.i18n._('Usage by User'),
	            // baseCls: 'ux-arrowcollapse'
	        });
	
	        this.items = [{
	            layout: 'vbox',
	            border: false,
	            defaults: {flex: 1},
	            items: [this.byTypeGrid, this.byUserGrid]
	        }];
	        this.supr().initComponent.call(this);
	    },
	
	    afterRender: function() {
	        this.supr().afterRender.call(this);
	
	        var editDialog = this.findParentBy(function(c){return !!c.record}),
	            record = editDialog ? editDialog.record : {};
	
	        Tine.Filemanager.getFolderUsage(record.id, this.onFolderUsageLoad.createDelegate(this));
	    },
	
	    onFolderUsageLoad: function(response) {
	        var _ = lodash,
	            me = this,
	            userNameMap = {};
	
	        _.forEach(_.get(response, 'contacts', []), function(contact) {
	            userNameMap[contact.id] = contact;
	        });
	
	        me.byTypeStore.loadData(_.map(_.get(response, 'type', []), function(o, type) {
	            return [type, o.size, o.revision_size];
	        }));
	
	        me.byUserStore.loadData(_.map(_.get(response, 'createdBy', []), function(o, user) {
	            return [lodash.get(userNameMap, user + '.n_fn' , me.app.i18n._('unknown')), o.size, o.revision_size];
	        }));
	
	    }
	});
	
	Ext.reg('Tine.Filemanager.UsagePanel', Tine.Filemanager.UsagePanel);

/***/ },

/***/ 573:
/***/ function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(1)();
	// imports
	
	
	// module
	exports.push([module.id, ".FilemanagerIconCls,.tine-recordclass-gridicon.FilemanagerNode{background-image:url(" + __webpack_require__(68) + ")!important}.x-btn-medium .FilemanagerIconCls{background-image:url(" + __webpack_require__(85) + ")!important}.x-btn-large .FilemanagerIconCls{background-image:url(" + __webpack_require__(103) + ")!important}.action_edit_file{background-image:url(" + __webpack_require__(63) + ")!important}.x-btn-medium .action_edit_file{background-image:url(" + __webpack_require__(82) + ")!important}.x-btn-large .action_edit_file{background-image:url(" + __webpack_require__(100) + ")!important}.action_filemanager_folder_up{background-image:url(" + __webpack_require__(56) + ")!important}.x-btn-medium .action_filemanager_folder_up{background-image:url(" + __webpack_require__(77) + ")!important}.x-btn-large .action_filemanager_folder_up{background-image:url(" + __webpack_require__(95) + ")!important}.action_filemanager_save_all{background-image:url(" + __webpack_require__(8) + ")!important}.x-btn-medium .action_filemanager_save_all{background-image:url(" + __webpack_require__(10) + ")!important}.x-btn-large .action_filemanager_save_all{background-image:url(" + __webpack_require__(12) + ")!important}.action_create_folder{background-image:url(" + __webpack_require__(55) + ")!important}.action_pause{background-image:url(" + __webpack_require__(20) + ");background-repeat:no-repeat}.action_resume{background-image:url(" + __webpack_require__(21) + ");background-repeat:no-repeat}.x-btn-medium .action_create_folder{background-image:url(" + __webpack_require__(76) + ")!important}.x-btn-large .action_create_folder{background-image:url(" + __webpack_require__(94) + ")!important}.x-tinebase-typefolder .x-grid3-cell-inner{background-image:url(" + __webpack_require__(47) + ");background-repeat:no-repeat;padding-left:19px}.x-tinebase-typeoctet .x-grid3-cell-inner{background-image:url(" + __webpack_require__(13) + ");background-repeat:no-repeat;padding-left:19px}.action_publish{background-image:url(" + __webpack_require__(67) + ");background-repeat:no-repeat}.x-btn-medium .action_publish{background-image:url(" + __webpack_require__(84) + ")}.x-btn-large .action_publish{background-image:url(" + __webpack_require__(102) + ")}.revision-checkbox-field .x-form-check-wrap{display:inline}.revision-checkbox-field input:last-child{margin-left:5px}.revision-container{margin-left:20px}", ""]);
	
	// exports


/***/ },

/***/ 660:
/***/ function(module, exports, __webpack_require__) {

	// style-loader: Adds some css to the DOM by adding a <style> tag
	
	// load the styles
	var content = __webpack_require__(573);
	if(typeof content === 'string') content = [[module.id, content, '']];
	// add the styles to the DOM
	var update = __webpack_require__(2)(content, {});
	if(content.locals) module.exports = content.locals;
	// Hot Module Replacement
	if(false) {
		// When the styles change, update the <style> tags
		if(!content.locals) {
			module.hot.accept("!!../../Tinebase/js/node_modules/css-loader/index.js!./Filemanager.css", function() {
				var newContent = require("!!../../Tinebase/js/node_modules/css-loader/index.js!./Filemanager.css");
				if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
				update(newContent);
			});
		}
		// When the module is disposed, remove the <style> tags
		module.hot.dispose(function() { update(); });
	}

/***/ }

/******/ })
});
;