(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__(216);
	__webpack_require__(217);
	__webpack_require__(222);
	__webpack_require__(219);
	__webpack_require__(240);
	__webpack_require__(239);
	__webpack_require__(238);
	__webpack_require__(221);
	__webpack_require__(220);
	__webpack_require__(215);
	__webpack_require__(227);
	__webpack_require__(226);
	__webpack_require__(225);
	__webpack_require__(229);
	__webpack_require__(228);
	__webpack_require__(224);
	__webpack_require__(223);
	__webpack_require__(218);
	__webpack_require__(232);
	__webpack_require__(233);
	__webpack_require__(234);
	__webpack_require__(235);
	__webpack_require__(236);
	__webpack_require__(237);
	__webpack_require__(230);
	__webpack_require__(231);
	__webpack_require__(658);


/***/ },

/***/ 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);
	}


/***/ },

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

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

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWEAYAAACUJLB4AAAABmJLR0T///////8JWPfcAAAACXBIWXMAADdcAAA3XAHLx6S5AAAACXZwQWcAAAAWAAAAFgDcxelYAAAJ3UlEQVRIx+1Wa0xUZxp+vnOZGebGxTkzzDilctGBBQfQeoslUOrqNipYWwmgy+J6jTZY2airWJPtllp2TYkKLRYFTRB1rRSrNRRUisG1jjYa0fVStlQHBGuFIghzZs75vv3B6I/9vdlfff88503ePOfJm+d73xf4NX6NX+P/GuT5B7eYW8wtBmgDbaANIIwxxtiLOhZfG18bX8ttjemL6YvpIxfMheZCcyE7o4QqoUooie492nu096j6O2GnsFPYiXpNqaZUUwpBpSpVKZTWvNa81rz/oeDI/Mj8yHxA6Bf6hX6IhBFGGAKDWwa3DG4hFjvssINF0ipaRatws8vYZewyQlBqlBqlBoozz5nnzCPW7iPdR7qPMJ6kkBSSgt607rTutG5oNXc1dzV3Ife93fd239vcb7Xfa7/Xfo+/xa6JXRO7hvyBFJEiUkR1hvuG+4b7zKMeVg+rhxGCDnSgA6NNHzZ92PQhIDwX/Mj6yPrICrB6Vs/qgQ1tG9o2tOGkWCaWiWUsu1HXqGvUzWl3veV6y/VWfum0jdM2TttomCfXyXVyXXPacPlw+XD5oa2ph1IPpR5S6sO8Yd4wLzIbzjacbTiLh46XHC85XuIWmlvMLeYW+p1CFapQpP7Q+UPnD50AjuAIjkCW0+V0OZ2kCXbBLtiZB5/hM3yGENsD2wPbA4y+6HCEFCFFSAC3lFvKLeWOKxlKhpJBlygLlAXKgiUVUQ1RDVEN/1hvSDOkGdLADc0bmjc0jxaw+Ww+m88d5A5zh7nDu/ZJvMRL/Ka1dA/dQ/dwhXKn3Cl3os5gNVgNVqoMyAPygDw3Znzh+MLxhUUwp5pTzal3C/UJ+gR9wt81lgJLgaWg78+dxzqPdR4j7qcLny58upDd6Fnds7pnNfgX3kj1pHpSPUCykqwkK3xkyqmUUymnAEe2I9uRfXCau9fd6+5lLGpO1JyoOfI2qUwqk8oCcdbT1tPW04xZFlkWWRZ1VATpNta+Vvta7Wtonx41PWp6FBB9Lvpc9LnNiRPnTpw7cW4g2aV1aV1atj7hm4RvEr5hzJ3hznBndMYn6ZJ0Sbqo/OR7yfeS7wHuTHemO5MkTXZNdk12AdyLDg9EDEQMAMIJ4YRwgu0XjaJRNAK4iIu4qP90oGOgY6ADGFk6snRkqXAaxShGMV+qv6C/oL8AGJINyYZknXeMTbut+EDxgeIDeLUvpy+nLyfzLDlPzpPzZTfpPrqP7uMm+Tw+j8+jrn6Y+jD1YWpgvrfEW+Itib0d0Af0Af1u7sn1J9efXAceHX90/NFxZIZz4Vw4h9AXHr71ya1Pbn0CUFBQkHfQgx70ACN9I30jfcOtunBduC4cU2GAAQZ2nnfwDt5B3tHEaGI0McgZaRlpGWkZ+esYmzJFW62t1lYDSEISkrJ2sPVsPVuP11WDalAN9NBQ/VD9UL0QgmpUo5pfHZIYkhiSiDLFo3gUz3yqcWgcGkd8ie4r3Ve6r+6U9lT0VPRUkHsvBA/mDeYN5gFcApfAJSAPPvjgw051mbpMXfbvVeomdZO6CeAb+Ua+EXfEk+JJ8SSLp0ZqpEYCf6u/1d/qdc12zHbMdqhdXnjhBUAjaSSNjO8joSSUhALP3M/cz9zctsD4wPjAeJRrw7Rh2jBka6o0VZoqGquYFJNiErdQgQpUiO0gHOEId6cU/ehHPxfPCblCrpAL+Gf4Z/hnALIoi7LIbvo+933u+xwIyAE5ILeVKC7FpbgATuIkTuKPwQ477CzD7/Q7/U5gdO3o2tG159bdyryVeSsTiCiNKI0oBdj77H32vvCu/4D/gP8AIMfKsXIs2lCAAhQAol20i3YMqzbVptrw0dhjBWgOzaE5P9VTH/VRH0C7aBftYm8IGq/Gq/EC+AW/4Be8MeZJMpS1IGtB1gKyoCa9Jr0m/Sqjm+lmuvmBlp1hZ9iZKJkup8vpcu5D9bZ6W72N9KFzQ+eGzp29AzPMMAOPIx5HPI4A6Cw6i85qFvzb/dv9218Hzaf5NB8awSN4BA9ArpAr5Ar9Ts1QM9QMro5cI9fItebe/uL+4v7iKx+xClbBKrDC5rV5bV7axSlJSpKSRD4gbaSNtJGwn1t/bv25lQ6PCWWnsQM7sGNCCKtklawy7FvGM57xQGBqYGpgKlvCbrPb7DYgZUvZUnb8CkuWJcuSBfTf7L/Zf5N8EFYeVh5W/nGx72Xfy76XP5aYm7mZm/uWOImTOBnPWlgLa+HSA86AM+D8omT0vdH3Rt9bon1TelN6UyI2a5Q1yhrFfWQxWUwWE84/t7BRf19/X39f+Kuj0dHoaHzdJO2R9kh7Kr/UZeoydZmPs0wFpgJTAWOWq5arlqtsmTROGieNY1/YLtsu2y4zNiFkQsiEEN8rifsT9yfuP/GB64zrjOtM/rLg1CiKuR5zPeZ6BjXVmepMdepMs2JWzAo1WsOsYdYwxlzXXNdc1/Z6/msRmzcs37B8w3LMEC2iRbQQFfxKfiW/MroyVB+qD9W3W8zbzNvM2xgz5BhyDDkszdhsbDY2s5XSJGmSNInttJfZy+xljNmZndkZY/Zn9mf2Z8xjt9ltdhv7jSPaEe2IZnedOqfOqWPMZrQZbcafOIvWorVo5d8bcg25hlzGwqvDq8Or2WWrwWqwGtg2Z5WzylnFWHxnfGd8ZzdcdpfdZa+ujTkVcyrm1PSm6L3Re6P3AsLYHDv4pW+Wb5Zv1uzHLI/lsbxAiXa3drd2N56JTGQi4wqFicJEYSKJF7YIW4Qt+Be60Y1uRKIBDWggi3w/+n70/cj2DQ8ODw4P0tn8Rf4ifxHvikQkIpGG+Jn8TH4mLTM1mhpNjbRJiBfihXhykvua+5r7Gt5AZCAyEEnLn5x4cuLJifGvsCbWxJpWFtJYGktj/zhZlmRJlrZ/GlzN/eHERmzEFt6vuaG5obmBtdo12jXaNagSd4m7xF2AOCqOiqOAMEWYIkwBcAmXcAlAF7rQBTxtf9r+tB1Qi9QitQgwphhTjCmAdpV2lXYVoOnUdGo6AX4Jv4RfAhCBCEQAmId5mAdQ09V0NR0IxAXiAnGAXClXypVo99X6an21eFXeKm+Vt/qtwTl89hKXw+VwOeMkPo6P4+MQTtaRdWQd/ypZQVaQFdxfWDNrZs38JjqPzqPzuNVoRzvauTfoYrqYLuajxQaxQWwgvVwsF8vFcjuDwvXKBGWCMgHnuXaunWsXHo5tTu4qr+f1vJ6sIvfIPXKP5nK5XC6XS/cKJUKJUEK/ZSITmRg4yAIswAIj81kNq2E1/zz8/Ph5flSoQUwcA2HWGGp6x1DcH8yXBvNbwbrxQZq44HXdF+SZHDynjwYx2CAqBjfi9jEMBP/vzwnmRWMou4N1fwry6f8Ds1FpNKpmNjMAAAAielRYdFNvZnR3YXJlAAB42isvL9fLzMsuTk4sSNXLL0oHADbYBlgQU8pcAAAAAElFTkSuQmCC"

/***/ },

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

	module.exports = "data:image/png;base64, "

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAALNSURBVHjapZNNSBRxGMaf/3w6szO7fq3rF8VqaaVBHyCGoHULBeuQRB72IBiBdq2Lhw5CHbqlJyEoSY06RKUISSqKiWlWfoRF4Sa6K6676U7rzuzOTLOWsgp16bm8p9/D8748LzFNE/8Q9Wca+IsY7NP7lpZjq8PDT4JjY1GpoOA4Lcsksrg4L5eWMq7KyroTra3zSNKeBEP19fdW+/oaM86U82klpZBcLhBCoKytITA5ifWpKTWnurrjbFfX9WSDXdjX39dU6PEQXhSx+HoIP5eXIQg87IcK4Sg+iq3wJrzdPWb+hYvtCZNdgwkr9lxb2zt3bQ0PTcPsi5dBXovflli2h2fZHIljX6HstIN35UHdDGF5YFAtaW4+VWatQ8GS19pZzs/iaZrBx96+ECH0scZY7C5DUTHRJvakVFU4WEHGhm8JMS0GKd/FJ5jdKys+XzaTkY6lD1Ogo9qdJkVZ7ZakLNlhf+M8f66ACUehBXyYGxyGf+ETqNTUbWbHgFL8finG0thaD0DguM4EbLeJ467yk27Mf4OpBDEzMWXkqrFrCAXhW1pEgkmw2wniAL5PT8NQFNCEOG0CPy4KplsfeQtt5SvGpmeM9C3VwwHPBEOHbpnEk4piMNnZCmvGQUFHmk0YZRBxC94AEA1hdDVoOCy4wTQf6TbbFYE2ITIECSbBbidgc3L8HAAtrEFnIzIfiILYWQyohiFqhueqBT+QJFdWqnBL/xEBZf5mdo9YVFVVt6YLqpDOIb4cAe3k0a8ZIHHcRErKSKfdfiMvU/zMhTcdSOOwYghqgtlTpIdWkbxPHzcdcXIkMxgDbDTCFAMbwyKdNkAFI1hxsJgMaObBS5fbPclF2tF9y+RLb29jEa/yuRxBJgg4QhAEsKTpmIvy6uGamo6G/VVO1nOrlQtWSbyjo1FJlksp2kqysTF7oKIipdiKXbvvmf77nX8BLtVGqws09hAAAAAASUVORK5CYII="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKuSURBVDiNXZMxb1xFFIW/e2fe7nu76+yyWMRxHGTJCuCSbYCGisI1WCK1a2pE44ofgITT0Fgif4AKgpD4AYmERCJZKIgKiTUOa2/YtXf3vTczl2Jti+RoiplivnvOGY389PMPd/85u3g8W9SiKqg4ExWWewEEMAwjxbRc0ayVO7m99vqHHrj9dJh4Vr3VzRuOVubIG0re8ORecU4Ynpb8NpwxmUWu9NHaH8cf35JND4AIMRkpGdGMEKGsIvNF5NlwzvNJDYCq8PZ6wUa/yc06LwA8QIjGZBZY1InzRaThlDrCX2c1IRoA3ZbnnY2CldzhHViNXgNiohpNI04TTgURoQ6gAs5BkQmvdZTRpORsCt4JRSMCaQnwqrUTR7MhNBtK5gXvBafLvAYsQiLURgiJEBKbqxZjunTgvdLveYpcyJtKsyFkXnBOEAEziNGoaqOsjEWZaGZSXkdoZkp3xdEulFah5LmSX0JEIBmEYCxKY14mZvNEJkt7SwdOaeVKu6V0Wkq75Wi3lKKpOAcxwnyRuJgnstmym6xSEglfluXJmzfm2Sa/j9Up3ilaK+5c0QvpqQgJe5GSEWMiuUQoErFZZ9WiOhYz4/8SETk4OHi3KIr3RqPR1yEE6/f7n52enj7a399/aq9c8Lyi3d3dL7a3t78cDoduMpnQ6XQYDAbfTKfTsLOz8znw1UsDr4CHh4dvbG1tffDkya9rx8d/f9Lv9291u92Oqtpk8u/5ePziz/X19e8Gg8HJ0dHR4729vecvAe7fP/gla2SD5asvP5CIEGPkRrfLSqdDjJFkibqKj+59eu/96wgiog8efLvVbrepQ8DMcKoYUJYlq/1VNu7cYTabUdcV3mV3RUTNLF114B8+/PH7Xq93U0SuysTMMDNExC7PJiIyHo9PLodX/wF2QUIbF+5j8AAAAABJRU5ErkJggg=="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJGSURBVHjalZNNqBJRFMfvjI5WuFBKkQgTFy3cpdAqcPEWaqto566FO3chErzAwrVBb1ELQ8u2IdRGfQg9Eb/AhQh+K6Y0fosfWNaoc9+50jzqUS/7w2E+7vzO/Z9zzyCM8d4BuuR+6j6sVqudaDTaMBgMD/4HvplIJKqr1YrP5/N4MBjgYDDYo9GestvtD41G461SqUSpVCrU6XSQWq2W7LOz0vfa945l2VU2m8WtVguT63K5xIFA4PO/4OvhcLgxmUxwKpXC9Xodp9NpvFgsSJIfcrn80XmAgbgKccNitdxzuVyver0eH4/HcblcxslkEk+nU5zJZDiAXfDdFYqAFEWJzGbzfZvN9kSn02mkUqmE7bKMXq+Xsl9YpFQq0Xw+R/CMGo0GZ7FY3JDoCNhvCEQ7nc4jWNiSzo7H47Molor45OQTJg5GoxHZea1QKB4Dc/nMtUajOcjlclytVsPQWTwcDglMrO4CzpwcGal9DbYPBVgI2mQy2TabDePxeAY+n+8rx3GkJATvEM/zCCBULBa3Vqv12Ww2ew7QCv0iWqvV3pZIJCgSibiazeZLmqbRdrtFRGKxGEE/EFivAfziPEwkBpsLmUyGoIw3IpGI7L6zxjAMEpK12+3v8O3vsOAgFAp9AKsEoCABBRJgkmjX/Vgs9hHuN39M0O1238OQtNbrNSISXBCRd36/vwulvUV/kTBAd7xebwXmnCejSqJSqfAOh6MM/bl70bRSPxOQXa/BwBzAD2OGksSFQuG43+8fw/oQXaBTBbj9M03az5MAAAAASUVORK5CYII="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAACXBIWXMAABuvAAAbrwFeGpEcAAAAB3RJTUUH1woaEiggz2rQEQAAAAZiS0dEAP8A/wD/oL2nkwAABM1JREFUGBmlwXtM1AUAB/Dv/e5+d9whj7vjgBNFUNSSQzELxJyHxKlIIeeDl0siJAkDxAdzUOILAXlIKJrg1CW+0CgwKHyASrzVAPEw1HRtKbnKtf5wmflNNt3Y5czV5wO8gLcBbFOrpYe8vMR4QIL/Yz8grVOpwjpCQipu5OdfH6iquv9rU9ODn2pr735fWHiqY+7c1Lrhw7V4UaEAqoDARh9Db29qCm+V7uCNggJez8/ntbw89ufmsr+ggFc3bWKz0fhbjSCk7wGkeJ44AMfl4ur2iIUP+/PyeDU7m5aNG3jxvaVsMc9j81uhbIuJ4rdrVrE7M5NdGRnsTFjKL3XakxWAPZ7FGcBBUZbatmQxe9etY09mBhvnmHhM49BSAaTtB4L3AcYDQOxhuXikbqL3Hy0J8WxLTmbrsgR+rtM27gTksFYO+J0yBT64lJ7OzhXJrBrr8XMZYJ4PSGClHHA5qlN/17g4mufi43k2Lo6N0YtYIUpzX8MQsYDkoJtzc1vycrYuT2LlOI97xcAkPEO1yeT62fjRvY2L5rMhJoanoqNZHxnJ+ogIVvu/8mAn4IWnioCpNUGv81x8PE+YZrAYeOcN/FNjWpq+PX2FpSVqIc+bzWwID+fXYaE8Onk8a0JD+VXkfJaJwjY8tU0m5NVHmXkyOorlI7TXlwAyWGnavFl/uSS/rzPCzNaQEDbNns0zc2dxr5vTjx9LJccqjVN53GRihfeYm8GABIO2u9qfqTXP44mw2cyTCcWwUpeSou8uzrV0md/kxcBAthuN/GZWEPe4625vACZkA9P3vezJSpOJB6Z4P8oEXDAFQMkobV+VycTKQD+uB5IwxL45c/TnVyZZLocEscffn11+frwQbGSZh/PtDMAbjyUDTqVuGubY2XGrvYxZgC8mAshxVl4t0ulY5qVnBrAcT6wB9OUTPCw9M/zZ5+vLPh8fdr86ibs8XW6vArzxRCLgVOggchPAXAeRa4HJGJSllZ/dLJWwxEHkWlEowWMpgH6ro2hpspWxC+AVgD1KKYvV4p0PAAOGWAUEFKtF5gDcohYfLQP0GJQqCkUFapHbBQk36hQ3lwIjs9Wi5aydjF0A+wH2q6Qs0sjvJAAGWFkjCrm71SLzJeAGnfwHH0DAoFjAmOOiYCnAXa4KfqQRf6m3l7EdoAXgNVsp853kA0sAA6zEAa55rop75RKwRCNnqkLYiacMgLBCK7+4WyVlhUzCakeRDQAvAOwdJuMWZ8VAJOADK4sAm9WO4unDjiL3AMzW2/wZA3hjKDMQmO2ufFghAasBNgBss5Mxy0UxEA74wEok4JmmlZ877qzgUYBlrjaMU0p3jIQVDYAFcmHdDk8Vv5CApwHWeKqY6mpzJWNaQGppQsLMvStXTvskMXHxluCAT7d7Drt/Ri2yFuAhnYKJGnnHDMAWz+IOCGEKIbtwtO2jk0opmwF2KaW8MFbD1oBxbDMa2Dl5JHt0NuwA2CABD7mr+K5W3joT0OF53AAEAuHvj1DeOuChYoejyG6AFoB9AHsBXlIIrHNXMstDdT9ULuT6AjZ4Ud6AcjoQu0CnqP3QoLtbHjDm4ZEgw18lAaN/T3pJ2xEklaz3B9wd8R8NA6AHZGMFwWGSKGqGAwon/Lu/AfTVATRByfxAAAAAAElFTkSuQmCC"

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACYQAAAmEBwTBV+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAQFSURBVDiNfZVNix1VEIafqtOnu+/c+coNITpIhlHBuBHRSNSVMC7cipCfYMCFOzGL7NwEXSSgEeLfyCpMwKVMFkFw4QdZOH5BrplkMvfentt9Tp9y0XdmkoxJQXEW3efhrbcOVWJmbHx/8wdL7euIoKqoKoKgoogIIgLCY2HJMDPMkiUMS4mUEqLux/ffW383AxiPds58fXOS9ZcG+EzInZA5xWdKroJmilchU0FVmIbEvd3Av7uR++OAmQEQ9nb44sPFtwAyABElW3wOv3SCwmuXmZJnSuEdRSY4FUDYulfz019jQtvB6B1WkSgRqTgAI9CkREgJjSDSpQGxNSoRUoJf/tljexQes6SXK6+t9jmxkBMrQCo5BAN1Y7g6Epzio6OqW5wq3gl7jfHHvYa4rxJwKrx4smTlWM5Cz2GWqEI6+H4AHk0jTdbiXSJzCe+68qsaRnuHF/ahqydySg/3Jw3jWnAiVOMGTA7BilibPHWj1AKC4ZzhnSIK/Z4incUI0C+EkCIPKsAgGWQOwiR0/z3qsYqQe8V7Ic+ELBMyB84JqnTPruNgZsRktNGIrdG2iXbPCJPmqBXzPaU3r+Reyb3g/SNwFUQ7tTZTmJIRI4RohGg0IbHX5sDUHgPPzSn9OUeRC3muFLngsy4PVc/AyYgtxGg0oYPWjaDBse/F7B0LvVzp9ZSyEMq8O/N8pn4G31fcppnKxqibDpq5hE31qMc+Vwo/g5ZKrxDKQimLQ/WqkFJXft0Y0yzhHIgYBoRcH/c4JWPQ/El/sk0ewFddE50H8Yo5wbyiGbQRLCQkGi4m8gASDN8mdLoHNncIvr/94KsPXu19VOSudKo4pzjnumHUDaTcOfe8iJBS+huIbWoPBk/btrRtoq7b6WhS3QSQ/QHyZIiIXLp06aXBYHBmOBy+s7Ky8inAcDj8st/v3x6Px5sXLlz4/X8vPw0sItnFixevrK+vfzyZTPxwOOTWrVuoKufOncM5x2g0ajY2Nq5evnz5MzNrn2RkR6hdLFy/fn1peXl5d21tbXltbc2dPXuWPM9JKbG9vR3v3Lnz8MaNG8eAPrD7TMXXrl174/Tp05+nlAgh5Ds7O8eqqloGSu/9nJnRtm1VluXu4uLizmAw2C6KIgBsbm5eOX/+/O0jikVErl795rtff/v5zW4zGLNmAdAER0oJM6PoeaZ1xd1hjZlR1zULC/OviMjbNlP6qBVz84sLL5dFQQiBlBKq2q2b2XqKMeKc49QLpyh7JYKw8/AhbdtS9sqXgTlg8iT4+PLicuGcWoyRGCOqjizLcM4RY5idkbLsoeJYWlq0pgnifU5RFCVwfB984LGInFxdXf1EVZ/W0GdGSilubW19a2Z3Af4DLiPzU1Ge62sAAAAASUVORK5CYII="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAJhAAACYQHBMFX6AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAeBQTFRFAAAA////AAAAAAAAAAAAAAAANTU1AAAAlpaWmpqaAAAAAAAAcHBwAAAAAAAAAAAAqKioAAAACQkJAAAAAAAAAAAACwsLQkJC19fXAAAAgoKCzMzM29vbFRUVDAwMCwsL4OHgCAgICAgICQkJzs7OCQkJMTExCAgIBwcH1NXUOTk54eHhycnJRkZGSkpK2dnZoaGh1NTUcHBw2NjY0tLSe3t7wMDAm5ubysrKmpqaaGhoZGRk09PTe3t7xsbGzs7O6OjocHBwmZmZ09PTz8/P9PT0gYGBjY2NlZWVsbGxvr6+x8fHr6+vzs7OrKysra2ta2trkpKSq6urrKysY2NjpqamqampwMHA6urqw8PDwsLCzs7OxMTExsbGy8vL0NDQ19fX4ODg4eHhhIWEo6SjrKyss7Sztra2urq6vb29v7+/w8PDxcXFyMjIycnJy8vLzs7Oz8/P0NDQ0dHR0tPS09PT1NTT1NXU1dXV1tbW19jX2NjY2dnZ2tra29vb3Nzc3d3d3t7e39/f4ODg4OHg4eHh4uLi4+Pj4+Tj5OTk5eXl5ubm5+fn6Ojo6Ono6enp6urq6+vr7Ozs7e3t7e7t7u7u7+/v8PDw8fHx8vLy8/Pz9PT09fX19vb29/f3+vr6RBN/vAAAAGN0Uk5TAAABAgMEBAUFBQYHBwgMDxMVFRcZIyMqLTY2Nj0/QUNDREZISElJTE9PZnV8g4aGkJGWlq21uLm5u8PFyMzMzs7Y3d7h4uPn6vHx8fLy9PT19fX19vf39/f6+/v8/v7+/v7+yMjhbQAAAVNJREFUeNpdzE1LAlEYBeD3vfeOOqM20NcYGYaUfZutoiBb9juiX9iiCKJFFBFEhV9FBFGopDlNoqLO6NzbVGrqWZzFw+EgwmA8kUluX7MhDQUP7mOf5SH2xndv10uqmwwojmzfrRb9jAystamF5HJhjNlmPy+G9x4jxXGJH+b6WIpuPsx9aC5xlDE6LAhsmN6ncCnAxHGqaP8wLsleqbYy/xLUNQYnmYIFiDAdjjNK7Ep5tB1w41kqb4HD6k7UC0gQm4WQRM4TOUeB0rVYs0EoRcKwpVwlso467NuCkuFSKJqoGOnk268CUSb004t3Dg3uYnrq9U+Bqdzjkz20iTLl6Dx0uCq0fcQ2lZnTXQXSMpBQgR5GBNOhx/VndwuIi6LAbJ53mdoWm7WZhCh9XaatHoNZrxIF2pXMTbqCXUYE6p9RFVErZ6sIfQxCAtm2OIf/fAPnrn/4UsZ1SQAAAABJRU5ErkJggg=="

/***/ },

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

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

/***/ },

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

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

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAN2AAADdgF91YLMAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAt9QTFRFAAAA////AAAAAAAAAAAAV1dXAAAAKCgoAAAAT09PAAAAAAAAAAAAAAAAAAAAAQEBAAAACwsLAAAAAAAAAAAAAAAAZmZmwMDAAAAAAAAAAAAAAAAA19fXAAAAAAAAsbGxAAAAAAAAAAAAAAAAAAAAAAAAyMjIysvKAAAAAAAAAAAAAAAAAAAAAAAAZGRkAAAAMjIyBAQEAAAAvr6+AAAArKysXFxcAAAAWVlZAwMDAAAAAwMDAAAA1NXUAAAACAgI0tLSAAAAAAAA0dHRAAAALCwsAAAAAAAADw8PAAAAGRkZGhoa3d3drKysMzMzLi4uQEBAgoKCMjIy1NXU1tbW6OjouLi43NzcVVVV19fX6enpUFBQmpqa3NzcZ2dn1dbVeHh4X19f4+PjS0tLXFxc3t7e8PDwzs7O2dnZWVlZhISE09PT0tLSnJycpaWl1tbW2NjYnZ2diIiIwMHAhoaGhISEtre1g4ODhYWFhISEl5eXgoKC1tbWgoKC4uPidXV1pqamfn5+gICAfX19h4eH1NTUe3t7lpaWycnJsbGxu7u7rKysy8zL39/fZ2dn3d3durq63t7eq6urubm5n5+fp6en1tbW0dHRo6Oj2NjY3t7e8vLynZ2dnp6e1tbWmpqat7i30NDQ3t7e8vPye3t7hIWEnJycnp6en5+fqampr7CvsLCwtbW1tba1uLi4ubq5u7u7vL28vr6+wcHBwsLCxcXFxsbGx8fHyMjIycnJysrKy8vLzMzMzc3Nzc7Nzs7Oz8/Pz9DP0NDQ0dHR0tLS09PT1NTU1dXV1tbW19fX19jX2NjY2dnZ2tra29vb3Nzc3N3c3d3d3d7d3t7e3t/e39/f4ODg4OHg4eHh4uLi4+Pj4+Tj5OTk5eXl5ubm5+fn5+jn6Ojo6enp6urq6+vr6+zr7Ozs7e3t7u7u7u/u7+/v8PDw8fHx8vLy8vPy8/Pz9PT09fX19vf2+fn5/Pz8PhRUrwAAAKR0Uk5TAAABAgMDBAQFBQYHCAoLCwwMDQ4PEBAQERITFRUWFxcYGRobHB4eHh8lJiguLy8wMTI8PUBAQUNDRUtLTU5PT09RUlJUVldaW11eXmNmb3Byd4GCiYqLi5GYnZ+krK6vsbW5usPHyMnNz9LT19vb3d3g4+Pk5ubn5+jo6enq6uvs7e3u7+/w8fHy8/T09fb29/f4+Pn5+fv8/Pz8/f39/v7+/v4cZ/GWAAACd0lEQVR42m3Ry08TQRzA8d889tHtLk0rVgUhJMQgpaRBA570wMEDFzHxdcMY8X/wfzAxetDEeEPj2cSTIsYUFfBtoqjFkqYFSktpgbbbfcyOXVCylM5lDt9P5peZQQiaL0QvqHptLg2o+SJjE1uviuXbavMT0Eh39PL7mLRqX6JN+8DFUWdmQFxSQcbNgNx9zprpF9KKBrgpoCF9Niak1BYOsH8E7wkfu/kxRlIhleOp2n6gjF/b/BbDqVYNoDKz2Qjw6OBYYT4G6YP1rt/6XGoEatf1XKLfWQn7Aap3ZjMbewE9xNoyi/1s1e21u2/Ty84uQFLHBr8aSQ4no1buiApYv/eu3mHnJcXR1mDH6ReLg0PrmT4r36ZiWrsfT9X7NkBnesYZ9VnYQL95lBXqnZgP4otudwE+f7ZPldxZ2LaMBaVLw8R6OL2w3YECOjEcCVKHAQFEJRRs9wGqPXrj9h0QOBXhJZBkygQmMl/nukTNiXjiXwciDt9wsoUtoFTggm0LYFflx9M//3egasAsLn0XTyoao7YBhAayT6bndztQMeSUJwr+1eOMMgMLIghf4j92OwAW2nk5l1nhGKEKEB+pbwlPBypj3juSDEcJqYhIQYgjseLpQO3lPnolZCCtIoDfvSrROXiBUSQQ4JJUFbACmCPM/lhegM18i8kQrhLwAcaI0cSa4QUE0c0hQxAd0DDBnJPq08k17gUM2Qd6K+CTCUEcBPLs+a+9J4AuGXKEmxwcwEpx8vVcEfaO4FUjn4/oIEJZ+vpy6pP3EXa+myvh1sjRw512Np37kC0yaAQAWAsp/iDOGqWSzmE/cIlERW5aZmMG+AuhhgxfDfEq7QAAAABJRU5ErkJggg=="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAIRQTFRF////AAAAAAAAAAAAQYfbAAAAAAAAAAAASYzcQojbRInbhrPnQojbQYfbQYfbQofbRInbRorcSIzdSo3dTI7eT5DfUZHfU5PgVZTgaaDndanqgrHtjrrwmb7vmb/vmsDvm8LznMHwoMbzpsn1p8r2rs73r8vusMzuttX5wdjxw9nyxNry3mvlKAAAAA50Uk5TAAQJHyI8Pj/L+vv7/P70ZqA0AAAAXklEQVQYGV3BMRIBQRRF0Xt/PwEBC2D/+xJJ1YRqTEtGdXMO/PF4AF7ryi7tWvR7ndjF9wY3vh5e+BXPzJbYV4YYS4YylgxlVAaNhkFjyaCxMTM+mWkrkV3vm8qsfwDirhBpHkLSTAAAAABJRU5ErkJggg=="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAFMSURBVDiNpdKxapRREAXgb9b74yp5BG0sJFhbWaSxURBMI2TBJpjkAQJCIJUQsLKRQArFBRfUQsEiEGULxTLgA1jkJVKYGFfHYm/C6m6QJAMD994z5zBz5kZmOku0zsQ+rUCsx6VTC8RGPHXO19iIaxAn8SCexRMs1+sOpo86iG5cjW4c21F047FiWUHxXbGQizloQfTiumJb8SJ6EWPkXjxSrFTyvuJuzudnCK8UfMOVWv8cS9kZzhavYxVrFTvAbHZy61C8lZ0caMxp7GrQWNBYh3gbDzXW6vtPjXujZEZMjPdxAx8xVbEvmKnnAeZyNt+NjTe6hdiMGWzh4kjNL9zPO/lmorn/rjE+xE1soo3fmM9b+XISGWTmWOq7rW9P34NJ+F+1xwKfXP4fOTNP9hMnRTmaPaKNC4YGtnG+4mm4hQP8qLmPvcwc/AE4pbcHcRdePgAAAABJRU5ErkJggg=="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJvSURBVDiNjZI9TFNhFIbfc9tSC1RqTCeTVqIUN0lJVAYHpy5OuLkQTRxgKIOJwtLEkGIbooM7xDgAjYwiwbrVaJQW6ERuk1sTGprAhZtYKvfn+3qPCxhCbOQkJ2c5z3t+8hIz47xBRLT6afXjwM2B2/v7+78KhcJz73nh0dHRa8VicbOvr69L13UKBAKXAoHAPeW8AoODg096e3u76/U6ua6LYDAI13XlfzcgIn/+c34zkUhc3anvQFEUhEIhHB0d/a5UKkUwc9sEoOTzeaP6s8qlUok3Nja4VquxpmnNdDqdAkB0+olE5I/FYpfj8fiVoaE79yORaKL/Rn/8sHHoIyKEw2E4jtPM5XKZVCo1zczsPQaV+fn56d3d3bGOjo4uy7JI0zRnu7btNw4MKIqCcDgM0zSbCwsL6ampqSyfTGZmrKysvBdCsGmabBgG1+t1rlarrKoqLy9/4K2tLS6Xy43JyclnAOj0mZ5ms3l3ZGQko+u63mg0bCllp2mafxt6ekKwLOtwcXHxRSaTecVnjKPE4/EHhmE0IpHIrfHx8cd7e3tSCAHTNCGEgOu6yOVyb7LZ7OuzMAB4fT7fRcdxLkxMTDwMBoPXPR6P17IsEBGICK7rwrKsg3/BAOBdW1v7FovFHg0PD78kIkgpQURQFAVCCNi2ba+vr/9o5xNlZmbmXblc/iKlRKvVwkkVQsDj8UBV1UKhUGgvwMz20tLSU03TvjuOAyklhBAAwJVK5evs7OwYM4u2Tj05jYi6kslkMhqN3pBS2qqqlubm5t4ys90OPivQCaAbQCcAPwAfAALgAhAAbADOcbUBWMzc+gOCAoIhT2azRwAAAABJRU5ErkJggg=="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAGTSURBVHjapZNNTsJQFIXPe31ttTiQKARNdeSAxIHOJTG6A01g5sC4BBfgDtwArgTnLkAmGAI4ABxAYlJsof/eFnwhxgDql5zcl5fTk3tvWxbHMf6DqNfrp4ZhHOIPeJ73JjRNv1MUcaZpGjjnqRhj0hRFEZIufd9P74MgAAYD2I818IvLV0EGfzgcIpfLYwEUEsG2bYRhiA0jgw7VfT8IxXg8QaGwA13XpNl1PTiOg2x2E/NkMhl5Pr6+Qa/XhXBdF6a5i9rzO9TQxsCOUSntod9/o662sYhmswmBGU8vI4QiB3vioIIpjUYjnf07pmlSd9l0NzLAmlDbky6MNQ5gCwnFYhGLoAAmA+6vDvBbYsRCYAHLRmCADEiXqEUOBh8xyiVzpREYY+LHJZaxGpxzVQaM3ACO1YehM7nEZSMohEi+sHa7g9vzdWlotTqwLAv5fO6rVVlJaWi324OqqoJVqw8nFHREQclr4QAUspKgkHkqzhTOeHIWJE6klfwN+TsnRiranNRpGBgpMQUzeTO59Gz0CQX0uPJwLVxMAAAAAElFTkSuQmCC"

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAAnNCSVQICFXsRgQAAAAJcEhZcwAAAbsAAAG7ATrs4+IAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAABXklEQVQYGQXBy04TYRgA0DMzP2BpuCSgKF7QiBE3JiaujWsjr+DK59A3MXFvcGPcujKsTDSYIFq80QpYmloLxVJmPs/JAnCUufV9+c8ys42rDZv1AISwsbj+8le/G53oxEF0oxt7/fW1jcUQhBerXwa/Yzd24lccRCd2oxX70Y7GYO1hyMKb5pWLGUIyITNSITe007x/OXF07hAhkwxRKlEJ3QUS3ZSbBpwiIWT6momcUy0f1eWSSZOSwoxtDZCT+6vnmzpamn46q1AzFEgwa1rblGMjldJ7ybiaQKKMZlazIlywp5JbcMaWvlpFosiWFFruOFSplDoqI3NOchInp1/H5q3oKxDGzBo39ENRkmN0Q13LJZMyuRB6eualE3K2njaqgUWftA0M/HNoyox2tfmELPD47vnnSzfvFT37SoUFw/Lt1udHz96RBeDBxLXVudvZ9cpw+/jD9qvXQ+A/WHapO5F2Z28AAAAASUVORK5CYII="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACYQAAAmEBwTBV+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHSSURBVDiNzZU9a1RBFIafd++NWTcp7IQoQSz8FRYLhhBEgilWEBUsFIVUQVGRWBgLtdBCEogoBowfS4IiEkxhs4KFoP4AsbPQUheR3RiT1yJ317t3PzEuODAceO+c57xz7gwj23RjpLpC/e/BQtKsdvxTsJCYYZZ13mpGe6r6Zn+ebmsaGI+qfMZkfcofN+VYd3STgHECIABSDBBwHBKt0F1t7xg6p+uETFShG/MeJ5isAWtOu9nCO93XrbbQeV0h4FwCOs8nTpqN3so2ymsXa7wCBqPcGz7isw2hD3QJMVUjmjy9HHXOaxWp4vg0AYOx6mf0WFfroHmdJ2SqxmnIE3ZyLA79A/7ARVI8TCRc0KIuV6ELmiDgWmL7zyly2Fn/qjNROW5aVEDII8yhxDYnSfENM53Ql1nnoHP+2bBl8XOsgkKKLABjjRbHoC/ZxqizLjdbUndB9F49fOEpcKBJToES+51zqVXthjdPy+pFPMOMJD69JmDEw/7RCtoUDKCC0qywhNgXSW8oM+xRf28HbQkG0JIyZHiB6cMMecjFTqBtwZHzfkJ6vNdfO4V2BP7b0bUXJASQFAJpoA/IAFuj2B/FdGRiFSjFZhlYicVSFFd/A82uncZDNxmxAAAAAElFTkSuQmCC"

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACYQAAAmEBwTBV+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAPcSURBVDiNpdRNSGNXFAfw/33vJSa0mgwmVCmi2BLEUaqJRnBhB6YrS1cuKgSHbjJCYTa2y7EDZVCqFhU/siiIX11kk87surAiSclzNEYcXAhBJ0WTiU5Ta8zXS957pwtN0HZw0pkDZ3Mv/Hjvf8+9ICK8S3d1dVV7PJ6nkUjkz5WVlQNRFDcNBoPxrUEAcLlc366urv4hSRKtra1RKpWi/f196u/vfyDgLaujo6OxtbV1pLm5mXm9XtjtdhwdHcFoNEKr1ZZx7wC3NTQ0MJ/PB6vVisOjQ5SXl0Oj0UBVVcYKv1VqDQ8Pf9l4u/Ere7v9TjAY1LW1tyH2MgaTyYSysjLE4/G/nU7nFyVHwRiDy+V61NnZ+U1jY2O5KIqw2Ww4OjyC2WyGIAhIJBJJt9v9k8/nW/8/hyWs/LZyHn0ZJY/HQ+FwmNafrVM4HKZIJEKhUCg5ODj4AwCBiPDaKBhjAMADEADgydMnv54cnxzf/exuT2AzINhsNsSOY6iuqoZGo0E6nU4uLi5ODw0NDRKRDOA6bDabDfPz8z9bLJZWAEI+n+ei0ehfoiha+u71we/3w2q14tXJK1RVVUGr1SKVSp0vLCzMjoyMPCyg1+DR0dGvHQ7HY5PJdCuXy6HQ2WwWZ4kzeL1e2NvbkU5nUF1dXUQXFxdnxsbGBq+iRdjhcHwyNTUlGo1GvSRJuNqKogAAcrkc9vf3UV9fD57nC+jU+Pj4o3+jAMAAcBsbG89bWlpuJ5PJXCaTISIqy+fzkGW5mLmqqpBlGYwxpFKp86WlpenJycnvXocCAAfgVm1t7UcHBwfR7u7uOw6H4/NQKBTOZDJQFAWKoiCbzSKfz4OIkEgkzufm5iZuQgFA6Ovr+5TjOF0gEAiIoigyxlhPT89uZWVlHc/zkGUZRARBuBj5vb29ndnZ2cc3oQAg8DyvSyaTqKura3U6nffu379vsFgsNiKCJEkAAJ7nQURQVRU6nU5/E3g14w/8fv+eTqczZrNZhTHGaTQaRkRgjIHjuMJcg4iwtrb2y8DAQA+94S3gAJzu7u4+lyQJ/EUxRVGKN66QM8dx4DhO2d7efvYmFAA4IsotLy8PxuPxaGESVFUtgoqigOd5aLVabG1t/b60tDRdShQcAHi9Xp/b7f4xFou9kGUZsiwX0csvV4PB4ObExMQDIkqVAhdvHmOMNTU1WXt7ex/W1NR8XFFR8aEsy6nT09PIzs6Ob2Zm5nsiOi8FvQYXFxgTAJTr9frKTCaTBnAGIF1Krv+BGWMaAO8BMAAoB/D+ZetxMTkqAAVADkAWgHTZ2cu13JW9HAD5H9WtrcLFM0dLAAAAAElFTkSuQmCC"

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACYQAAAmEBwTBV+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKASURBVHjatZXNTttAFIXP2NPYTsJP+AnBtGrYIDbZd5V211XVZVdV1Q0P0DfgbfoE3XRFpUiFTSq1hAUKKaRxgYYG7Ch17NjT64kxgUUaUfikozsaj47unMlMmBAC94GCe4LXantvc7ncG9whtm1/5kEweO553lNAQNN0RDDGpG5CsSXVdV2oqopo2WAQQO10YG1sYHFzE+7KyowyGIQy562tLbnA9wfwPB/9vndTcp4k1/R6PVQqFQSBwNHRofx+3nVQr9elD9ve3nmfy829wh1yenpa5b7vQ1EUmOYy2o4HgSE6ZySBZrOFpaU8stkM/kWUlGX9pO774NG2Zmen0Tjz4AYauKDt0rb2Tvp4XV5GKvULCwvzmBDptb/vgSPGDwTlc4i2a4ASQrsncInjOKhWqxjH2toaCoVCcrgcI3z88TAZB/5FMp6amkK5XMZE3DReXTSwnmshiH9Sj+d13B6hJsbT6RTevVjF/yKEFOeYgG63i1qthnEUi0Xk8/nLC3bVcSgEvjUdCDBEzBgqiotpRGQyGZRKJYxD0zRcMdLxLpkaWhr22TE838fXA47is3RyxQ3DwEQwRPeCX+u48uU7zllB5tR2urgNDIyM2fWMP1lmMhaBQIx8FxqNBsZhmibolQQbdjzMOAwF1s0sXpbaCGLDlTk9PuUQuq7TtV7COOgckp7J9wFnDKLVssg8xJNHTH4Y4tOr1cTFhY2Dgway2WySN3E1ZsNq2w4iOp3fUAl+fHzywXHsuWbzCEIIKUAoACNBJSmW1ZKVHFRG8+RDYiopqjwqlKuqENE8Rbdzb/95LBYnaSQjqrH0kZoi8XhtSPJJHqk/Ipf0J1b/L31HK6MFAzshAAAAAElFTkSuQmCC"

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHaSURBVDiN1ZS9bhNREIXPmfu7a0QiCIm7SKRIGkBIvAANDQhRUCGoKVLyANTUtH4JeAaQksYdgYAswArCINlJCElsr3eHIloLGtvyKgWnulOcT3PvmTtUVZyH5Fyo/yXYlofNxsf3veNso6yTYHpXlpK7Lx6ubs0DZhne45c7g3u3Vrx3Z5dodU7QbB2oAkoCKEoHAZZ2BUGQVABIvHQbT9dX/unYiIAydmCtnmKtnhJ/YSapUMWr7R+Xy3oMds5wOFIUxXzjVyjgnBvXvPZsq1DVmbqaVSTVkuCT21cPL6ZuwVTE5wrsdfv7r7fbi9YZUzS/DvOF1EBY7RfmSvw6ztUZW1jvXEaKidGDqAZWEEenAxO8zWwMrk9AEm9QfW8QhJrg3alNgjsiikvBce6JKCVyBk6D79la9PsiXEoCMcqrpWcNQYJpdF1bi+6nqq5HJ8ikWsfOCEhIGl3HpsF8OxlkjB6QbP74CMA7QKC8EEzb1qL53B8OJdgC0GIqYBLZW0AEkkZp2SRw11DFYIAgFcAADARClVq072xn923bLN9E7/cQo7zaG1tDGCH2Prz5xI0799NHm43D1fqinW6dri/fD7LnD5YjVRUkrwO4gRlX5AQVAJqquvMHh8CfFP655doAAAAASUVORK5CYII="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAK5SURBVFiF7ZdNiE1hGMd//3OvGZqGRCZRSikLC8pCUvNd0+RrQkk0viOlLGRhNWUhCyVF42PykUwuysT4ZkY2FhYWFooopUg0SZg7M3+LuVfnzpwzc+8wZsFbT+/tPM/z/n73fe+5517ZZixHMKb0/wL/jIBSSuiodiulxF8XUJMCPnCOBEf4wDk1KYeZHFU4EmW0AOsyl9ZRRlpok+m//0dtB4REM80ENBJkSP3RSDPNQhpVAU5xlATbBsD7I8FiTjARRukIdFqHCdgVk35BH9Xe7i6I2AG1qFRndUwtKh0R/IwOkmBP5DsPeAVUeavfZ+tzBHReJSRpR+wkyU2dV0lB8LNqImBfDPwNptKb/S6nJ/swUkoT+EE7UBHKd1BMvdf427DwC9qPORCZNG+Bcm/w60F9ttEZjaeINqA2ov0e3SzzRn+PhV/UXsyhmPQ7+ij3er+MSgY5r6KjhvFcVUpFkfBW7UYciul9j6iOg8PAI2DQEYRHG59Z7e1O/2q+pB2I4zH1Hwmo8Co/j4PnCEDmQ1jCLcySmPorTGGtK9yjq9qCOQkoou4TAVVu8LOh4IMEANSmUnq5AyyK6WlF3MacJvqLrAtR7ZV+Ohw8UgBAKU2iiHvAwnwWCY0vQK1X+Em+DZECALqhyfTyADE/z7W+Iuq81I/zhQ8pAKDrmop4CMwbZp1vmHovdUch8GEFAHRH0+ihEzE3puQ7ZrnrfbdQeF4CALqt6UAnMGdAqhvT4Dq3jwSetwCAbmomSTqB2ZlLacQa1/jaSOEFCQDogWZhHgEzgLWu9uXfgRcsAKD7mk3AAlf6yu/CRyTwp8e/8b9gqJHzm1BSEigCxoXmZGZOhELkPoQM9GWiNxQ9EZEGemz3/hKQJPp3IxkCZiWyURySygoFGWga6M5EOjSH5YKQuCQFtvt+Alc49axxjmQBAAAAAElFTkSuQmCC"

/***/ },

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

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

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVHja5VfNThNRFP7unWmplaYFTBOKiJFo4hJ9AtiQuHfj2jfQhJ2u/Ulg5TP4BLiC4DOACQpjQSgSav8ohba3M+M9J2WGYZAgU2Hhl349Z+7cOffrufectsJ1XVwnpOb/LcCcn5+/NzEx8UEIcaVi9Hru+vr6RzOXG3kej/dNK6VoEKZpIgroTCnVRiwW53i2bcNxbL62S79QX1hEanoaRjqNRCIhZKPRSGrCMCSSyRvY399Hs9lktlottNttkLgzSPc80lxio3Gg4yRRLpdxeHjIYlKpFHZ3d7H96jWSpgFrbpbu0fw+6TiOAoR+oILV1VV0OqTYZdq2w9dKdc4i3fNIc4kUq1KpYmVlmf1arYZCocAizbExrM3MYG27QPfoOSWWlj6/Gx298xIAp8swDERCOA5nKxaLsd+u1xHXGSHk8/kFU2eAJxyDriMjHMdbQyQSnm/bHWgBNqdndHQEmUwG56FarWJrq3CRuReJw0JMvW8kwAs4+6mA24M3qU7oxdgsHuDFE14UlpVnGwFeHBZwXDrHeJjrx6PhNr7md+A6DmzHRcXIBMosOjgOH/RQ0S9bRezt2ijiAY638WelitNYXFzE3t4eLopsNoupqamQiJCAL6UkfjQHAmP1RvhTT05O/tWBlVIijDME1I4UGh0VGOsodVYrjVqytAUiJOD90zRK9aPA2K1UBj2Ff5aMkIDx4YwmrgqGxPWAMyAEZ+Di6H0VRBAQuQq40QkZFHB+J+xpFQjwmxkSQJ3wcU7h28YO+CvZcVAx0v/iFxGkkMYfOqGDIu4HOmGPwVtCSbxkJ4wOIfkMhAVUG00ctJunOmGz51VgSElZCAuYe5ZFud4KjA2msj2vAr12sApKpTKGhgZxN9vPDIPnUAPx5l62Cqq1mn6WM2CaOogD/n22QTyvc3nWsr4zGYJewjvZ3v5C8LWUZKXvU+r9EhamZVlvBgYGxwEn5rq8wEnSc0K7slu6knwaIx/wLK/CWjQ1pGfZQLLPLvtCC3A3NjbfXvuf09AhJHEAiCaTfaY8RcH04Z6go2l71meHqD+0HeiI3QViXcaJQZ/Z12WCrT9HdhdSmi3NJluf7S4VW39MEX8DHff921Ng1cgAAAAASUVORK5CYII="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIcSURBVHja7ZevbxVBFIXPuXNn+2hDX4EKDGlAg0MgUCQ4DKIJgn8B3b8BjcFgMbUEDMFgcdRBSBpMRRtef8zQ97Z7L7OveaEVBNF0avrtnmQyZr65J9lk6e64SAQXjM4Wrz7uPBsO5A2JeZzAHd144h++7/D5y9Vru+c2AQEezEWbb9RwMmUvLC74k9s37N3a+q/huU2g7YBx6/gX8w0e3lnuRq8/7eAsCH0yPsLTF4+X358SmLTWC/x/XMRZaSYtHgE4LbC1+3tplB01KBO4Pltz7e3m54WB3AM4IHwOFXBwDPhhOrSv+mO7W9HgWYgggioCZmjNkdsjW9EmxqQhDIUAiSq4A1Yi0iVttMkaZEh4VQEHIQxZY4w5BsHxltcRAIESimUdRE0hhKmWVxIgjvsO0wqipCDszy+pJEBO04kkjZFZBTB3uKEKFIeQODL2FUgWAmaECaogJEQIdWZtlKkX6HoBqyQgRCgxR6lAmUUAdqSZ1xKghumFSwWKBCEE7B1Qg9ALKAHzpLFhJvoHlK6SQACjEg5knQtMkNmHwVEDFaKJBAxJB5HZSLixp5YAGyXEkfsKkjvQdV7rfATxIgCQTHolMrcOTDoEWh0DEYQYifJm7RwH+xPy4BDqqAMBNSGHjR+oDbDx89vmXrOwdBOopzDa3tq/evfWBt0dJFcB3C9Z/Ct5bnjJXskXd1+fCRAXgBcu/w0vBf4AFt7lwaWEKeAAAAAASUVORK5CYII="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAG7AAABuwE67OPiAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAACdQTFRF////iIiIiIiIiIiIkZKQurq5wMHAxcXF0NHQ7Ozs7e3t7u7u////uU8kFwAAAAN0Uk5TADvYTsxxAAAAADFJREFUCNdjYCACCBmDgSKD+uzdQLCziMHqmMcZIFjMYH0mBsTYjIUBVwPXBTcHNwAAGnsmhQ6XRI0AAAAASUVORK5CYII="

/***/ },

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

	/**
	 * Tine 2.0
	 * 
	 * @package     Admin
	 * @subpackage  AccessLog
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philip Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010-2014 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	
	Ext.ns('Tine.Admin.accessLog');
	
	/**
	 * AccessLog 'mainScreen'
	 * 
	 * @static
	 */
	Tine.Admin.accessLog.show = function () {
	    var app = Tine.Tinebase.appMgr.get('Admin');
	    if (! Tine.Admin.accessLog.gridPanel) {
	        Tine.Admin.accessLog.gridPanel = new Tine.Admin.accessLog.GridPanel({
	            app: app
	        });
	    }
	    else {
	        Tine.Admin.accessLog.gridPanel.loadGridData.defer(100, Tine.Admin.accessLog.gridPanel, []);
	    }
	
	    app.getMainScreen().setActiveContentPanel(Tine.Admin.accessLog.gridPanel, true);
	    app.getMainScreen().setActiveToolbar(Tine.Admin.accessLog.gridPanel.actionToolbar, true);
	};
	
	/**
	 * AccessLog grid panel
	 * 
	 * @namespace   Tine.Admin.accessLog
	 * @class       Tine.Admin.accessLog.GridPanel
	 * @extends     Tine.widgets.grid.GridPanel
	 */
	Tine.Admin.accessLog.GridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
	    
	    recordClass: Tine.Admin.Model.AccessLog,
	    recordProxy: Tine.Admin.accessLogBackend,
	    defaultSortInfo: {field: 'li', direction: 'DESC'},
	    evalGrants: false,
	    gridConfig: {
	        id: 'gridAdminAccessLogs',
	        autoExpandColumn: 'login_name'
	    },
	    
	    initComponent: function() {
	        this.gridConfig.columns = this.getColumns();
	        Tine.Admin.accessLog.GridPanel.superclass.initComponent.call(this);
	    },
	    
	    /**
	     * init actions with actionToolbar, contextMenu and actionUpdater
	     * 
	     * @private
	     */
	    initActions: function() {
	        
	        this.initDeleteAction();
	        
	        this.actionUpdater.addActions([
	            this.action_deleteRecord
	        ]);
	        
	        this.actionToolbar = new Ext.Toolbar({
	            items: [{
	                xtype: 'buttongroup',
	                columns: 1,
	                items: [
	                    Ext.apply(new Ext.Button(this.action_deleteRecord), {
	                        scale: 'medium',
	                        rowspan: 2,
	                        iconAlign: 'top',
	                        arrowAlign:'right'
	                    })
	                ]}
	             ]
	        });
	        
	        if (this.filterToolbar && typeof this.filterToolbar.getQuickFilterField == 'function') {
	            this.actionToolbar.add('->', this.filterToolbar.getQuickFilterField());
	        }
	        
	        this.contextMenu = new Ext.menu.Menu({
	            items: [this.action_deleteRecord],
	            plugins: [{
	                ptype: 'ux.itemregistry',
	                key:   'Tinebase-MainContextMenu'
	            }]
	        });
	    },
	    
	    /**
	     * initialises filter toolbar
	     */
	    initFilterPanel: function() {
	        this.filterToolbar = new Tine.widgets.grid.FilterToolbar({
	            filterModels: [
	                {label: this.app.i18n._('Access Log'),  field: 'query',         operators: ['contains']},
	                {label: this.app.i18n._('IP Address'),  field: 'ip'},
	                {label: this.app.i18n._('User'),        field: 'account_id',    valueType: 'user'},
	                {label: this.app.i18n._('Login Time'),  field: 'li',            valueType: 'date', pastOnly: true        },
	                {label: this.app.i18n._('Logout Time'), field: 'lo',            valueType: 'date', pastOnly: true        },
	                {label: this.app.i18n._('Client Type'), field: 'clienttype'}
	            ],
	            defaultFilter: 'query',
	            filters: [
	                {field: 'li',           operator: 'within', value: 'weekThis'}
	                //{field: 'clienttype',   operator: 'equals', value: 'JSON-RPC'}
	            ],
	            plugins: [
	                new Tine.widgets.grid.FilterToolbarQuickFilterPlugin()
	            ]
	        });
	        this.plugins = this.plugins || [];
	        this.plugins.push(this.filterToolbar);
	    },
	    
	    /**
	     * returns cm
	     * @private
	     */
	    getColumns: function(){
	        return [
	            { header: this.app.i18n._('Session ID'), id: 'sessionid', dataIndex: 'sessionid', width: 200, hidden: true},
	            { header: this.app.i18n._('Login Name'), id: 'login_name', dataIndex: 'login_name'},
	            { header: this.app.i18n._('Name'), id: 'account_id', dataIndex: 'account_id', width: 170, sortable: false, renderer: Tine.Tinebase.common.usernameRenderer},
	            { header: this.app.i18n._('IP Address'), id: 'ip', dataIndex: 'ip', width: 150},
	            { header: this.app.i18n._('Login Time'), id: 'li', dataIndex: 'li', width: 140, renderer: Tine.Tinebase.common.dateTimeRenderer},
	            { header: this.app.i18n._('Logout Time'), id: 'lo', dataIndex: 'lo', width: 140, renderer: Tine.Tinebase.common.dateTimeRenderer},
	            { header: this.app.i18n._('Result'), id: 'result', dataIndex: 'result', width: 110, renderer: this.resultRenderer, scope: this},
	            { header: this.app.i18n._('Client Type'), id: 'clienttype', dataIndex: 'clienttype', width: 50}
	        ];
	    },
	    
	    /**
	     * result renderer
	     * 
	     * @param {} _value
	     * @param {} _cellObject
	     * @param {} _record
	     * @param {} _rowIndex
	     * @param {} _colIndex
	     * @param {} _dataStore
	     * @return String
	     */
	    resultRenderer: function(_value, _cellObject, _record, _rowIndex, _colIndex, _dataStore) {
	        var gridValue;
	        
	        switch (_value) {
	            case '-102' :
	                gridValue = this.app.i18n._('user blocked');
	                break;
	
	            case '-101' :
	                gridValue = this.app.i18n._('password expired');
	                break;
	
	            case '-100' :
	                gridValue = this.app.i18n._('user disabled');
	                break;
	
	            case '-3' :
	                gridValue = this.app.i18n._('invalid password');
	                break;
	
	            case '-2' :
	                gridValue = this.app.i18n._('ambiguous username');
	                break;
	
	            case '-1' :
	                gridValue = this.app.i18n._('user not found');
	                break;
	
	            case '0' :
	                gridValue = this.app.i18n._('failure');
	                break;
	
	            case '1' :
	                gridValue = this.app.i18n._('success');
	                break;
	        }
	        
	        return gridValue;
	    }
	});


/***/ },

/***/ 216:
/***/ 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-2010 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 * @todo        refactor this (split file, use new windows, ...)
	 */
	
	/*global Ext, Tine, Locale*/
	
	Ext.ns('Tine.Admin');
	
	Tine.Admin = function () {
	    
	    /**
	     * builds the admin applications tree
	     */
	    var getInitialTree = function (translation) {
	        
	        var tree = [{
	            text: translation.ngettext('User', 'Users', 50),
	            cls: 'treemain',
	            iconCls: 'tinebase-accounttype-user',
	            allowDrag: false,
	            allowDrop: true,
	            id: 'accounts',
	            icon: false,
	            children: [],
	            leaf: null,
	            expanded: true,
	            dataPanelType: 'accounts',
	            viewRight: 'accounts'
	        }, {
	            text: translation.gettext('Groups'),
	            cls: 'treemain',
	            iconCls: 'tinebase-accounttype-group',
	            allowDrag: false,
	            allowDrop: true,
	            id: 'groups',
	            icon: false,
	            children: [],
	            leaf: null,
	            expanded: true,
	            dataPanelType: 'groups', 
	            viewRight: 'accounts'
	        }, {
	            text: translation.gettext('Roles'),
	            cls: "treemain",
	            iconCls: 'tinebase-accounttype-role',
	            allowDrag: false,
	            allowDrop: true,
	            id: "roles",
	            children: [],
	            leaf: null,
	            expanded: true,
	            dataPanelType: "roles",
	            viewRight: 'roles'
	        }, {
	            text: translation.gettext('Computers'),
	            cls: 'treemain',
	            iconCls: 'admin-node-computers',
	            allowDrag: false,
	            allowDrop: true,
	            id: 'computers',
	            icon: false,
	            children: [],
	            leaf: null,
	            expanded: true,
	            dataPanelType: 'computers',
	            hidden: ! Tine.Admin.registry.get('manageSAM'),
	            viewRight: 'computers'
	        }, {
	            text: translation.gettext('Applications'),
	            cls: "treemain",
	            iconCls: 'admin-node-applications',
	            allowDrag: false,
	            allowDrop: true,
	            id: "applications",
	            icon: false,
	            children: [],
	            leaf: null,
	            expanded: true,
	            dataPanelType: "applications",
	            viewRight: 'apps'
	        }, {
	            text: translation.gettext('Access Log'),
	            cls: "treemain",
	            iconCls: 'admin-node-accesslog',
	            allowDrag: false,
	            allowDrop: true,
	            id: "accesslog",
	            icon: false,
	            children: [],
	            leaf: null,
	            expanded: true,
	            dataPanelType: "accesslog",
	            viewRight: 'access_log'
	        }, {
	            text: translation.gettext('Shared Tags'),
	            cls: "treemain",
	            iconCls: 'action_tag',
	            allowDrag: false,
	            allowDrop: true,
	            id: "sharedtags",
	            //icon :false,
	            children: [],
	            leaf: null,
	            expanded: true,
	            dataPanelType: "sharedtags",
	            viewRight: 'shared_tags'
	        }, {
	            text: translation.gettext('Containers'),
	            cls: "treemain",
	            iconCls: 'admin-node-containers',
	            allowDrag: false,
	            allowDrop: true,
	            id: "containers",
	            children: [],
	            leaf: null,
	            expanded: true,
	            dataPanelType: "containers",
	            viewRight: 'containers'
	        }, {
	            text: translation.gettext('Customfields'),
	            cls: "treemain",
	            iconCls: 'admin-node-customfields',
	            allowDrag: false,
	            allowDrop: true,
	            id: "customfields",
	            children: [],
	            leaf: null,
	            expanded: true,
	            dataPanelType: "customfields",
	            viewRight: 'customfields'
	        }, {
	            text: translation.gettext('Server Information'),
	            cls: "treemain",
	            iconCls: 'admin-node-computers',
	            allowDrag: false,
	            allowDrop: true,
	            id: "serverinfo",
	            children: [],
	            leaf: null,
	            expanded: true,
	            dataPanelType: "serverinfo",
	            viewRight: 'serverinfo'
	        }];
	        
	        // TODO find a generic hooking mechanism
	        if (Tine.Tinebase.appMgr.get('ActiveSync') && Tine.Tinebase.common.hasRight('manage_devices', 'ActiveSync')) {
	            tree.push({
	                text: translation.gettext('ActiveSync Devices'),
	                cls: "treemain",
	                iconCls: 'activesync-device-standard',
	                allowDrag: false,
	                allowDrop: true,
	                id: "devices",
	                children: [],
	                leaf: null,
	                expanded: true,
	                dataPanelType: "devices"
	            });
	        }
	        
	        return tree;
	    };
	
	    /**
	     * creates the admin menu tree
	     *
	     */
	    var getAdminTree = function () {
	        
	        var translation = new Locale.Gettext();
	        translation.textdomain('Admin');
	        
	        var treeLoader = new Ext.tree.TreeLoader({
	            dataUrl: 'index.php',
	            baseParams: {
	                jsonKey: Tine.Tinebase.registry.get('jsonKey'),
	                method: 'Admin.getSubTree',
	                location: 'mainTree'
	            }
	        });
	        treeLoader.on("beforeload", function (loader, node) {
	            loader.baseParams.node = node.id;
	        }, this);
	    
	        var treePanel = new Ext.tree.TreePanel({
	            title: translation.gettext('Admin'),
	            id: 'admin-tree',
	            iconCls: 'AdminIconCls',
	            loader: treeLoader,
	            rootVisible: false,
	            border: false,
	            autoScroll: true
	        });
	        
	        // set the root node
	        var treeRoot = new Ext.tree.TreeNode({
	            text: 'root',
	            draggable: false,
	            allowDrop: false,
	            id: 'root'
	        });
	        treePanel.setRootNode(treeRoot);
	        
	        var initialTree = getInitialTree(translation);
	        
	        for (var i = 0; i < initialTree.length; i += 1) {
	            // check view right
	            if (initialTree[i].viewRight && !Tine.Tinebase.common.hasRight('view_' + initialTree[i].viewRight, 'Admin')) {
	                initialTree[i].hidden = true;
	            }
	            var node = new Ext.tree.AsyncTreeNode(initialTree[i]);
	            treeRoot.appendChild(node);
	        }
	        
	        treePanel.on('click', function (node, event) {
	            
	            if (node === null|| node.disabled) {
	                return false;
	            }
	
	            Ext.ux.layout.CardLayout.helper.setActiveCardPanelItem(
	                Tine.Tinebase.appMgr.get('Admin').getMainScreen().moduleCardPanel,
	                new Ext.Panel({html:'', border: false, frame: false}),
	                true
	            );
	
	            switch (node.attributes.dataPanelType) {
	            case 'accesslog':
	                Tine.Admin.accessLog.show();
	                break;
	            case 'accounts':
	                Tine.Admin.user.show();
	                break;
	            case 'groups':
	                Tine.Admin.Groups.Main.show();
	                break;
	            case 'computers':
	                Tine.Admin.sambaMachine.show();
	                break;
	            case 'applications':
	                Tine.Admin.Applications.Main.show();
	                break;
	            case 'sharedtags':
	                Tine.Admin.Tags.Main.show();
	                break;
	            case 'roles':
	                Tine.Admin.Roles.Main.show();
	                break;
	            case 'containers':
	                Tine.Admin.container.show();
	                break;
	           case 'customfields':
	                Tine.Admin.customfield.show();
	                break;
	           case 'serverinfo':
	               Tine.Admin.getServerInfo(function(response) {
	                   Tine.log.debug('Tine.Admin.getServerInfo()');
	                   
	                   if (! this.infoPanel) {
	                       this.infoPanel = new Ext.Panel({
	                           canonicalName: 'ServerInfo',
	                           html: response.html,
	                           autoScroll: true
	                       });
	                   } else {
	                       this.infoPanel.update(response.html);
	                   }
	                   if (! this.infoPanelToolbar) {
	                       // TODO add correct Tine 2.0 Toolbar layout with border
	                       this.infoPanelToolbar = new Ext.Toolbar({items: [{
	                           text: translation.gettext('Refresh'),
	                           handler: function() {
	                               node.fireEvent('click', node);
	                           },
	                           iconCls: 'action_login',
	                           scale: 'medium',
	                           rowspan: 2,
	                           iconAlign: 'top'
	                       }]});
	                   }
	                   Tine.Tinebase.MainScreen.setActiveContentPanel(this.infoPanel, true);
	                   Tine.Tinebase.MainScreen.setActiveToolbar(this.infoPanelToolbar, true);
	               }, this);
	               break;
	           // TODO find a generic hooking mechanism
	            case 'devices':
	                Tine.ActiveSync.syncdevices.show();
	                break;
	            }
	        }, this);
	
	        treePanel.on('beforeexpand', function (panel) {
	            if (panel.getSelectionModel().getSelectedNode() === null) {
	                panel.expandPath('/root');
	                // don't open 'applications' if user has no right to manage apps
	                if (Tine.Tinebase.common.hasRight('manage', 'Admin', 'accounts')) {
	                    panel.selectPath('/root/accounts');
	                } else {
	                    treeRoot.eachChild(function (node) {
	                        if (Tine.Tinebase.common.hasRight('manage', 'Admin', node.attributes.viewRight)) {
	                            panel.selectPath('/root/' + node.id);
	                            return;
	                        }
	                    }, this);
	                }
	            }
	            panel.fireEvent('click', panel.getSelectionModel().getSelectedNode());
	        }, this);
	
	        treePanel.on('contextmenu', function (node, event) {
	            event.stopEvent();
	        });
	
	        return treePanel;
	    };
	    
	    // public functions and variables
	    return {
	        getPanel: getAdminTree
	    };
	    
	}();


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Admin
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	
	Ext.namespace('Tine.Admin');
	
	/**
	 * admin settings panel
	 * 
	 * @namespace   Tine.Admin
	 * @class       Tine.Admin.AdminPanel
	 * @extends     Tine.widgets.dialog.AdminPanel
	 * 
	 * <p>Admin Admin Panel</p>
	 * <p><pre>
	 * </pre></p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010 Metaways Infosystems GmbH (http://www.metaways.de)
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Admin.AdminPanel
	 */
	Tine.Admin.AdminPanel = Ext.extend(Tine.widgets.dialog.AdminPanel, {
	    /**
	     * @private
	     */
	    appName: 'Admin',
	
	    /**
	     * get config items
	     *
	     * @return {Array}
	     */
	    getConfigItems: function() {
	        return [[{
	            xtype: 'tinerecordpickercombobox',
	            fieldLabel: this.app.i18n._('Default Addressbook for new contacts and groups'),
	            name: 'defaultInternalAddressbook',
	            blurOnSelect: true,
	            recordClass: Tine.Tinebase.Model.Container,
	            recordProxy: Tine.Admin.sharedAddressbookBackend
	        }]];
	    }
	});
	
	/**
	 * admin panel on update function
	 *
	 * TODO         update registry without reloading the mainscreen
	 */
	Tine.Admin.AdminPanel.onUpdate = function() {
	    // reload mainscreen to make sure registry gets updated
	    Tine.Tinebase.common.reload();
	}
	
	/**
	 * Admin admin settings popup
	 * 
	 * @param   {Object} config
	 * @return  {Ext.ux.Window}
	 */
	Tine.Admin.AdminPanel.openWindow = function (config) {
	    var window = Tine.WindowFactory.getWindow({
	        width: 600,
	        height: 400,
	        name: Tine.Admin.AdminPanel.prototype.windowNamePrefix + Ext.id(),
	        contentPanelConstructor: 'Tine.Admin.AdminPanel',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};


/***/ },

/***/ 218:
/***/ 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) 2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	
	Ext.ns('Tine.Admin');
	
	/**
	 * @namespace   Tine.widgets.tags
	 * @class       Tine.Admin.ApplicationFilter
	 * @extends     Tine.widgets.grid.FilterModel
	 */
	Tine.Admin.ApplicationFilter = Ext.extend(Tine.widgets.grid.FilterModel, {
	    /**
	     * @cfg {Tine.Tinebase.Application} app
	     */
	    app: null,
	    
	    field: 'application_id',
	    defaultOperator: 'equals',
	    
	    /**
	     * @private
	     */
	    initComponent: function() {
	        Tine.Admin.ApplicationFilter.superclass.initComponent.call(this);
	        
	        this.operators = ['equals', 'not'];
	        this.label = this.app.i18n._('Application');
	    },
	    
	    /**
	     * value renderer
	     * 
	     * @param {Ext.data.Record} filter line
	     * @param {Ext.Element} element to render to 
	     */
	    valueRenderer: function(filter, el) {
	        this.appStore = new Ext.data.JsonStore({
	            root: 'results',
	            totalProperty: 'totalcount',
	            fields: Tine.Admin.Model.Application
	        });
	        this.appStore.loadData({
	            results:    Tine.Tinebase.registry.get('userApplications'),
	            totalcount: Tine.Tinebase.registry.get('userApplications').length
	        });
	        
	        var value = new Ext.form.ComboBox({
	            app: this.app,
	            name: 'application_id',
	            store: this.appStore,
	            displayField: 'name',
	            valueField: 'id',
	            filter: filter,
	            width: this.filterValueWidth,
	            id: 'tw-ftb-frow-valuefield-' + filter.id,
	            value: filter.data.value ? filter.data.value : this.defaultValue,
	            mode: 'local',
	            renderTo: el
	        });
	        value.on('specialkey', function(field, e){
	             if(e.getKey() == e.ENTER){
	                 this.onFiltertrigger();
	             }
	        }, this);
	        
	        return value;
	    }
	});
	Tine.widgets.grid.FilterToolbar.FILTERS['admin.application'] = Tine.Admin.ApplicationFilter;
	


/***/ },

/***/ 219:
/***/ 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) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 * TODO         refactor this
	 * TODO         translate strings (enable/disable/settings)
	 */
	 
	Ext.ns('Tine.Admin', 'Tine.Admin.Applications');
	
	/*********************************** MAIN DIALOG ********************************************/
	
	Tine.Admin.Applications.Main = {
	
	    init: function() {
	        this.translation = new Locale.Gettext();
	        this.translation.textdomain('Admin');
	
	        this._action_enable = new Ext.Action({
	            text: this.translation.gettext('Enable Application'),
	            disabled: true,
	            handler: this._enableDisableButtonHandler.createDelegate(this, ['enabled']),
	            scope: this,
	            iconCls: 'action_enable'
	        });
	
	        this._action_disable = new Ext.Action({
	            text: this.translation.gettext('Disable Application'),
	            disabled: true,
	            handler: this._enableDisableButtonHandler.createDelegate(this, ['disabled']),
	            scope: this,
	            iconCls: 'action_disable'
	        });
	
	        this._action_settings = new Ext.Action({
	            text: this.translation.gettext('Settings'),
	            disabled: true,
	            handler: this._settingsHandler,
	            scope: this,
	            iconCls: 'action_settings'
	        });
	    },
	
	    /**
	     * onclick handler for edit action
	     * 
	     * TODO     make that more generic?
	     */
	    _settingsHandler: function(_button, _event) {
	        var selModel = this.gridPanel.getSelectionModel();
	        if (selModel.getCount() > 0) {
	            var selectedRows = selModel.getSelections();
	            var appName = selectedRows[0].data.name;
	            if (Tine[appName]) {
	                this._openSettingsWindow(appName);
	            }
	        } else {
	            _button.setDisabled(true);
	        }
	    },
	    
	    _openSettingsWindow: function(appName) {
	        Tine[appName].AdminPanel.openWindow({
	            record: (Tine[appName].Model.Settings) ? new Tine[appName].Model.Settings(appName) : null,
	            title: String.format(this.translation.gettext('{0} Settings'), this.translateAppTitle(appName)),
	            listeners: {
	                scope: this,
	                'update': (Tine[appName].AdminPanel.onUpdate) ? Tine[appName].AdminPanel.onUpdate : Ext.emptyFn
	            }
	        });
	    },
	
	    _enableDisableButtonHandler: function(state) {
	        var applicationIds = new Array();
	        var selectedRows = this.gridPanel.getSelectionModel().getSelections();
	        for (var i = 0; i < selectedRows.length; ++i) {
	            applicationIds.push(selectedRows[i].id);
	        }
	        
	        Ext.Ajax.request({
	            url : 'index.php',
	            method : 'post',
	            params : {
	                method : 'Admin.setApplicationState',
	                applicationIds : applicationIds,
	                state: state
	            },
	            callback : function(_options, _success, _response) {
	                if(_success === true) {
	                    var result = Ext.util.JSON.decode(_response.responseText);
	                    if(result.success === true) {
	                        // reload mainscreen because apps have to be loaded / unloaded
	                        Tine.Tinebase.common.reload();
	                    }
	                }
	            }
	        });
	    },
	    
	    _createApplicationaDataStore: function() {
	        /**
	         * the datastore for lists
	         */
	        var ds_applications = new Ext.data.JsonStore({
	            url: 'index.php',
	            baseParams: {
	                method: 'Admin.getApplications'
	            },
	            root: 'results',
	            totalProperty: 'totalcount',
	            id: 'id',
	            fields: Tine.Admin.Model.Application,
	            // turn on remote sorting
	            remoteSort: true
	        });
	        
	        ds_applications.setDefaultSort('name', 'asc');
	
	        ds_applications.on('beforeload', function(_dataSource, _options) {
	            _options = _options || {};
	            _options.params = _options.params || {};
	            _options.params.filter = Ext.getCmp('ApplicationsAdminQuickSearchField').getValue();
	        });
	        
	        //ds_applications.load({params:{start:0, limit:50}});
	        
	        return ds_applications;
	    },
	
	    _showApplicationsToolbar: function() {
	        // if toolbar was allready created set active toolbar and return
	        if (this.actionToolbar)
	        {
	            Tine.Tinebase.MainScreen.setActiveToolbar(this.actionToolbar, true);
	            return;
	        }
	        
	        this._action_enable.setText(this.translation.gettext('enable application'));
	        this._action_disable.setText(this.translation.gettext('disable application'));
	        this._action_settings.setText(this.translation.gettext('settings'));
	    
	        var ApplicationsAdminQuickSearchField = new Ext.ux.SearchField({
	            id: 'ApplicationsAdminQuickSearchField',
	            width:240,
	            emptyText: i18n._hidden('enter searchfilter')
	        });
	        ApplicationsAdminQuickSearchField.on('change', function() {
	            this.gridPanel.getStore().load({params:{start:0, limit:50}});
	        }, this);
	        
	        this.actionToolbar = new Ext.Toolbar({
	            canonicalName: ['Application', 'ActionToolbar'].join(Tine.Tinebase.CanonicalPath.separator),
	            split: false,
	            //height: 26,
	            items: [{
	                xtype: 'buttongroup',
	                columns: 7,
	                items: [
	                    Ext.apply(new Ext.Button(this._action_enable), {
	                    scale: 'medium',
	                    rowspan: 2,
	                    iconAlign: 'top'
	                    }), {xtype: 'tbspacer', width: 10},
	                    Ext.apply(new Ext.Button(this._action_disable), {
	                        scale: 'medium',
	                        rowspan: 2,
	                        iconAlign: 'top'
	                    }), {xtype: 'tbspacer', width: 10},
	                    {xtype: 'tbseparator'}, {xtype: 'tbspacer', width: 10},
	                    Ext.apply(new Ext.Button(this._action_settings), {
	                        scale: 'medium',
	                        rowspan: 2,
	                        iconAlign: 'top'
	                    })
	                ]
	            }, '->',
	                this.translation.gettext('Search:'), ' ',
	//                new Ext.ux.SelectBox({
	//                    listClass:'x-combo-list-small',
	//                      width:90,
	//                      value:'Starts with',
	//                      id:'search-type',
	//                      store: new Ext.data.SimpleStore({
	//                        fields: ['text'],
	//                        expandData: true,
	//                        data : ['Starts with', 'Ends with', 'Any match']
	//                      }),
	//                      displayField: 'text'
	//                }),
	                ' ',
	                ApplicationsAdminQuickSearchField
	            ]
	        });
	        
	        Tine.Tinebase.MainScreen.setActiveToolbar(this.actionToolbar, true);
	    },
	    
	    /**
	     * translate and return app title
	     * 
	     * TODO try to generalize this fn as this gets used in Tags.js + RoleEditDialog.js as well 
	     *      -> this could be moved to Tine.Admin.Application after Admin js refactoring
	     */
	    translateAppTitle: function(appName) {
	        var app = Tine.Tinebase.appMgr.get(appName);
	        return (app) ? app.getTitle() : appName;
	    },
	
	    /**
	     * render enabled field (translate)
	     */
	    _renderEnabled: function(_value, _cellObject, _record, _rowIndex, _colIndex, _dataStore) {
	        var gridValue;
	        
	        switch(_value) {
	            case 'disabled':
	                gridValue = this.translation.gettext('disabled');
	                break;
	            case 'enabled':
	              gridValue = this.translation.gettext('enabled');
	              break;
	              
	            default:
	              gridValue = String.format(this.translation.gettext('unknown status ({0})'), value);
	              break;
	        }
	        
	        return gridValue;
	    },
	
	    /**
	     * creates the address grid
	     * 
	     */
	    _showApplicationsGrid: function()
	    {
	        // if grid panel was allready created set active content panel and return
	        if (this.gridPanel) {
	            Tine.Tinebase.MainScreen.setActiveContentPanel(this.gridPanel, true);
	            return;
	        }
	        
	        var ctxMenuGrid = new Ext.menu.Menu({
	            plugins: [{
	                ptype: 'ux.itemregistry',
	                key:   'Tinebase-MainContextMenu'
	            }],
	            items: [
	                this._action_enable,
	                this._action_disable,
	                this._action_settings
	            ]
	        });
	
	        
	        var ds_applications = this._createApplicationaDataStore();
	        
	        var pagingToolbar = new Ext.PagingToolbar({ // inline paging toolbar
	            pageSize: 50,
	            store: ds_applications,
	            displayInfo: true,
	            displayMsg: this.translation.gettext('Displaying application {0} - {1} of {2}'),
	            emptyMsg: this.translation.gettext("No applications to display")
	        });
	        
	        var cm_applications = new Ext.grid.ColumnModel({
	            defaults: {
	                sortable: true,
	                resizable: true
	            },
	            columns: [
	                { header: this.translation.gettext('Order'),   id: 'order', dataIndex: 'order', width: 50},
	                { header: this.translation.gettext('Name'),    id: 'name', dataIndex: 'name', renderer: this.translateAppTitle.createDelegate(this)},
	                { header: this.translation.gettext('Status'),  id: 'status', dataIndex: 'status', width: 150, renderer: this._renderEnabled.createDelegate(this)},
	                { header: this.translation.gettext('Version'), id: 'version', dataIndex: 'version', width: 70}
	            ]
	        });
	
	        var rowSelectionModel = new Ext.grid.RowSelectionModel({multiSelect:true});
	        
	        rowSelectionModel.on('selectionchange', function(_selectionModel) {
	            var rowCount = _selectionModel.getCount();
	            var selected = _selectionModel.getSelections();
	
	            if ( Tine.Tinebase.common.hasRight('manage', 'Admin', 'apps') ) {
	                if (rowCount < 1) {
	                    this._action_enable.setDisabled(true);
	                    this._action_disable.setDisabled(true);
	                    this._action_settings.setDisabled(true);
	                } else if (rowCount > 1) {
	                    this._action_enable.setDisabled(false);
	                    this._action_disable.setDisabled(false);
	                    this._action_settings.setDisabled(true);
	                } else {
	                    this._action_enable.setDisabled(false);
	                    this._action_disable.setDisabled(false);
	                    // check if app has admin panel and is enabled
	                    if (Tine[selected[0].data.name] && Tine[selected[0].data.name].AdminPanel && selected[0].data.status == 'enabled') {
	                        this._action_settings.setDisabled(false);
	                    } else {
	                        this._action_settings.setDisabled(true);
	                    }
	                }
	                
	                // don't allow to disable Admin, Tinebase or Addressbook as we can't deal with this yet
	                for (var i=0; i<selected.length; i++) {
	                    if (typeof selected[i].get == 'function' && selected[i].get('name').toString().match(/Tinebase|Admin|Addressbook/)) {
	                        this._action_disable.setDisabled(true);
	                        break;
	                    }
	                }
	            }
	        }, this);
	                
	        this.gridPanel = new Ext.grid.GridPanel({
	            canonicalName: ['Application', 'Grid'].join(Tine.Tinebase.CanonicalPath.separator),
	            store: ds_applications,
	            cm: cm_applications,
	            tbar: pagingToolbar,     
	            autoSizeColumns: false,
	            selModel: rowSelectionModel,
	            enableColLock:false,
	            autoExpandColumn: 'name',
	            border: false,
	            viewConfig: {
	                /**
	                 * Return CSS class to apply to rows depending upon flags
	                 * - checks Flagged, Deleted and Seen
	                 * 
	                 * @param {Object} record
	                 * @param {Integer} index
	                 * @return {String}
	                 */
	                getRowClass: function(record, index) {
	                    var className = '';
	                    switch(record.get('status')) {
	                        case 'disabled':
	                            className = 'grid_row_disabled';
	                            break;
	                        case 'enabled':
	                            className = 'grid_row_enabled';
	                            break;
	                    }
	                    return className;
	                }
	            }
	        });
	        
	        Tine.Tinebase.MainScreen.setActiveContentPanel(this.gridPanel, true);
	        
	        this.gridPanel.on('rowcontextmenu', function(_grid, _rowIndex, _eventObject) {
	            _eventObject.stopEvent();
	            if(!_grid.getSelectionModel().isSelected(_rowIndex)) {
	                _grid.getSelectionModel().selectRow(_rowIndex);
	
	                if ( Tine.Tinebase.common.hasRight('manage', 'Admin', 'apps') ) {
	                    this._action_enable.setDisabled(false);
	                    this._action_disable.setDisabled(false);
	                }
	                
	                // don't allow to disable Admin, Tinebase or Addressbook as we can't deal with this yet
	                if(_grid.getSelectionModel().getSelected().get('name').toString().match(/Tinebase|Admin|Addressbook/)) {
	                    this._action_enable.setDisabled(true);
	                    this._action_disable.setDisabled(true);
	                }
	            }
	            ctxMenuGrid.showAt(_eventObject.getXY());
	        }, this);
	        
	        this.gridPanel.on('rowdblclick', function(grid, index, e) {
	            var record = grid.getStore().getAt(index);
	            if (record.data.status == 'enabled' && Tine[record.data.name] && Tine[record.data.name].AdminPanel) {
	                this._openSettingsWindow(record.data.name);
	            }
	        }, this);
	    },
	
	    show: function()
	    {
	        this.init();
	        this._showApplicationsToolbar();
	        this._showApplicationsGrid();
	
	        this.loadData();
	    },
	
	    loadData: function()
	    {
	        var dataStore = this.gridPanel.getStore();
	        dataStore.load({ params: { start:0, limit:50 } });
	    },
	
	    reload: function () {
	        if (this.gridPanel) {
	            this.gridPanel.getStore().reload.defer(200, this.gridPanel.getStore());
	        }
	    }
	};


/***/ },

/***/ 220:
/***/ 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) 2007-2012 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 * TODO         refactor this (use more methods from Tine.widgets.dialog.EditRecord)
	 */
	
	/*global Ext, Tine, Locale*/
	
	Ext.ns('Tine.Admin.Groups');
	
	/**
	 * @namespace   Tine.Admin.Groups
	 * @class       Tine.Admin.Groups.EditDialog
	 * @extends     Tine.widgets.dialog.EditRecord
	 */
	Tine.Admin.Groups.EditDialog = Ext.extend(Tine.widgets.dialog.EditRecord, {
	    /**
	     * var group
	     */
	    group: null,
	
	    windowNamePrefix: 'groupEditWindow_',
	    
	    id: 'groupDialog',
	    layout: 'fit',
	    border: false,
	    labelWidth: 120,
	    labelAlign: 'top',
	    
	    handlerApplyChanges: function(button, event, closeWindow) {
	        var form = this.getForm();
	        
	        if (form.isValid()) {
	            Ext.MessageBox.wait(this.translation.gettext('Please wait'), this.translation.gettext('Updating Memberships'));
	            
	            // get group members
	            var groupMembers = [];
	            this.membersStore.each(function (record) {
	                groupMembers.push(record.id);
	            });
	            
	            // update record with form data               
	            form.updateRecord(this.group);
	
	            /*********** save group members & form ************/
	            
	            Ext.Ajax.request({
	                params: {
	                    method: 'Admin.saveGroup', 
	                    groupData: this.group.data,
	                    groupMembers: groupMembers
	                },
	                success: function (response) {
	                    /*
	                    if(window.opener.Tine.Admin.Groups) {
	                        window.opener.Tine.Admin.Groups.Main.reload();
	                    }
	                    */
	                    this.fireEvent('update', Ext.util.JSON.encode(this.group.data));
	                    if (closeWindow === true) {
	                        //window.close();
	                        this.window.close();
	                    } else {
	                        this.onRecordLoad(response);
	                    }
	                    Ext.MessageBox.hide();
	                },
	                failure: function (result, request) {
	                    Ext.MessageBox.alert(this.translation.gettext('Failed'), this.translation.gettext('Could not save group.'));
	                },
	                scope: this 
	            });
	        } else {
	            Ext.MessageBox.alert(this.translation.gettext('Errors'), this.translation.gettext('Please fix the errors noted.'));
	        }
	    },
	    
	    /**
	     * function updateRecord
	     */
	    updateRecord: function (groupData) {
	        // if groupData is empty (=array), set to empty object because array won't work!
	        if (groupData.length === 0) {
	            groupData = {};
	        }
	        this.group = new Tine.Admin.Model.Group(groupData, groupData.id ? groupData.id : 0);
	        
	        // tweak, as group members are not in standard form cycle yet
	        this.membersStore.loadData(this.group.get('groupMembers'));
	    },
	
	    /**
	     * function updateToolbarButtons
	     * 
	     */
	    updateToolbarButtons: function (rights) {
	    },
	    
	    /**
	     * function getFormContents
	     * 
	     */
	    getFormContents: function () {
	        var editGroupDialog = {
	            layout: 'border',
	            border: false,
	            width: 600,
	            height: 500,
	            items: [{
	                region: 'north',
	                xtype: 'columnform',
	                border: false,
	                autoHeight: true,
	                items: [[{
	                    columnWidth: 1,
	                    xtype: 'textfield',
	                    fieldLabel: this.translation.gettext('Group Name'), 
	                    name: 'name',
	                    anchor: '100%',
	                    allowBlank: false
	                }], [{
	                    columnWidth: 1,
	                    xtype: 'textarea',
	                    name: 'description',
	                    fieldLabel: this.translation.gettext('Description'),
	                    grow: false,
	                    preventScrollbars: false,
	                    anchor: '100%',
	                    height: 60
	                }], [{
	                    columnWidth: 0.5,
	                    xtype: 'combo',
	                    fieldLabel: this.translation.gettext('Visibility'),
	                    name: 'visibility',
	                    mode: 'local',
	                    triggerAction: 'all',
	                    allowBlank: false,
	                    editable: false,
	                    store: [['displayed', this.translation.gettext('Display in addressbook')], ['hidden', this.translation.gettext('Hide from addressbook')]],
	                    listeners: {
	                        scope: this,
	                        select: function (combo, record) {
	                            // disable container_id combo if hidden
	                            this.getForm().findField('container_id').setDisabled(record.data.field1 === 'hidden');
	                            if(record.data.field1 === 'hidden') {
	                                this.getForm().findField('container_id').clearInvalid();
	                            } else {
	                                this.getForm().findField('container_id').isValid();
	                            }
	                        }
	                    }
	                }, {
	                    columnWidth: 0.5,
	                    xtype: 'tinerecordpickercombobox',
	                    fieldLabel: this.translation.gettext('Saved in Addressbook'),
	                    name: 'container_id',
	                    blurOnSelect: true,
	                    allowBlank: false,
	                    listWidth: 250,
	                    recordClass: Tine.Tinebase.Model.Container,
	                    recordProxy: Tine.Admin.sharedAddressbookBackend,
	                    disabled: this.group.get('visibility') === 'hidden'
	                }]]
	            }, {
	                xtype: 'tinerecordpickergrid',
	                title: this.translation.gettext('Group Members'),
	                store: this.membersStore,
	                region: 'center',
	                anchor: '100% 100%',
	                showHidden: true
	            }]
	        };
	        
	        return editGroupDialog;
	    },
	    
	    initComponent: function () {
	        this.translation = new Locale.Gettext();
	        this.translation.textdomain('Admin');
	        
	        this.group = this.group ? this.group : new Tine.Admin.Model.Group({}, 0);
	        
	        if (this.group.id !== 0) {
	            Ext.Ajax.request({
	                scope: this,
	                success: this.onRecordLoad,
	                params: {
	                    method: 'Admin.getGroup',
	                    groupId: this.group.id
	                }
	            });
	        } else {
	            this.group = new Tine.Admin.Model.Group(Tine.Admin.Model.Group.getDefaultData(), 0);
	        }
	                
	        this.membersStore = new Ext.data.JsonStore({
	            root: 'results',
	            totalProperty: 'totalcount',
	            id: 'id',
	            fields: Tine.Tinebase.Model.Account
	        });
	        
	        this.items = this.getFormContents();
	        Tine.Admin.Groups.EditDialog.superclass.initComponent.call(this);
	    },
	    
	    onRender: function (ct, position) {
	        Tine.widgets.dialog.EditDialog.superclass.onRender.call(this, ct, position);
	        
	        // generalized keybord map for edit dlgs
	        var map = new Ext.KeyMap(this.el, [{
	            key: [10, 13], // ctrl + return
	            ctrl: true,
	            fn: this.handlerApplyChanges.createDelegate(this, [true], true),
	            scope: this
	        }]);
	
	        this.loadMask = new Ext.LoadMask(ct, {msg: String.format(i18n._('Transferring {0}...'), this.translation.gettext('Group'))});
	        
	        if (this.group.id !== 0) {
	            this.loadMask.show();
	        } else {
	            this.window.setTitle(this.translation.gettext('Add new group'));
	            this.getForm().loadRecord(this.group);
	        }
	    },
	    
	    onRecordLoad: function (response) {
	        this.getForm().findField('name').focus(false, 350);
	        var recordData = Ext.util.JSON.decode(response.responseText);
	        this.updateRecord(recordData);
	
	        if (! this.group.id) {
	            this.window.setTitle(this.translation.gettext('Add new group'));
	        } else {
	            this.window.setTitle(String.format(this.translation.gettext('Edit Group "{0}"'), this.group.get('name')));
	        }
	
	        this.getForm().loadRecord(this.group);
	        this.updateToolbarButtons();
	        
	        this.loadMask.hide();
	    }
	});
	
	
	/**
	 * Groups Edit Popup
	 */
	Tine.Admin.Groups.EditDialog.openWindow = function (config) {
	    config.group = config.group ? config.group : new Tine.Admin.Model.Group({}, 0);
	    var window = Tine.WindowFactory.getWindow({
	        width: 400,
	        height: 600,
	        name: Tine.Admin.Groups.EditDialog.prototype.windowNamePrefix + config.group.id,
	        contentPanelConstructor: 'Tine.Admin.Groups.EditDialog',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Admin
	 * @subpackage  User
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 * TODO         refactor this (don't use Ext.getCmp, extend generic grid panel, ...)
	 */
	
	/*global Ext, Tine, Locale*/
	
	Ext.ns('Tine.Admin.Groups');
	
	/*********************************** MAIN DIALOG ********************************************/
	
	Tine.Admin.Groups.Main = {
	        
	    // references to crated toolbar and grid panel
	    groupsToolbar: null,
	    gridPanel: null,
	        
	    actions: {
	        addGroup: null,
	        editGroup: null,
	        deleteGroup: null
	    },
	    
	    handlers: {
	        /**
	         * onclick handler for addBtn
	         */
	        addGroup: function (button, event) {
	            this.openEditWindow(null);
	        },
	
	        /**
	         * onclick handler for editBtn
	         */
	        editGroup: function (button, event) {
	            var selectedRows = this.gridPanel.getSelectionModel().getSelections();
	            this.openEditWindow(selectedRows[0]);
	        },
	
	        
	        /**
	         * onclick handler for deleteBtn
	         */
	        deleteGroup: function (button, event) {
	            Ext.MessageBox.confirm(this.translation.gettext('Confirm'), this.translation.gettext('Do you really want to delete the selected groups?'), function (button) {
	                if (button === 'yes') {
	                
	                    var groupIds = [],
	                        selectedRows = this.gridPanel.getSelectionModel().getSelections();
	                        
	                    for (var i = 0; i < selectedRows.length; ++i) {
	                        groupIds.push(selectedRows[i].id);
	                    }
	                    
	                    Ext.Ajax.request({
	                        url: 'index.php',
	                        params: {
	                            method: 'Admin.deleteGroups',
	                            groupIds: groupIds
	                        },
	                        scope: this,
	                        text: this.translation.gettext('Deleting group(s)...'),
	                        success: function (result, request) {
	                            this.gridPanel.getStore().reload();
	                        },
	                        failure: function (result, request) {
	                            Ext.MessageBox.alert(this.translation.gettext('Failed'), this.translation.gettext('Some error occurred while trying to delete the group.'));
	                        }
	                    });
	                }
	            }, this);
	        }    
	    },
	    
	    /**
	     * open edit window
	     * 
	     * @param {} record
	     */
	    openEditWindow: function (record) {
	        var popupWindow = Tine.Admin.Groups.EditDialog.openWindow({
	            group: record,
	            listeners: {
	                scope: this,
	                'update': function (record) {
	                    this.reload();
	                }
	            }                
	        });
	    },
	    
	    initComponent: function () {
	        this.translation = new Locale.Gettext();
	        this.translation.textdomain('Admin');
	        
	        this.pageSize = Tine.Tinebase.registry.get('preferences').get('pageSize')
	            ? parseInt(Tine.Tinebase.registry.get('preferences').get('pageSize'), 10)
	            : 50;
	        
	        this.actions.addGroup = new Ext.Action({
	            text: this.translation.gettext('Add Group'),
	            disabled: true,
	            handler: this.handlers.addGroup,
	            iconCls: 'action_addGroup',
	            scope: this
	        });
	        
	        this.actions.editGroup = new Ext.Action({
	            text: this.translation.gettext('Edit Group'),
	            disabled: true,
	            handler: this.handlers.editGroup,
	            iconCls: 'action_edit',
	            scope: this
	        });
	        
	        this.actions.deleteGroup = new Ext.Action({
	            text: this.translation.gettext('Delete Group'),
	            disabled: true,
	            handler: this.handlers.deleteGroup,
	            iconCls: 'action_delete',
	            scope: this
	        });
	
	    },
	    
	    displayGroupsToolbar: function () {
	        var app = Tine.Tinebase.appMgr.get('Admin');
	
	        // if toolbar was allready created set active toolbar and return
	        if (this.groupsToolbar) {
	            app.getMainScreen().setActiveToolbar(this.groupsToolbar, true);
	            return;
	        }
	        
	        var GroupsAdminQuickSearchField = new Ext.ux.SearchField({
	            id: 'GroupsAdminQuickSearchField',
	            width: 240,
	            emptyText: i18n._hidden('enter searchfilter')
	        });
	        GroupsAdminQuickSearchField.on('change', function () {
	            this.gridPanel.getStore().load({
	                params: {
	                    start: 0,
	                    limit: this.pageSize
	                }
	            });
	        }, this);
	        
	        this.groupsToolbar = new Ext.Toolbar({
	            canonicalName: ['Group', 'ActionToolbar'].join(Tine.Tinebase.CanonicalPath.separator),
	            split: false,
	            items: [{
	                xtype: 'buttongroup',
	                columns: 5,
	                items: [
	                    Ext.apply(new Ext.Button(this.actions.addGroup), {
	                        scale: 'medium',
	                        rowspan: 2,
	                        iconAlign: 'top'
	                    }),
	                    Ext.apply(new Ext.Button(this.actions.editGroup), {
	                        scale: 'medium',
	                        rowspan: 2,
	                        iconAlign: 'top'
	                    }),
	                    Ext.apply(new Ext.Button(this.actions.deleteGroup), {
	                        scale: 'medium',
	                        rowspan: 2,
	                        iconAlign: 'top'
	                    })
	                ]
	            }, '->', 
	                this.translation.gettext('Search:'), 
	                ' ',
	                GroupsAdminQuickSearchField
	            ]
	        });
	
	        app.getMainScreen().setActiveToolbar(this.groupsToolbar, true);
	    },
	
	    displayGroupsGrid: function () {
	        var app = Tine.Tinebase.appMgr.get('Admin');
	
	        // if grid panel was allready created set active content panel and return
	        if (this.gridPanel)    {
	            app.getMainScreen().setActiveContentPanel(this.gridPanel, true);
	            return;
	        }
	        
	        if (Tine.Tinebase.common.hasRight('manage', 'Admin', 'accounts')) {
	            this.actions.addGroup.setDisabled(false);
	        }
	
	        // the datastore
	        var dataStore = new Ext.data.JsonStore({
	            baseParams: {
	                method: 'Admin.getGroups'
	            },
	            root: 'results',
	            totalProperty: 'totalcount',
	            id: 'id',
	            fields: Tine.Admin.Model.Group,
	            // turn on remote sorting
	            remoteSort: true
	        });
	        
	        dataStore.setDefaultSort('id', 'asc');
	
	        dataStore.on('beforeload', function (dataStore, options) {
	            options = options || {};
	            options.params = options.params || {};
	            options.params.filter = Ext.getCmp('GroupsAdminQuickSearchField').getValue();
	        }, this);
	        
	        // the paging toolbar
	        var pagingToolbar = new Ext.PagingToolbar({
	            pageSize: this.pageSize,
	            store: dataStore,
	            displayInfo: true,
	            displayMsg: this.translation.gettext('Displaying groups {0} - {1} of {2}'),
	            emptyMsg: this.translation.gettext("No groups to display")
	        });
	        
	        // the columnmodel
	        var columnModel = new Ext.grid.ColumnModel({
	            defaults: {
	                sortable: true,
	                resizable: true
	            },
	            columns: [
	                { id: 'id', header: this.translation.gettext('ID'), dataIndex: 'id', width: 50, hidden: true },
	                { id: 'name', header: this.translation.gettext('Name'), dataIndex: 'name', width: 50 },
	                { id: 'description', header: this.translation.gettext('Description'), dataIndex: 'description' }
	            ]
	        });
	        
	        // the rowselection model
	        var rowSelectionModel = new Ext.grid.RowSelectionModel({multiSelect: true});
	
	        rowSelectionModel.on('selectionchange', function (selectionModel) {
	            var rowCount = selectionModel.getCount();
	
	            if (Tine.Tinebase.common.hasRight('manage', 'Admin', 'accounts')) {
	                if (rowCount < 1) {
	                    // no row selected
	                    this.actions.deleteGroup.setDisabled(true);
	                    this.actions.editGroup.setDisabled(true);
	                } else if (rowCount > 1) {
	                    // more than one row selected
	                    this.actions.deleteGroup.setDisabled(false);
	                    this.actions.editGroup.setDisabled(true);
	                } else {
	                    // only one row selected
	                    this.actions.deleteGroup.setDisabled(false);
	                    this.actions.editGroup.setDisabled(false);
	                }
	            }
	        }, this);
	        
	        // the gridpanel
	        this.gridPanel = new Ext.grid.GridPanel({
	            canonicalName: ['Group', 'Grid'].join(Tine.Tinebase.CanonicalPath.separator),
	            store: dataStore,
	            cm: columnModel,
	            tbar: pagingToolbar,     
	            autoSizeColumns: false,
	            selModel: rowSelectionModel,
	            enableColLock: false,
	            autoExpandColumn: 'n_family',
	            border: false,
	            view: new Ext.grid.GridView({
	                autoFill: true,
	                forceFit: true,
	                ignoreAdd: true,
	                emptyText: this.translation.gettext('No groups to display')
	            }),
	            enableHdMenu: false,
	            plugins: [new Ext.ux.grid.GridViewMenuPlugin()]
	        });
	
	        this.gridPanel.on('rowcontextmenu', function (grid, rowIndex, eventObject) {
	            eventObject.stopEvent();
	            if (! grid.getSelectionModel().isSelected(rowIndex)) {
	                grid.getSelectionModel().selectRow(rowIndex);
	            }
	            
	            if (! this.contextMenu) {
	                this.contextMenu = new Ext.menu.Menu({
	                    id: 'ctxMenuGroups',
	                    plugins: [{
	                        ptype: 'ux.itemregistry',
	                        key:   'Tinebase-MainContextMenu'
	                    }],
	                    items: [
	                        this.actions.editGroup,
	                        this.actions.deleteGroup,
	                        '-',
	                        this.actions.addGroup 
	                    ]
	                });
	            }
	            this.contextMenu.showAt(eventObject.getXY());
	        }, this);
	        
	        this.gridPanel.on('rowdblclick', function (gridPar, rowIndexPar, ePar) {
	            if (Tine.Tinebase.common.hasRight('manage', 'Admin', 'accounts')) {
	                var record = gridPar.getStore().getAt(rowIndexPar);
	                this.openEditWindow(record);
	            }
	        }, this);
	
	        // add the grid to the layout
	        app.getMainScreen().setActiveContentPanel(this.gridPanel, true);
	    },
	    
	    /**
	     * update datastore with node values and load datastore
	     */
	    loadData: function () {
	        var dataStore = this.gridPanel.getStore();
	        dataStore.load({ params: { start: 0, limit: this.pageSize } });
	    },
	
	    show: function () {
	        if (this.groupsToolbar === null || this.gridPanel === null) {
	            this.initComponent();
	        }
	
	        this.displayGroupsToolbar();
	        this.displayGroupsGrid();
	
	        this.loadData();
	    },
	    
	    reload: function () {
	        if (this.gridPanel) {
	            this.gridPanel.getStore().reload.defer(200, this.gridPanel.getStore());
	        }
	    }
	};


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Admin
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2009-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.ns('Tine.Admin.Model');
	
	/**
	 * @namespace   Tine.Admin.Model
	 * @class       Tine.Admin.Model.TagRight
	 * @extends     Ext.data.Record
	 * 
	 * TagRight Record Definition
	 */ 
	Tine.Admin.Model.TagRight = Ext.data.Record.create([
	    {name: 'account_id'},
	    {name: 'account_type'},
	    {name: 'account_name'},
	    {name: 'account_data'},
	    {name: 'view_right', type: 'boolean'},
	    {name: 'use_right',  type: 'boolean'}
	]);
	
	/**
	 * @namespace   Tine.Admin.Model
	 * @class       Tine.Admin.Model.AccessLog
	 * @extends     Tine.Tinebase.data.Record
	 * 
	 * AccessLog Record Definition
	 */ 
	Tine.Admin.Model.AccessLog = Tine.Tinebase.data.Record.create([
	    {name: 'sessionid'},
	    {name: 'login_name'},
	    {name: 'ip'},
	    {name: 'li', type: 'date', dateFormat: Date.patterns.ISO8601Long},
	    {name: 'lo', type: 'date', dateFormat: Date.patterns.ISO8601Long},
	    {name: 'id'},
	    {name: 'account_id'},
	    {name: 'result'},
	    {name: 'clienttype'}
	], {
	    appName: 'Admin',
	    modelName: 'AccessLog',
	    idProperty: 'id',
	    titleProperty: 'login_name',
	    // ngettext('Access Log', 'Access Logs', n);
	    recordName: 'AccessLog',
	    recordsName: 'AccessLogs'
	});
	
	/**
	 * AccessLog data proxy
	 * 
	 * @type Tine.Tinebase.data.RecordProxy
	 */ 
	Tine.Admin.accessLogBackend = new Tine.Tinebase.data.RecordProxy({
	    appName: 'Admin',
	    modelName: 'AccessLog',
	    recordClass: Tine.Admin.Model.AccessLog,
	    idProperty: 'id'
	});
	
	/**
	 * @namespace Tine.Admin.Model
	 * @class     Tine.Admin.Model.Group
	 * @extends   Tine.Admin.data.Record
	 * 
	 * Model of a user group
	 */
	Tine.Admin.Model.Group = Tine.Tinebase.data.Record.create([
	    {name: 'id'},
	    {name: 'name'},
	    {name: 'description'},
	    {name: 'container_id'},
	    {name: 'visibility'}
	    //{name: 'groupMembers'}
	], {
	    appName: 'Admin',
	    modelName: 'Group',
	    idProperty: 'id',
	    titleProperty: 'name',
	    // ngettext('Group', 'Groups', n); gettext('Groups');
	    recordName: 'Group',
	    recordsName: 'Groups'
	});
	
	/**
	 * returns default group data
	 * 
	 * @namespace Tine.Admin.Model.Group
	 * @static
	 * @return {Object} default data
	 */
	Tine.Admin.Model.Group.getDefaultData = function () {
	    var internalAddressbook = Tine.Admin.registry.get('defaultInternalAddressbook');
	    
	    return {
	        visibility: (internalAddressbook !== null) ? 'displayed' : 'hidden',
	        container_id: internalAddressbook
	    };
	};
	
	/**
	 * @namespace Tine.Admin.Model
	 * @class     Tine.Admin.Model.Application
	 * @extends   Tine.Admin.data.Record
	 * 
	 * Model of an application
	 */
	Tine.Admin.Model.Application = Tine.Tinebase.data.Record.create([
	    {name: 'id'},
	    {name: 'name'},
	    {name: 'i18nName'},
	    {name: 'status'},
	    {name: 'order'},
	    {name: 'app_tables'},
	    {name: 'version'}
	], {
	    appName: 'Admin',
	    modelName: 'Application',
	    idProperty: 'id',
	    titleProperty: 'name',
	    // ngettext('Application', 'Applications', n); gettext('Applications');
	    recordName: 'Application',
	    recordsName: 'Applications'
	});
	
	/**
	 * @namespace Tine.Admin.Model
	 * @class     Tine.Admin.Model.Config
	 * @extends   Tine.Admin.data.Record
	 *
	 * Model of a application config settings
	 */
	Tine.Admin.Model.Config = Tine.Tinebase.data.Record.create([
	    {name: 'id'},
	    {name: 'application_id'},
	    {name: 'name'},
	    {name: 'value'},
	    {name: 'label'},
	    {name: 'description'},
	    {name: 'type'},
	    {name: 'options'},
	    {name: 'clientRegistryInclude'},
	    {name: 'setByAdminModule'},
	    {name: 'setBySetupModule'},
	    {name: 'default'},
	    {name: 'source'}
	    //{name: 'settings'}
	], {
	    appName: 'Admin',
	    modelName: 'Config',
	    idProperty: 'id',
	    titleProperty: 'name',
	    // ngettext('Config', 'Configs', n); gettext('Configs');
	    recordName: 'Config',
	    recordsName: 'Configs'
	});

/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philip Schuele <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2007-2010 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 * TODO         refactor this (don't use Ext.getCmp, etc.)
	 */
	
	/*global Ext, Tine, Locale*/
	
	Ext.ns('Tine.Admin.Roles');
	
	/**
	 * @namespace   Tine.Admin.Roles
	 * @class       Tine.Admin.Roles.EditDialog
	 * @extends     Tine.widgets.dialog.EditRecord
	 */
	Tine.Admin.Roles.EditDialog = Ext.extend(Tine.widgets.dialog.EditRecord, {
	
	    /**
	     * @cfg {Tine.Tinebase.Model.Role}
	     */
	    role: null,
	    
	    /**
	     * @property {Object} holds allRights (possible rights)
	     */
	    allRights: null,
	    
	    /**
	     * @property {Ext.tree.treePanel}
	     */
	    rightsTreePanel: null,
	    
	    windowNamePrefix: 'rolesEditWindow_',
	    
	    layout: 'fit',
	    border: false,
	    id: 'roleDialog',
	    labelWidth: 120,
	    labelAlign: 'top',
	    
	    /**
	     * check if right is set for application and get the record id
	     * @private
	     */
	    getRightId: function (applicationId, right) {
	        var id = false,
	            result = null;
	        
	        this.rightsDataStore.each(function (item) {
	            if (item.data.application_id === applicationId && item.data.right === right) {
	                result = item.id;
	                return;
	            }
	        });
	        
	        return result;
	    },  
	    
	    handlerApplyChanges: function (button, event, closeWindow) {
	        var form = this.getForm();
	        
	        if (form.isValid()) {
	            // get role members
	            var roleGrid = Ext.getCmp('roleMembersGrid');
	
	            Ext.MessageBox.wait(this.translation.gettext('Please wait'), this.translation.gettext('Updating Memberships'));
	            
	            var roleMembers = [];
	            this.membersStore.each(function (record) {
	                roleMembers.push(record.data);
	            });
	
	            // get role rights                
	            var roleRights = [],
	                rightsStore = this.rightsDataStore;
	            
	            rightsStore.each(function (record) {
	                roleRights.push(record.data);
	            });
	
	            // update form               
	            form.updateRecord(this.role);
	
	            /*********** save role members & form ************/
	            
	            Ext.Ajax.request({
	                params: {
	                    method: 'Admin.saveRole', 
	                    roleData: this.role.data,
	                    roleMembers: roleMembers,
	                    roleRights: roleRights
	                },
	                timeout: 300000, // 5 minutes
	                success: function (response) {
	                    this.fireEvent('update', Ext.util.JSON.encode(this.role.data));
	                    Ext.MessageBox.hide();
	                    if (closeWindow === true) {
	                        this.window.close();
	                    } else {
	                        this.onRecordLoad(response);
	                    }
	                },
	                failure: function (result, request) {
	                    Ext.MessageBox.alert(this.translation.gettext('Failed'), this.translation.gettext('Could not save role.'));
	                },
	                scope: this 
	            });
	                
	            
	        } else {
	            Ext.MessageBox.alert(this.translation.gettext('Errors'), this.translation.gettext('Please fix the errors noted.'));
	        }
	    },
	    
	    handlerDelete: function (button, event) {
	        var roleIds = [this.role.id];
	            
	        Ext.Ajax.request({
	            url: 'index.php',
	            params: {
	                method: 'Admin.deleteRoles', 
	                roleIds: roleIds
	            },
	            text: this.translation.gettext('Deleting role...'),
	            success: function (result, request) {
	                if (window.opener.Tine.Admin.Roles) {
	                    window.opener.Tine.Admin.Roles.Main.reload();
	                }
	                window.close();
	            },
	            failure: function (result, request) {
	                Ext.MessageBox.alert(this.translation.gettext('Failed'), this.translation.gettext('Some error occurred while trying to delete the role.'));
	            } 
	        });
	    },
	
	    updateRecord: function (roleData) {
	        // if roleData is empty (=array), set to empty object because array won't work!
	        if (roleData.length === 0) {
	            roleData = {};
	        }
	        this.role = new Tine.Tinebase.Model.Role(roleData, roleData.id ? roleData.id : 0);
	        
	        this.membersStore.loadData(this.role.get('roleMembers'));
	        this.rightsDataStore.loadData(this.role.get('roleRights'));
	        this.allRights = this.role.get('allRights');
	        this.createRightsTreeNodes();
	    },
	
	    /**
	     * creates the rights tree
	     *
	     */
	    initRightsTree: function () {
	        this.rightsTreePanel = new Ext.tree.TreePanel({
	            title: this.translation.gettext('Rights'),
	            autoScroll: true,
	            rootVisible: false,
	            border: false
	        });
	        
	        // sort nodes by text property
	        this.treeSorter = new Ext.tree.TreeSorter(this.rightsTreePanel, {
	            folderSort: true,
	            dir: "asc"
	        });
	        
	        // set the root node
	        var treeRoot = new Ext.tree.TreeNode({
	            text: 'root',
	            draggable: false,
	            allowDrop: false,
	            id: 'root'
	        });
	
	        this.rightsTreePanel.setRootNode(treeRoot);
	    },
	    
	    /**
	     * create nodes for rights tree (apps + app rights)
	     * 
	     * @return {Ext.tree.TreePanel}
	     */
	    createRightsTreeNodes: function () {
	        var treeRoot = this.rightsTreePanel.getRootNode();
	        
	        var toRemove = [];
	        treeRoot.eachChild(function (node) {
	            toRemove.push(node);
	        });
	        
	        var expandNode = (this.allRights.length > 5) ? false : true;
	        
	        // add nodes to tree        
	        for (var i = 0; i < this.allRights.length; i += 1) {
	            // don't duplicate tree nodes on 'apply changes'
	            var remove = toRemove[i] ? toRemove[i].remove() : null;
	            this.allRights[i].text = this.translateAppTitle(this.allRights[i].text);
	            var node = new Ext.tree.TreeNode(this.allRights[i]);
	            node.attributes.application_id = this.allRights[i].application_id;
	            node.expanded = expandNode;
	            treeRoot.appendChild(node);
	            
	            // append children          
	            if (this.allRights[i].children) {
	                for (var j = 0; j < this.allRights[i].children.length; j += 1) {
	                    var childData = this.allRights[i].children[j];
	                    childData.leaf = true;
	                    
	                    // check if right is set
	                    childData.checked = !!this.getRightId(this.allRights[i].application_id, childData.right);
	                    childData.iconCls = "x-tree-node-leaf-checkbox";
	                    var child = new Ext.tree.TreeNode(childData);
	                    child.attributes.right = childData.right;
	                    
	                    child.on('checkchange', function (node, checked) {
	                        var applicationId = node.parentNode.attributes.application_id;
	                    
	                        // put it in the storage or remove it                        
	                        if (checked) {
	                            this.rightsDataStore.add(
	                                new Ext.data.Record({
	                                    right: node.attributes.right,
	                                    application_id: applicationId
	                                })
	                            );
	                        } else {
	                            var rightId = this.getRightId(applicationId, node.attributes.right);
	                            this.rightsDataStore.remove(this.rightsDataStore.getById(rightId));
	                        }   
	                    }, this);
	                    
	                    node.appendChild(child);
	                }       
	            }
	        }     
	        
	        return this.rightsTreePanel;
	    },
	    
	    /**
	     * translate and return app title
	     * 
	     * TODO try to generalize this fn as this gets used in Tags.js + Applications.js as well 
	     *      -> this could be moved to Tine.Admin.Application after Admin js refactoring
	     */
	    translateAppTitle: function (appName) {
	        var app = Tine.Tinebase.appMgr.get(appName);
	        return (app) ? app.getTitle() : appName;
	    },
	    
	    /**
	     * returns form
	     * 
	     */
	    getFormContents: function () {
	        this.accountPickerGridPanel = new Tine.widgets.account.PickerGridPanel({
	            title: this.translation.gettext('Members'),
	            store: this.membersStore,
	            anchor: '100% 100%',
	            groupRecordClass: Tine.Admin.Model.Group,
	            selectType: 'both',
	            selectAnyone: false,
	            selectTypeDefault: 'group',
	            showHidden: true
	        });
	        
	        this.initRightsTree();
	        
	        /******* THE edit dialog ********/
	        
	        var editRoleDialog = {
	            layout: 'border',
	            border: false,
	            items: [{
	                region: 'north',
	                layout: 'form',
	                border: false,
	                autoHeight: true,
	                items: [{
	                    xtype: 'textfield',
	                    fieldLabel: this.translation.gettext('Role Name'), 
	                    name: 'name',
	                    anchor: '100%',
	                    allowBlank: false,
	                    maxLength: 128
	                }, {
	                    xtype: 'textarea',
	                    name: 'description',
	                    fieldLabel: this.translation.gettext('Description'),
	                    grow: false,
	                    preventScrollbars: false,
	                    anchor: '100%',
	                    height: 60
	                }]
	            }, {
	                xtype: 'tabpanel',
	                plain: true,
	                region: 'center',
	                activeTab: 0,
	                items: [
	                    this.accountPickerGridPanel,
	                    this.rightsTreePanel
	                ]
	            }]
	        };
	        
	        return editRoleDialog;
	    },
	    
	    initComponent: function () {
	        this.role = this.role ? this.role : new Tine.Tinebase.Model.Role({}, 0);
	        
	        this.translation = new Locale.Gettext();
	        this.translation.textdomain('Admin');
	        
	        Ext.Ajax.request({
	            scope: this,
	            success: this.onRecordLoad,
	            params: {
	                method: 'Admin.getRole',
	                roleId: this.role.id
	            }
	        });
	        
	        // init role members store
	        this.membersStore = new Ext.data.JsonStore({
	            root: 'results',
	            totalProperty: 'totalcount',
	            id: 'id',
	            fields: Tine.Tinebase.Model.Account
	        });
	        
	        // init rights store
	        this.rightsDataStore = new Ext.data.JsonStore({
	            root: 'results',
	            totalProperty: 'totalcount',
	            fields: Tine.Admin.Roles.Right
	        });
	        
	        this.items = this.getFormContents();
	        
	        Tine.Admin.Groups.EditDialog.superclass.initComponent.call(this);
	    },
	    
	    onRender: function (ct, position) {
	        Tine.widgets.dialog.EditDialog.superclass.onRender.call(this, ct, position);
	        
	        // generalized keybord map for edit dlgs
	        var map = new Ext.KeyMap(this.el, [{
	            key: [10, 13], // ctrl + return
	            ctrl: true,
	            fn: this.handlerApplyChanges.createDelegate(this, [true], true),
	            scope: this
	        }]);
	
	        this.loadMask = new Ext.LoadMask(ct, {msg: String.format(i18n._('Transferring {0}...'), this.translation.gettext('Role'))});
	        this.loadMask.show();
	    },
	    
	    onRecordLoad: function (response) {
	        this.getForm().findField('name').focus(false, 250);
	        var recordData = Ext.util.JSON.decode(response.responseText);
	        this.updateRecord(recordData);
	        
	        if (! this.role.id) {
	            this.window.setTitle(this.translation.gettext('Add New Role'));
	        } else {
	            this.window.setTitle(String.format(this.translation.gettext('Edit Role "{0}"'), this.role.get('name')));
	        }
	        
	        this.getForm().loadRecord(this.role);
	        
	        this.loadMask.hide();
	    }
	    
	});
	
	/**
	 * Roles Edit Popup
	 */
	Tine.Admin.Roles.EditDialog.openWindow = function (config) {
	    config.role = config.role ? config.role : new Tine.Tinebase.Model.Role({}, 0);
	    var window = Tine.WindowFactory.getWindow({
	        width: 400,
	        height: 600,
	        name: Tine.Admin.Roles.EditDialog.prototype.windowNamePrefix + config.role.id,
	        contentPanelConstructor: 'Tine.Admin.Roles.EditDialog',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philip Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 * TODO         refactor this (don't use Ext.getCmp, etc.)
	 */
	 
	Ext.ns('Tine.Admin.Roles');
	
	/*********************************** MAIN DIALOG ********************************************/
	
	Tine.Admin.Roles.Main = {
	    
	    // references to crated toolbar and grid panel
	    rolesToolbar: null,
	    gridPanel: null,
	    
	    actions: {
	        addRole: null,
	        editRole: null,
	        deleteRole: null
	    },
	    
	    handlers: {
	        /**
	         * onclick handler for addBtn
	         */
	        addRole: function(_button, _event) {
	            this.openEditWindow(null);
	        },
	
	        /**
	         * onclick handler for editBtn
	         */
	        editRole: function(_button, _event) {
	            var selectedRows = this.gridPanel.getSelectionModel().getSelections();
	            this.openEditWindow(selectedRows[0]);
	        },
	
	        /**
	         * onclick handler for deleteBtn
	         */
	        deleteRole: function(_button, _event) {
	            Ext.MessageBox.confirm(this.translation.gettext('Confirm'), this.translation.gettext('Do you really want to delete the selected roles?'), function(_button){
	                if (_button == 'yes') {
	                
	                    var roleIds = new Array();
	                    var selectedRows = this.gridPanel.getSelectionModel().getSelections();
	                    for (var i = 0; i < selectedRows.length; ++i) {
	                        roleIds.push(selectedRows[i].id);
	                    }
	                    
	                    roleIds = roleIds;
	                    
	                    Ext.Ajax.request({
	                        url: 'index.php',
	                        params: {
	                            method: 'Admin.deleteRoles',
	                            roleIds: roleIds
	                        },
	                        text: this.translation.gettext('Deleting role(s)...'),
	                        success: function(_result, _request){
	                            this.gridPanel.getStore().reload();
	                        },
	                        failure: function(result, request){
	                            Ext.MessageBox.alert(this.translation.gettext('Failed'), this.translation.gettext('Some error occurred while trying to delete the role.'));
	                        },
	                        scope: this
	                    });
	                }
	            }, this);
	        }    
	    },
	    
	    /**
	     * open edit window
	     * 
	     * @param {} record
	     */
	    openEditWindow: function (record) {
	        var popupWindow = Tine.Admin.Roles.EditDialog.openWindow({
	            role: record,
	            listeners: {
	                scope: this,
	                'update': function(record) {
	                    this.reload();
	                }
	            }                
	        });
	    },
	    
	    /**
	     * init roles grid
	     */
	    initComponent: function() {
	        this.translation = new Locale.Gettext();
	        this.translation.textdomain('Admin');
	        
	        this.pageSize = Tine.Tinebase.registry.get('preferences').get('pageSize')
	            ? parseInt(Tine.Tinebase.registry.get('preferences').get('pageSize'), 10)
	            : 50;
	        
	        this.actions.addRole = new Ext.Action({
	            text: this.translation.gettext('Add Role'),
	            disabled: true,
	            handler: this.handlers.addRole,
	            iconCls: 'action_permissions',
	            scope: this
	        });
	        
	        this.actions.editRole = new Ext.Action({
	            text: this.translation.gettext('Edit Role'),
	            disabled: true,
	            handler: this.handlers.editRole,
	            iconCls: 'action_edit',
	            scope: this
	        });
	        
	        this.actions.deleteRole = new Ext.Action({
	            text: this.translation.gettext('Delete Role'),
	            disabled: true,
	            handler: this.handlers.deleteRole,
	            iconCls: 'action_delete',
	            scope: this
	        });
	
	    },
	    
	    displayRolesToolbar: function() {
	        
	        // if toolbar was allready created set active toolbar and return
	        if (this.rolesToolbar)
	        {
	            Tine.Tinebase.MainScreen.setActiveToolbar(this.rolesToolbar, true);
	            return;
	        }
	        
	        var RolesQuickSearchField = new Ext.ux.SearchField({
	            id: 'RolesQuickSearchField',
	            width:240,
	            emptyText: i18n._hidden('enter searchfilter')
	        });
	        RolesQuickSearchField.on('change', function(){
	            this.gridPanel.getStore().load({
	                params: {
	                    start: 0,
	                    limit: this.pageSize
	                }
	            });
	        }, this);
	        
	        this.rolesToolbar = new Ext.Toolbar({
	            canonicalName: ['Role', 'ActionToolbar'].join(Tine.Tinebase.CanonicalPath.separator),
	            split: false,
	            items: [{
	                // create buttongroup to be consistent
	                xtype: 'buttongroup',
	                items: [
	                    Ext.apply(new Ext.Button(this.actions.addRole), {
	                        scale: 'medium',
	                        rowspan: 2,
	                        iconAlign: 'top'
	                    }),
	                    Ext.apply(new Ext.Button(this.actions.editRole), {
	                        scale: 'medium',
	                        rowspan: 2,
	                        iconAlign: 'top'
	                    }),
	                    Ext.apply(new Ext.Button(this.actions.deleteRole), {
	                        scale: 'medium',
	                        rowspan: 2,
	                        iconAlign: 'top'
	                    })
	                ]
	            } ,
	            '->', 
	                this.translation.gettext('Search:'), 
	                ' ',
	                RolesQuickSearchField
	            ]
	        });
	
	        Tine.Tinebase.MainScreen.setActiveToolbar(this.rolesToolbar, true);
	    },
	
	    displayRolesGrid: function() {
	        
	        // if grid panel was allready created set active content panel and return
	        if (this.gridPanel)
	        {
	            Tine.Tinebase.MainScreen.setActiveContentPanel(this.gridPanel, true);
	            return;
	        }
	        
	        if ( Tine.Tinebase.common.hasRight('manage', 'Admin', 'roles') ) {
	            this.actions.addRole.setDisabled(false);
	        }
	
	        var dataStore = new Ext.data.JsonStore({
	            baseParams: {
	                method: 'Admin.getRoles'
	            },
	            root: 'results',
	            totalProperty: 'totalcount',
	            id: 'id',
	            fields: Tine.Tinebase.Model.Role,
	            remoteSort: true
	        });
	        
	        dataStore.setDefaultSort('id', 'asc');
	
	        dataStore.on('beforeload', function(_dataStore, _options) {
	            _options = _options || {};
	            _options.params = _options.params || {};
	            _options.params.query = Ext.getCmp('RolesQuickSearchField').getValue();
	        }, this);
	        
	        // the paging toolbar
	        var pagingToolbar = new Ext.PagingToolbar({
	            pageSize: this.pageSize,
	            store: dataStore,
	            displayInfo: true,
	            displayMsg: this.translation.gettext('Displaying roles {0} - {1} of {2}'),
	            emptyMsg: this.translation.gettext("No roles to display")
	        });
	        
	        // the columnmodel
	        var columnModel = new Ext.grid.ColumnModel({
	            defaults: {
	                sortable: true,
	                resizable: true
	            },
	            columns: [
	                { id: 'id', header: this.translation.gettext('ID'), dataIndex: 'id', hidden: true, width: 10 },
	                { id: 'name', header: this.translation.gettext('Name'), dataIndex: 'name', width: 50 },
	                { id: 'description', header: this.translation.gettext('Description'), dataIndex: 'description' }
	            ]
	        });
	        
	        // the rowselection model
	        var rowSelectionModel = new Ext.grid.RowSelectionModel({multiSelect:true});
	
	        rowSelectionModel.on('selectionchange', function(_selectionModel) {
	            var rowCount = _selectionModel.getCount();
	
	            if ( Tine.Tinebase.common.hasRight('manage', 'Admin', 'roles') ) {
	                if(rowCount < 1) {
	                    // no row selected
	                    this.actions.deleteRole.setDisabled(true);
	                    this.actions.editRole.setDisabled(true);
	                } else if(rowCount > 1) {
	                    // more than one row selected
	                    this.actions.deleteRole.setDisabled(false);
	                    this.actions.editRole.setDisabled(true);
	                } else {
	                    // only one row selected
	                    this.actions.deleteRole.setDisabled(false);
	                    this.actions.editRole.setDisabled(false);
	                }
	            }
	        }, this);
	        
	        // the gridpanel
	        this.gridPanel = new Ext.grid.GridPanel({
	            canonicalName: ['Role', 'Grid'].join(Tine.Tinebase.CanonicalPath.separator),
	            store: dataStore,
	            cm: columnModel,
	            tbar: pagingToolbar,     
	            autoSizeColumns: false,
	            selModel: rowSelectionModel,
	            enableColLock:false,
	            autoExpandColumn: 'n_family',
	            border: false,
	            view: new Ext.grid.GridView({
	                autoFill: true,
	                forceFit:true,
	                ignoreAdd: true,
	                emptyText: this.translation.gettext('No roles to display')
	            })            
	        });
	        
	        this.gridPanel.on('rowcontextmenu', function(_grid, _rowIndex, _eventObject) {
	            _eventObject.stopEvent();
	            if(!_grid.getSelectionModel().isSelected(_rowIndex)) {
	                _grid.getSelectionModel().selectRow(_rowIndex);
	            }
	            
	            if (! this.contextMenu) {
	                this.contextMenu = new Ext.menu.Menu({
	                    id: 'ctxMenuRoles',
	                    plugins: [{
	                        ptype: 'ux.itemregistry',
	                        key:   'Tinebase-MainContextMenu'
	                    }],
	                    items: [
	                        this.actions.editRole,
	                        this.actions.deleteRole,
	                        '-',
	                        this.actions.addRole 
	                    ]
	                });
	            }
	            this.contextMenu.showAt(_eventObject.getXY());
	        }, this);
	        
	        this.gridPanel.on('rowdblclick', function(_gridPar, _rowIndexPar, ePar) {
	            if ( Tine.Tinebase.common.hasRight('manage', 'Admin', 'roles') ) {
	                var record = _gridPar.getStore().getAt(_rowIndexPar);
	                this.openEditWindow(record);
	            }
	        }, this);
	
	        // add the grid to the layout
	        Tine.Tinebase.MainScreen.setActiveContentPanel(this.gridPanel, true);
	    },
	    
	    /**
	     * update datastore with node values and load datastore
	     */
	    loadData: function() 
	    {
	        var dataStore = this.gridPanel.getStore();
	        dataStore.load({ params: { start: 0, limit: this.pageSize } });
	    },
	
	    show: function() 
	    {
	        if (this.rolesToolbar === null || this.gridPanel === null) {
	            this.initComponent();
	        }
	
	        this.displayRolesToolbar();
	        this.displayRolesGrid();
	
	        this.loadData();
	    },
	
	    reload: function () {
	        if (this.gridPanel) {
	            this.gridPanel.getStore().reload.defer(200, this.gridPanel.getStore());
	        }
	    }
	};
	
	
	/**
	 * Model of a right
	 */
	Tine.Admin.Roles.Right = Ext.data.Record.create([
	    {name: 'application_id'},
	    {name: 'right'}
	]);
	
	


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Admin
	 * @subpackage  SambaMachine
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	
	Ext.ns('Tine.Admin.sambaMachine');
	
	/**
	 * @namespace   Tine.Admin.sambaMachine
	 * @class       Tine.Admin.SambaMachineEditDialog
	 * @extends     Tine.widgets.dialog.EditDialog
	 */
	Tine.Admin.SambaMachineEditDialog  = Ext.extend(Tine.widgets.dialog.EditDialog, {
	    
	    /**
	     * @private
	     */
	    windowNamePrefix: 'sambaMachineEditWindow_',
	    appName: 'Admin',
	    recordClass: Tine.Admin.Model.SambaMachine,
	    recordProxy: Tine.Admin.sambaMachineBackend,
	    evalGrants: false,
	    
	    getFormItems: function() {
	        return {
	            xtype: 'columnform',
	            labelAlign: 'top',
	            border: false,
	            formDefaults: {
	                xtype:'textfield',
	                anchor: '100%',
	                labelSeparator: '',
	                columnWidth: 1
	            },
	            items: [[{
	                fieldLabel: this.app.i18n._('Computer Name'),
	                name: 'accountLoginName'
	            }]]
	        };
	    }
	});
	
	/**
	 * User edit popup
	 */
	Tine.Admin.SambaMachineEditDialog.openWindow = function (config) {
	    var id = (config.record && config.record.id) ? config.record.id : 0;
	    var window = Tine.WindowFactory.getWindow({
	        width: 300,
	        height: 100,
	        name: Tine.Admin.SambaMachineEditDialog.windowNamePrefix + id,
	        contentPanelConstructor: 'Tine.Admin.SambaMachineEditDialog',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};


/***/ },

/***/ 226:
/***/ 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) 2009-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Admin.sambaMachine');
	
	/**
	 * Samba machine 'mainScreen'
	 */
	Tine.Admin.sambaMachine.show = function() {
	    var app = Tine.Tinebase.appMgr.get('Admin');
	    if (! Tine.Admin.sambaMachine.gridPanel) {
	        Tine.Admin.sambaMachine.gridPanel = new Tine.Admin.SambaMachineGridPanel({
	            app: app
	        });
	    } else {
	        setTimeout ("Ext.getCmp('gridAdminComputers').getStore().load({ params: { start:0, limit:50 } })", 100);
	    }
	    
	    Tine.Tinebase.MainScreen.setActiveContentPanel(Tine.Admin.sambaMachine.gridPanel, true);
	    Tine.Tinebase.MainScreen.setActiveToolbar(Tine.Admin.sambaMachine.gridPanel.actionToolbar, true);
	};
	
	/**
	 * SambaMachine grid panel
	 *
	 * @namespace   Tine.Admin.sambaMachine
	 * @class       Tine.Admin.SambaMachineGridPanel
	 * @extends     Tine.widgets.grid.GridPanel
	 */
	Tine.Admin.SambaMachineGridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
	    // model generics
	    recordClass: Tine.Admin.Model.SambaMachine,
	    recordProxy: Tine.Admin.sambaMachineBackend,
	    defaultSortInfo: {field: 'accountLoginName', direction: 'ASC'},
	    evalGrants: false,
	    gridConfig: {
	        id: 'gridAdminComputers',
	        autoExpandColumn: 'accountDisplayName'
	    },
	    
	    initComponent: function() {
	        this.gridConfig.columns = this.getColumns();
	        Tine.Admin.SambaMachineGridPanel.superclass.initComponent.call(this);
	    },
	    
	    /**
	     * initialises filter toolbar
	     */
	    initFilterPanel: function() {
	        this.filterToolbar = new Tine.widgets.grid.FilterToolbar({
	            filterModels: [
	                {label: this.app.i18n._('Computer Name'),    field: 'query',       operators: ['contains']}
	                //{label: this.app.i18n._('Description'),    field: 'description', operators: ['contains']},
	            ],
	            defaultFilter: 'query',
	            filters: [],
	            plugins: [
	                new Tine.widgets.grid.FilterToolbarQuickFilterPlugin()
	            ]
	        });
	        this.plugins = this.plugins || [];
	        this.plugins.push(this.filterToolbar);
	    },
	    
	    /**
	     * returns cm
	     * @private
	     */
	    getColumns: function(){
	        return [{
	            id: 'accountId',
	            header: this.app.i18n._("ID"),
	            width: 100,
	            sortable: true,
	            dataIndex: 'accountId',
	            hidden: true
	        },{
	            id: 'accountLoginName',
	            header: this.app.i18n._("Name"),
	            width: 350,
	            sortable: true,
	            dataIndex: 'accountLoginName'
	        },{
	            id: 'accountDisplayName',
	            header: this.app.i18n._("Description"),
	            width: 350,
	            sortable: true,
	            dataIndex: 'accountDisplayName'
	        }];
	    }
	});


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Admin
	 * @subpackage  sambaMachine
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	
	Ext.ns('Tine.Admin.Model');
	
	Tine.Admin.Model.sambaMachineArray = [
	    { name: 'accountId'            },
	    { name: 'accountLoginName'     },
	    { name: 'accountLastName'      },
	    { name: 'accountFullName'      },
	    { name: 'accountDisplayName'   },
	    { name: 'accountPrimaryGroup'  },
	    { name: 'accountHomeDirectory' },
	    { name: 'accountLoginShell'    },
	    { name: 'sid'                  },
	    { name: 'primaryGroupSID'      },
	    { name: 'acctFlags'            },
	    //{ name: 'logonTime',     type: 'date', dateFormat: Date.patterns.ISO8601Long },
	    //{ name: 'logoffTime',    type: 'date', dateFormat: Date.patterns.ISO8601Long },
	    //{ name: 'kickoffTime',   type: 'date', dateFormat: Date.patterns.ISO8601Long },
	    //{ name: 'pwdLastSet',    type: 'date', dateFormat: Date.patterns.ISO8601Long },
	    //{ name: 'pwdCanChange',  type: 'date', dateFormat: Date.patterns.ISO8601Long },
	    { name: 'pwdMustChange', type: 'date', dateFormat: Date.patterns.ISO8601Long }
	];
	
	Tine.Admin.Model.SambaMachine = Tine.Tinebase.data.Record.create(Tine.Admin.Model.sambaMachineArray, {
	    appName: 'Admin',
	    modelName: 'SambaMachine',
	    idProperty: 'accountId',
	    titleProperty: 'accountDisplayName',
	    // ngettext('Computer', 'Computers', n);
	    recordName: 'Computer',
	    recordsName: 'Computers'
	});
	
	Tine.Admin.sambaMachineBackend = new Tine.Tinebase.data.RecordProxy({
	    appName: 'Admin',
	    modelName: 'SambaMachine',
	    recordClass: Tine.Admin.Model.SambaMachine,
	    idProperty: 'accountId'
	});


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philip Schuele <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2007-2010 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 * TODO         refactor this (don't use Ext.getCmp, etc.)
	 */
	
	/*global Ext, Tine, Locale*/
	
	Ext.ns('Tine.Admin.Tags');
	
	/**
	 * @namespace   Tine.Admin.Tags
	 * @class       Tine.Admin.Tags.EditDialog
	 * @extends     Tine.widgets.dialog.EditRecord
	 */
	Tine.Admin.Tags.EditDialog = Ext.extend(Tine.widgets.dialog.EditRecord, {
	    
	    /**
	     * var tag
	     */
	    tag: null,
	
	    windowNamePrefix: 'AdminTagEditDialog_',
	    id: 'tagDialog',
	    layout: 'fit',
	    border: false,
	    labelWidth: 120,
	    labelAlign: 'top',
	    
	    handlerApplyChanges: function (button, event, closeWindow) {
	        var form = this.getForm();
	        
	        if (form.isValid()) {
	            Ext.MessageBox.wait(this.translation.gettext('Please wait'), this.translation.gettext('Updating Tag'));
	            
	            var tag = this.tag;
	            
	            // fetch rights
	            tag.data.rights = [];
	            this.rightsStore.each(function (item) {
	                tag.data.rights.push(item.data);
	            });
	            
	            // fetch contexts
	            tag.data.contexts = [];
	            var anycontext = true;
	            var contextPanel = Ext.getCmp('adminSharedTagsContextPanel');
	            contextPanel.getRootNode().eachChild(function (node) {
	                if (node.attributes.checked) {
	                    tag.data.contexts.push(node.id);
	                } else {
	                    anycontext = false;
	                }
	            });
	            if (anycontext) {
	                tag.data.contexts = ['any'];
	            }
	            
	            form.updateRecord(tag);
	            
	            Ext.Ajax.request({
	                params: {
	                    method: 'Admin.saveTag', 
	                    tagData: tag.data
	                },
	                success: function (response) {
	                    this.fireEvent('update', Ext.util.JSON.encode(this.tag.data));
	                    Ext.MessageBox.hide();
	                    if (closeWindow === true) {
	                        this.window.close();
	                    } else {
	                        this.onRecordLoad(response);
	                    }
	                },
	                failure: function (result, request) {
	                    var responseText = Ext.util.JSON.decode(result.responseText),
	                        message = (responseText && responseText.message) ? responseText.message : 'unknown error';
	                    
	                    Ext.MessageBox.alert(
	                        this.translation._('Failed'),
	                        String.format(this.translation._('Could not save tag ({0})'), message)
	                    );
	                },
	                scope: this 
	            });
	        } else {
	            Ext.MessageBox.alert(this.translation.gettext('Errors'), this.translation.gettext('Please fix the errors noted.'));
	        }
	    },
	
	    /**
	     * function updateRecord
	     */
	    updateRecord: function (tagData) {
	        // if tagData is empty (=array), set to empty object because array wont work!
	        if (tagData.length === 0) {
	            tagData = {};
	        }
	        this.tag = new Tine.Tinebase.Model.Tag(tagData, tagData.id ? tagData.id : 0);
	        
	        if (! tagData.rights) {
	            tagData.rights = Tine.Tinebase.configManager.get('anyoneAccountDisabled') ? [] : [{
	                tag_id: '', //todo!
	                account_name: 'Anyone',
	                account_id: 0,
	                account_type: 'anyone',
	                view_right: true,
	                use_right: true
	            }];
	        }
	        
	        this.rightsStore.loadData({
	            results:    tagData.rights,
	            totalcount: tagData.rights.length
	        });
	        
	        this.anyContext = ! tagData.contexts || tagData.contexts.indexOf('any') > -1;
	        this.createTreeNodes(tagData.appList);
	        this.getForm().loadRecord(this.tag);
	    },
	
	    /**
	     * function updateToolbarButtons
	     */
	    updateToolbarButtons: function (rights) {
	       /* if(_rights.editGrant === true) {
	            Ext.getCmp('tagDialog').action_saveAndClose.enable();
	            Ext.getCmp('tagDialog').action_applyChanges.enable();
	        }
	       */
	
	    },
	    
	    createTreeNodes: function (appList) {
	        // clear old childs
	        var toRemove = [];
	        this.rootNode.eachChild(function (node) {
	            toRemove.push(node);
	        });
	        
	        for (var i = 0, j = appList.length; i < j; i += 1) {
	            // don't duplicate tree nodes on 'apply changes'
	            toRemove[i] ? toRemove[i].remove() : null;
	            
	            var appData = appList[i];
	            if (appData.name === 'Tinebase') {
	                continue;
	            }
	            // get translated app title
	            var app = Tine.Tinebase.appMgr.get(appData.name),
	                appTitle = (app) ? app.getTitle() : appData.name;
	            
	            this.rootNode.appendChild(new Ext.tree.TreeNode({
	                text: appTitle,
	                id: appData.id,
	                checked: this.anyContext || this.tag.get('contexts').indexOf(appData.id) > -1,
	                leaf: true,
	                iconCls: 'x-tree-node-leaf-checkbox'
	            }));
	        }
	    },
	    /**
	     * function display
	     */
	    getFormContents: function () {
	
	        this.rootNode = new Ext.tree.TreeNode({
	            text: this.translation.gettext('Allowed Contexts'),
	            expanded: true,
	            draggable: false,
	            allowDrop: false
	        });
	        var contextPanel = new Ext.tree.TreePanel({
	            title: this.translation.gettext('Context'),
	            id: 'adminSharedTagsContextPanel',
	            rootVisible: true,
	            border: false,
	            root: this.rootNode
	        });
	        // sort nodes in context panel by text property
	        var treeSorter = new Ext.tree.TreeSorter(contextPanel, {
	            folderSort: true,
	            dir: "asc"
	        });
	        
	        this.rightsPanel = new Tine.widgets.account.PickerGridPanel({
	            title: this.translation.gettext('Account Rights'),
	            store: this.rightsStore,
	            recordClass: Tine.Admin.Model.TagRight,
	            hasAccountPrefix: true,
	            selectType: 'both',
	            selectTypeDefault: 'group',
	            showHidden: true,
	            configColumns: [
	                new Ext.ux.grid.CheckColumn({
	                    header: this.translation.gettext('View'),
	                    dataIndex: 'view_right',
	                    width: 55
	                }),
	                new Ext.ux.grid.CheckColumn({
	                    header: this.translation.gettext('Use'),
	                    dataIndex: 'use_right',
	                    width: 55
	                })
	            ]
	        });
	
	        var editTagDialog = {
	            layout: 'border',
	            border: false,
	            items: [{
	                region: 'north',
	                xtype: 'columnform',
	                border: false,
	                autoHeight: true,
	                items: [[{
	                    columnWidth: 0.8,
	                    fieldLabel: this.translation.gettext('Tag Name'), 
	                    name: 'name',
	                    allowBlank: false,
	                    maxLength: 40
	                }, {
	                    xtype: 'colorfield',
	                    columnWidth: 0.2,
	                    fieldLabel: this.translation.gettext('Color'),
	                    name: 'color'
	                }], [{
	                    columnWidth: 1,
	                    name: 'description',
	                    fieldLabel: this.translation.gettext('Description'),
	                    anchor: '100%',
	                    xtype: 'textarea',
	                    height: 150
	                }]]
	            }, {
	                region: 'center',
	                xtype: 'tabpanel',
	                activeTab: 0,
	                deferredRender: false,
	                defaults: { autoScroll: true },
	                border: true,
	                plain: true,
	                items: [
	                    this.rightsPanel, 
	                    contextPanel
	                ]
	            }]
	        };
	        
	        return editTagDialog;
	    },
	    
	    initComponent: function () {
	        this.tag = this.tag ? this.tag : new Tine.Tinebase.Model.Tag({}, 0);
	        
	        this.translation = new Locale.Gettext();
	        this.translation.textdomain('Admin');
	        
	        Ext.Ajax.request({
	            scope: this,
	            success: this.onRecordLoad,
	            params: {
	                method: 'Admin.getTag',
	                tagId: this.tag.id
	            }
	        });
	        
	        this.rightsStore = new Ext.data.JsonStore({
	            root: 'results',
	            totalProperty: 'totalcount',
	            id: 'account_id',
	            fields: Tine.Admin.Model.TagRight
	        });
	        
	        this.items = this.getFormContents();
	        Tine.Admin.Tags.EditDialog.superclass.initComponent.call(this);
	    },
	    
	    onRender: function (ct, position) {
	        Tine.widgets.dialog.EditDialog.superclass.onRender.call(this, ct, position);
	        
	        // generalized keybord map for edit dlgs
	        var map = new Ext.KeyMap(this.el, [{
	            key: [10, 13], // ctrl + return
	            ctrl: true,
	            fn: this.handlerApplyChanges.createDelegate(this, [true], true),
	            scope: this
	        }]);
	
	        this.loadMask = new Ext.LoadMask(ct, {msg: String.format(i18n._('Transferring {0}...'), this.translation.gettext('Tag'))});
	        this.loadMask.show();
	    },
	    
	    onRecordLoad: function (response) {
	        this.getForm().findField('name').focus(false, 250);
	        var recordData = Ext.util.JSON.decode(response.responseText);
	        this.updateRecord(recordData);
	        
	        if (! this.tag.id) {
	            this.window.setTitle(this.translation.gettext('Add New Tag'));
	        } else {
	            this.window.setTitle(String.format(this.translation._('Edit Tag "{0}"'), this.tag.get('name')));
	        }
	        
	        this.loadMask.hide();
	    }     
	});
	
	/**
	 * Admin Tag Edit Popup
	 */
	Tine.Admin.Tags.EditDialog.openWindow = function (config) {
	    config.tag = config.tag ? config.tag : new Tine.Tinebase.Model.Tag({}, 0);
	    var window = Tine.WindowFactory.getWindow({
	        width: 650,
	        height: 400,
	        name: Tine.Admin.Tags.EditDialog.prototype.windowNamePrefix + config.tag.id,
	        contentPanelConstructor: 'Tine.Admin.Tags.EditDialog',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};


/***/ },

/***/ 229:
/***/ 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-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 * TODO         split into two files (grid & edit dlg)
	 * TODO         fix autoheight in edit dlg (use border layout?)
	 */
	 
	/*global Ext, Tine, Locale*/
	
	Ext.ns('Tine.Admin.Tags');
	
	Tine.Admin.Tags.Main = {
	    
	    //  references to created toolbar and grid panel
	    tagsToolbar: null,
	    gridPanel: null,
	    
	    actions: {
	        addTag: null,
	        editTag: null,
	        deleteTag: null
	    },
	    
	    handlers: {
	        /**
	         * onclick handler for addBtn
	         */
	        addTag: function (button, event) {
	            Tine.Admin.Tags.EditDialog.openWindow({
	                tag: null,
	                listeners: {
	                    scope: this,
	                    'update': function (record) {
	                        this.reload();
	                    }
	                }
	            });
	        },
	
	        /**
	         * onclick handler for editBtn
	         */
	        editTag: function (button, event) {
	            var selectedRows = this.gridPanel.getSelectionModel().getSelections();
	            Tine.Admin.Tags.EditDialog.openWindow({
	                tag: selectedRows[0],
	                listeners: {
	                    scope: this,
	                    'update': function (record) {
	                        this.reload();
	                    }
	                }
	            });
	        },
	        
	        /**
	         * onclick handler for deleteBtn
	         */
	        deleteTag: function (button, event) {
	            Ext.MessageBox.confirm(this.translation.gettext('Confirm'), this.translation.gettext('Do you really want to delete the selected tags?'), function (button) {
	                if (button === 'yes') {
	                
	                    var tagIds = [],
	                        selectedRows = this.gridPanel.getSelectionModel().getSelections();
	                        
	                    for (var i = 0; i < selectedRows.length; ++i) {
	                        tagIds.push(selectedRows[i].id);
	                    }
	                    
	                    tagIds = tagIds;
	                    
	                    Ext.Ajax.request({
	                        url: 'index.php',
	                        params: {
	                            method: 'Admin.deleteTags',
	                            tagIds: tagIds
	                        },
	                        text: this.translation.gettext('Deleting tag(s)...'),
	                        success: function (result, request) {
	                            this.gridPanel.getStore().reload();
	                        },
	                        scope: this
	                    });
	                }
	            }, this);
	        }    
	    },
	    
	    initComponent: function () {
	        this.translation = new Locale.Gettext();
	        this.translation.textdomain('Admin');
	        
	        this.pageSize = Tine.Tinebase.registry.get('preferences').get('pageSize')
	            ? parseInt(Tine.Tinebase.registry.get('preferences').get('pageSize'), 10)
	            : 50;
	        
	        this.actions.addTag = new Ext.Action({
	            text: this.translation.gettext('Add Tag'),
	            handler: this.handlers.addTag,
	            iconCls: 'action_tag',
	            scope: this,
	            disabled: !(Tine.Tinebase.common.hasRight('manage', 'Admin', 'shared_tags'))
	        });
	        
	        this.actions.editTag = new Ext.Action({
	            text: this.translation.gettext('Edit Tag'),
	            disabled: true,
	            handler: this.handlers.editTag,
	            iconCls: 'action_edit',
	            scope: this
	        });
	        
	        this.actions.deleteTag = new Ext.Action({
	            text: this.translation.gettext('Delete Tag'),
	            disabled: true,
	            handler: this.handlers.deleteTag,
	            iconCls: 'action_delete',
	            scope: this
	        });
	
	    },
	    
	    displayTagsToolbar: function () {
	        // if toolbar was allready created set active toolbar and return
	        if (this.tagsToolbar) {
	            Tine.Tinebase.MainScreen.setActiveToolbar(this.tagsToolbar, true);
	            return;
	        }
	        
	        var TagsQuickSearchField = new Ext.ux.SearchField({
	            id: 'TagsQuickSearchField',
	            width: 240,
	            emptyText: i18n._hidden('enter searchfilter')
	        });
	        
	        TagsQuickSearchField.on('change', function () {
	            this.gridPanel.getStore().load({
	                params: {
	                    start: 0,
	                    limit: this.pageSize
	                }
	            });
	        }, this);
	        
	        this.tagsToolbar = new Ext.Toolbar({
	            canonicalName: ['Tag', 'ActionToolbar'].join(Tine.Tinebase.CanonicalPath.separator),
	            split: false,
	            //height: 26,
	            items: [{
	                xtype: 'buttongroup',
	                columns: 5,
	                items: [
	                    Ext.apply(new Ext.Button(this.actions.addTag), {
	                        scale: 'medium',
	                        rowspan: 2,
	                        iconAlign: 'top'
	                    }),
	                    Ext.apply(new Ext.Button(this.actions.editTag), {
	                        scale: 'medium',
	                        rowspan: 2,
	                        iconAlign: 'top'
	                    }),
	                    Ext.apply(new Ext.Button(this.actions.deleteTag), {
	                        scale: 'medium',
	                        rowspan: 2,
	                        iconAlign: 'top'
	                    })
	                ]
	            }, '->', 
	                this.translation.gettext('Search:'), 
	                ' ',
	                TagsQuickSearchField
	            ]
	        });
	
	        Tine.Tinebase.MainScreen.setActiveToolbar(this.tagsToolbar, true);
	    },
	
	    displayTagsGrid: function () {
	        // if grid panel was allready created set active content panel and return
	        if (this.gridPanel) {
	            Tine.Tinebase.MainScreen.setActiveContentPanel(this.gridPanel, true);
	            return;
	        }
	        
	        // the datastore
	        var dataStore = new Ext.data.JsonStore({
	            baseParams: {
	                method: 'Admin.getTags'
	            },
	            root: 'results',
	            totalProperty: 'totalcount',
	            id: 'id',
	            fields: Tine.Tinebase.Model.Tag,
	            // turn on remote sorting
	            remoteSort: true
	        });
	        
	        dataStore.setDefaultSort('name', 'asc');
	
	        dataStore.on('beforeload', function (dataStore, options) {
	            options = options || {};
	            options.params = options.params || {};
	            options.params.query = Ext.getCmp('TagsQuickSearchField').getValue();
	        }, this);
	                
	        // the paging toolbar
	        var pagingToolbar = new Ext.PagingToolbar({
	            pageSize: this.pageSize,
	            store: dataStore,
	            displayInfo: true,
	            displayMsg: this.translation.gettext('Displaying tags {0} - {1} of {2}'),
	            emptyMsg: this.translation.gettext("No tags to display")
	        });
	        
	        // the columnmodel
	        var columnModel = new Ext.grid.ColumnModel({
	            defaults: {
	                sortable: true,
	                resizable: true
	            },
	            columns: [
	                { id: 'color', header: this.translation.gettext('Color'), dataIndex: 'color', width: 25, renderer: function (color,meta,record) {
	                    return '<div style="margin-top:1px;width: 8px; height: 8px; background-color:' + color + '; border-radius:5px;border: 1px solid black;" title="' + record.get('name') + ' (' +  i18n._('Usage:&#160;') + record.get('occurrence') + ')">&#160;</div>';
	                }},
	                { id: 'name', header: this.translation.gettext('Name'), dataIndex: 'name', width: 200 },
	                { id: 'description', header: this.translation.gettext('Description'), dataIndex: 'description', width: 500}
	            ]
	        });
	        
	        // the rowselection model
	        var rowSelectionModel = new Ext.grid.RowSelectionModel({multiSelect: true});
	
	        rowSelectionModel.on('selectionchange', function (selectionModel) {
	            var rowCount = selectionModel.getCount();
	
	            if (Tine.Tinebase.common.hasRight('manage', 'Admin', 'shared_tags')) {
	                if (rowCount < 1) {
	                    // no row selected
	                    this.actions.deleteTag.setDisabled(true);
	                    this.actions.editTag.setDisabled(true);
	                } else if (rowCount > 1) {
	                    // more than one row selected
	                    this.actions.deleteTag.setDisabled(false);
	                    this.actions.editTag.setDisabled(true);
	                } else {
	                    // only one row selected
	                    this.actions.deleteTag.setDisabled(false);
	                    this.actions.editTag.setDisabled(false);
	                }
	            }
	        }, this);
	        
	        // the gridpanel
	        this.gridPanel = new Ext.grid.GridPanel({
	            canonicalName: ['Tag', 'Grid'].join(Tine.Tinebase.CanonicalPath.separator),
	            store: dataStore,
	            cm: columnModel,
	            tbar: pagingToolbar,     
	            autoSizeColumns: false,
	            selModel: rowSelectionModel,
	            enableColLock: false,
	            autoExpandColumn: 'description',
	            border: false,
	            view: new Ext.grid.GridView({
	                autoFill: true,
	                forceFit: true,
	                ignoreAdd: true,
	                emptyText: this.translation.gettext('No tags to display')
	            })            
	        });
	        
	        this.gridPanel.on('rowcontextmenu', function (grid, rowIndex, eventObject) {
	            eventObject.stopEvent();
	            if (! grid.getSelectionModel().isSelected(rowIndex)) {
	                grid.getSelectionModel().selectRow(rowIndex);
	            }
	            
	            if (! this.contextMenu) {
	                this.contextMenu = new Ext.menu.Menu({
	                    id: 'ctxMenuTags',
	                    plugins: [{
	                        ptype: 'ux.itemregistry',
	                        key:   'Tinebase-MainContextMenu'
	                    }],
	                    items: [
	                        this.actions.editTag,
	                        this.actions.deleteTag,
	                        '-',
	                        this.actions.addTag 
	                    ]
	                });
	            }
	            this.contextMenu.showAt(eventObject.getXY());
	        }, this);
	        
	        this.gridPanel.on('rowdblclick', function (gridPar, rowIndexPar, ePar) {
	            var record = gridPar.getStore().getAt(rowIndexPar);
	            Tine.Admin.Tags.EditDialog.openWindow({
	                tag: record,
	                listeners: {
	                    scope: this,
	                    'update': function (record) {
	                        this.reload();
	                    }
	                }
	            });
	        }, this);
	
	        // add the grid to the layout
	        Tine.Tinebase.MainScreen.setActiveContentPanel(this.gridPanel, true);
	    },
	    
	    /**
	     * update datastore with node values and load datastore
	     */
	    loadData: function () {
	        var dataStore = this.gridPanel.getStore();
	        dataStore.load({ params: { start: 0, limit: this.pageSize } });
	    },
	
	    show: function () {
	        if (this.tagsToolbar === null || this.gridPanel) {
	            this.initComponent();
	        }
	
	        this.displayTagsToolbar();
	        this.displayTagsGrid();
	
	        this.loadData();
	    },
	
	    reload: function () {
	        if (this.gridPanel) {
	            this.gridPanel.getStore().reload.defer(200, this.gridPanel.getStore());
	        }
	    }
	};


/***/ },

/***/ 230:
/***/ 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) 2015 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	Ext.ns('Tine.Admin.config');
	
	
	/**
	 * config edit field manager
	 *
	 *  @singleton
	 */
	Tine.Admin.config.FieldManager = function() {
	    var items = {};
	
	    return {
	
	        /**
	         * create field for given configRecord value
	         *
	         * @param configRecord
	         * @param options
	         * @returns Ext.form.Field|null
	         */
	        create: function (configRecord, options) {
	            var type = configRecord.get('type'),
	                constr = Ext.form.TextField;
	
	            if (items.hasOwnProperty(type)) {
	                constr = items[type]
	            } else {
	                switch (type) {
	                    case 'string':
	                        constr = Ext.form.TextField;
	                        break;
	
	                    case 'bool':
	                    case 'boolean':
	                        options = Ext.apply({
	                            mode: 'local',
	                            forceSelection: true,
	                            allowEmpty: false,
	                            triggerAction: 'all',
	                            editable: false,
	                            store: [[true, i18n._('Yes')], [false, i18n._('No')]]
	                        }, options);
	                        constr = Ext.form.ComboBox;
	                        break;
	
	                    case 'keyField':
	                        var store = [];
	                        Ext.each(configRecord.get('options')['records'], function(record) {
	                            store.push([record.id, options.app.i18n._hidden(record.value)]);
	                        });
	
	                        options = Ext.apply({
	                            mode: 'local',
	                            forceSelection: true,
	                            allowEmpty: false,
	                            triggerAction: 'all',
	                            editable: false,
	                            store: store
	                        }, options);
	                        constr = Ext.form.ComboBox;
	                        break;
	
	                    case 'keyFieldConfig':
	                        constr = Tine.Tinebase.widgets.keyfield.ConfigField;
	                        break;
	
	                    default:
	                        constr = null;
	                        break;
	                }
	            }
	
	            return Ext.isFunction(constr) ? new constr(options) : null;
	
	        },
	
	        /**
	         * register editor field for given config
	         *
	         *  @static
	         *  @param type string
	         *  @param constructor Function
	         */
	        register: function (type, constructor) {
	            items[type] = constructor;
	        }
	    };
	}();

/***/ },

/***/ 231:
/***/ 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) 2015 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	Ext.ns('Tine.Admin.config');
	
	/**
	 * config grid panel
	 *
	 * @namespace   Tine.Admin.config
	 * @class       Tine.Admin.config.GridPanel
	 * @extends     Tine.widgets.grid.GridPanel
	 */
	Tine.Admin.config.GridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
	
	    /**
	     * app to configure with this config panel
	     * @cfg {Tine.Tinebase.Application}
	     */
	    configApp: null,
	
	    recordClass: Tine.Admin.Model.Config,
	    defaultSortInfo: {field: 'name', direction: 'ASC'},
	
	    evalGrants: false,
	
	    initFilterPanel: Ext.emptyFn,
	    onRowDblClick: Ext.emptyFn,
	
	    /**
	     * initComponent
	     */
	    initComponent: function() {
	        var me = this;
	
	        this.recordProxy = new Tine.Tinebase.data.RecordProxy({
	            recordClass: this.recordClass
	        });
	
	        if (this.appName && !this.configApp) {
	            this.configApp = Tine.Tinebase.appMgr.get(this.appName);
	        }
	
	        this.app = Tine.Tinebase.appMgr.get('Admin');
	        this.title = this.app.i18n._("Config");
	
	        this.gridConfig = {
	            autoExpandColumn: 'value',
	            gridType: Ext.grid.EditorGridPanel,
	            clicksToEdit: 'auto',
	        };
	
	        this.detailsPanel = new Tine.widgets.grid.DetailsPanel({
	            singleRecordPanel: new Ext.ux.display.DisplayPanel({
	                layout: 'fit',
	                border: false,
	                items: [{
	                    cls: 'x-ux-display-background-border',
	                    fieldLabel: me.app.i18n.gettext('Description'),
	                    name: 'description',
	                    xtype: 'ux.displaytextarea',
	                    renderer: Tine.Tinebase.common.i18nRenderer.createDelegate(me.configApp.i18n)
	                }]
	            })
	        });
	
	
	        this.gridConfig.columns = [{
	            id: 'name',
	            header: this.app.i18n._("Name"),
	            width: 150,
	            sortable: true,
	            dataIndex: 'name'
	        },{
	            id: 'label',
	            header: this.app.i18n._("Label"),
	            width: 150,
	            sortable: true,
	            dataIndex: 'label',
	            renderer: Tine.Tinebase.common.i18nRenderer.createDelegate(this.configApp.i18n)
	        }, {
	            id: 'value',
	            header: this.app.i18n._("Value"),
	            width: 150,
	            sortable: true,
	            dataIndex: 'value',
	            renderer: this.valueRenderer.createDelegate(this),
	            editable: true
	        }];
	
	        this.supr().initComponent.call(this);
	
	        this.getGrid().on('beforeedit', this.onBeforeValueEdit, this);
	        this.getGrid().on('afteredit', this.onAfterValuerEdit, this);
	        this.action_editInNewWindow.setHidden(true);
	        this.action_addInNewWindow.setHidden(true);
	    },
	
	    /**
	     * @param o
	         grid - This grid
	         record - The record being edited
	         field - The field name being edited
	         value - The value for the field being edited.
	         row - The grid row index
	         column - The grid column index
	         cancel - Set this to true to cancel the edit or return false from your handler.
	     */
	    onBeforeValueEdit: function(o) {
	        if (o.field != 'value') {
	            o.cancel = true;
	        }
	
	        else {
	            var colModel = o.grid.getColumnModel(),
	                type = o.record.get('type');
	
	            if (o.record.get('source') == 'FILE') {
	                // excluded by admin controller
	            }
	            o.record.beginEdit();
	
	            if (o.record.get('source') == 'DEFAULT') {
	                var def = o.record.get('default');
	                o.value = String(def).match(/^[{\[]]/) ? def : Ext.encode(def);
	            }
	
	            o.record.set('value', Ext.decode(o.value));
	
	            colModel.config[o.column].setEditor(
	                Tine.Admin.config.FieldManager.create(o.record, {
	                    app: this.configApp,
	                    configRecord: o.record,
	                    expandOnFocus: true
	                })
	            );
	        }
	    },
	
	    /**
	     * @param o
	         grid - This grid
	         record - The record being edited
	         field - The field name being edited
	         value - The value being set
	         originalValue - The original value for the field, before the edit.
	         row - The grid row index
	         column - The grid column index
	     */
	    onAfterValuerEdit: function(o) {
	        if (o.field == 'value') {
	            o.value = Ext.encode(o.value);
	
	            var def = o.record.get('default');
	            def = String(def).match(/^[{\[]]/) ? def : Ext.encode(def);
	
	            if (o.value == def) {
	                o.record.cancelEdit();
	
	                if (o.record.get('source') != 'DEFAULT') {
	                    this.deleteRecords(this.grid.getSelectionModel(), [o.record]);
	                }
	
	                return;
	            } else {
	                if (o.record.get('source') == 'DEFAULT') {
	                    o.record.set('source', '');
	                }
	
	                o.record.set('value', '');
	                o.record.set('value', o.value);
	            }
	
	            if (o.record.get('id').match(/^virtual-/)) {
	                o.record.set('id', '');
	            }
	
	            o.record.endEdit();
	
	        }
	    },
	
	    initStore: function() {
	        this.supr().initStore.call(this);
	
	        this.store.on('beforeload', this.onStoreBeforeload, this);
	    },
	
	    onStoreBeforeload: function(store, options) {
	        this.supr().onStoreBeforeload.call(this, store, options);
	        options.params.filter.push({'field': 'application_id', 'operator': 'equals', 'value': this.configApp.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) {
	        this.supr().onStoreUpdate.call(this, store, record, operation);
	
	        switch (operation) {
	            case Ext.data.Record.EDIT:
	                // do/check registry reload
	                // TODO do this in parent window?
	                Tine.Tinebase.common.confirmApplicationRestart(true);
	                break;
	        }
	    },
	
	    valueRenderer: function(value, metaData, record, rowIndex, colIndex, store) {
	        if (record.get('source') == 'DEFAULT') {
	            value = Ext.encode(record.get('default'));
	        }
	
	        value = Ext.decode(value);
	
	        switch (record.get('type')) {
	            case 'bool':
	                value = Tine.Tinebase.common.booleanRenderer(value);
	                break;
	            case 'keyField':
	                Ext.each(record.get('options')['records'], function(record) {
	                    if (record.id == value) {
	                        value = this.configApp.i18n._hidden(record.value);
	                    }
	                }, this);
	                break;
	            case 'keyFieldConfig':
	                value = '...';
	                break;
	            default:
	                break;
	        }
	
	        if (record.get('source') == 'DEFAULT') {
	            return String.format(this.app.i18n._('Default ({0})'), value);
	        }
	
	        return value;
	    }
	});
	


/***/ },

/***/ 232:
/***/ 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) 2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	
	/*global Ext, Tine*/ 
	
	Ext.ns('Tine.Admin.container');
	
	/**
	 * Containers 'mainScreen'
	 * 
	 * @static
	 */
	Tine.Admin.container.show = function () {
	    var app = Tine.Tinebase.appMgr.get('Admin');
	    if (! Tine.Admin.container.gridPanel) {
	        Tine.Admin.container.gridPanel = new Tine.Admin.container.GridPanel({
	            app: app
	        });
	    }
	    else {
	        Tine.Admin.container.gridPanel.loadGridData.defer(100, Tine.Admin.container.gridPanel, []);
	    }
	    
	    Tine.Tinebase.MainScreen.setActiveContentPanel(Tine.Admin.container.gridPanel, true);
	    Tine.Tinebase.MainScreen.setActiveToolbar(Tine.Admin.container.gridPanel.actionToolbar, true);
	};
	
	/************** models *****************/
	Ext.ns('Tine.Admin.Model');
	
	/**
	 * Model of a container
	 */
	Tine.Admin.Model.Container = Tine.Tinebase.data.Record.create(Tine.Tinebase.Model.Container.getFieldDefinitions().concat([
	    {name: 'note'}
	]), {
	    appName: 'Admin',
	    modelName: 'Container',
	    idProperty: 'id',
	    titleProperty: 'name',
	    // ngettext('Container', 'Containers', n);
	    recordName: 'Container',
	    recordsName: 'Containers'
	});
	
	/**
	 * returns default account data
	 * 
	 * @namespace Tine.Admin.Model.Container
	 * @static
	 * @return {Object} default data
	 */
	Tine.Admin.Model.Container.getDefaultData = function () {
	    return {
	        type: 'shared',
	        backend: 'Sql'
	    };
	};
	
	/************** backend *****************/
	
	Tine.Admin.containerBackend = new Tine.Tinebase.data.RecordProxy({
	    appName: 'Admin',
	    modelName: 'Container',
	    recordClass: Tine.Admin.Model.Container,
	    idProperty: 'id'
	});


/***/ },

/***/ 233:
/***/ 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) 2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	 
	/*global Ext, Tine*/
	
	Ext.ns('Tine.Admin.container');
	
	/**
	 * @namespace   Tine.Admin.container
	 * @class       Tine.Admin.ContainerEditDialog
	 * @extends     Tine.widgets.dialog.EditDialog
	 * 
	 * <p>Container Edit Dialog</p>
	 * <p>
	 * </p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Admin.ContainerEditDialog
	 * 
	 * TODO add note for personal containers (note is sent to container owner)
	 */
	Tine.Admin.ContainerEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog, {
	    
	    /**
	     * @private
	     */
	    windowNamePrefix: 'containerEditWindow_',
	    appName: 'Admin',
	    recordClass: Tine.Admin.Model.Container,
	    recordProxy: Tine.Admin.containerBackend,
	    evalGrants: false,
	    modelStore: null,
	    
	    /**
	     * executed after record got updated from proxy
	     */
	    onRecordLoad: function () {
	        Tine.Admin.ContainerEditDialog.superclass.onRecordLoad.apply(this, arguments);
	        
	        // load grants store if editing record
	        if (this.record && this.record.id) {
	            this.grantsStore.loadData({
	                results:    this.record.get('account_grants'),
	                totalcount: this.record.get('account_grants').length
	            });
	        }
	    },    
	    
	    /**
	     * executed when record gets updated from form
	     */
	    onRecordUpdate: function () {
	        Tine.Admin.ContainerEditDialog.superclass.onRecordUpdate.apply(this, arguments);
	        
	        // get grants from grants grid
	        this.record.set('account_grants', '');
	        var grants = [];
	        this.grantsStore.each(function(grant){
	            grants.push(grant.data);
	        });
	        this.record.set('account_grants', grants);
	    },
	    
	    /**
	     * create grants store + grid
	     * 
	     * @return {Tine.widgets.container.GrantsGrid}
	     */
	    initGrantsGrid: function () {
	        this.grantsStore = new Ext.data.JsonStore({
	            root: 'results',
	            totalProperty: 'totalcount',
	            id: 'account_id',
	            fields: Tine.Tinebase.Model.Grant
	        });
	       
	        this.grantsGrid = new Tine.widgets.container.GrantsGrid({
	            flex: 1,
	            store: this.grantsStore,
	            grantContainer: this.record.data,
	            alwaysShowAdminGrant: true,
	            showHidden: true
	        });
	        
	        return this.grantsGrid;
	    },
	
	    /**
	     * returns dialog
	     */
	    getFormItems: function () {
	        var userApplications = Tine.Tinebase.registry.get('userApplications');
	        this.appStore = new Ext.data.JsonStore({
	            root: 'results',
	            totalProperty: 'totalcount',
	            fields: Tine.Admin.Model.Application
	        });
	
	        this.appStore.loadData({
	            results: userApplications,
	            totalcount: userApplications.length
	        });
	
	        this.modelStore = new Ext.data.ArrayStore({
	            idIndex: 0,
	            fields: [{name: 'value'}, {name: 'name'}]
	        });
	
	        return {
	            layout: 'vbox',
	            layoutConfig: {
	                align: 'stretch',
	                pack: 'start'
	            },
	            border: false,
	            items: [{
	                xtype: 'columnform',
	                border: false,
	                autoHeight: true,
	                items: [[{
	                    columnWidth: 0.2,
	                    fieldLabel: this.app.i18n._('Name'), 
	                    name: 'name',
	                    allowBlank: false,
	                    maxLength: 255
	                }, {
	                    xtype: 'combo',
	                    readOnly: this.record.id != 0,
	                    store: this.appStore,
	                    columnWidth: 0.2,
	                    name: 'application_id',
	                    displayField: 'name',
	                    valueField: 'id',
	                    fieldLabel: this.app.i18n._('Application'),
	                    mode: 'local',
	                    anchor: '100%',
	                    allowBlank: false,
	                    forceSelection: true,
	                    listeners: {
	                        scope: this,
	                        'select': function (combo, rec) {
	                            this.modelStore.loadData(this.getApplicationModels(rec, false));
	                            Ext.getCmp('modelCombo').setValue('');
	                        }
	                    }
	                },
	                {
	                    xtype: 'combo',
	                    readOnly: this.record.id != 0,
	                    store: this.modelStore,
	                    columnWidth: 0.2,
	                    name: 'model',
	                    displayField: 'name',
	                    valueField: 'value',
	                    fieldLabel: this.app.i18n._('Model'),
	                    mode: 'local',
	                    anchor: '100%',
	                    allowBlank: false,
	                    forceSelection: true,
	                    editable: false,
	                    id: 'modelCombo'
	                }, {
	                    xtype: 'combo',
	                    columnWidth: 0.2,
	                    name: 'type',
	                    fieldLabel: this.app.i18n._('Type'),
	                    store: [['personal', this.app.i18n._('personal')], ['shared', this.app.i18n._('shared')]],
	                    listeners: {
	                        scope: this,
	                        select: function (combo, record) {
	                            this.getForm().findField('note').setDisabled(record.data.field1 === 'shared');
	                        }
	                    },
	                    mode: 'local',
	                    anchor: '100%',
	                    allowBlank: false,
	                    forceSelection: true
	                }, {
	                    columnWidth: 0.1,
	                    fieldLabel: this.app.i18n._('Order'),
	                    name: 'order',
	                    value: 0
	                }, {
	                    xtype: 'colorfield',
	                    columnWidth: 0.1,
	                    fieldLabel: this.app.i18n._('Color'),
	                    name: 'color'
	                }]]
	            }, 
	                this.initGrantsGrid(), {
	                    emptyText: this.app.i18n._('Note for Owner'),
	                    disabled: this.record.get('type') == 'shared',
	                    xtype: 'textarea',
	                    border: false,
	                    autoHeight: true,
	                    name: 'note'
	                }
	               ]
	        };
	    }
	});
	
	/**
	 * Container Edit Popup
	 * 
	 * @param   {Object} config
	 * @return  {Ext.ux.Window}
	 */
	Tine.Admin.ContainerEditDialog.openWindow = function (config) {
	    var window = Tine.WindowFactory.getWindow({
	        width: 700,
	        height: 400,
	        name: Tine.Admin.ContainerEditDialog.prototype.windowNamePrefix + Ext.id(),
	        contentPanelConstructor: 'Tine.Admin.ContainerEditDialog',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};


/***/ },

/***/ 234:
/***/ 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) 2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	Ext.ns('Tine.Admin.container');
	
	
	/**
	 * Container grid panel
	 * 
	 * @namespace   Tine.Admin.container
	 * @class       Tine.Admin.container.GridPanel
	 * @extends     Tine.widgets.grid.GridPanel
	 */
	Tine.Admin.container.GridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
	    
	    /**
	     * @cfg
	     */
	    newRecordIcon: 'admin-action-add-container',
	    recordClass: Tine.Admin.Model.Container,
	    recordProxy: Tine.Admin.containerBackend,
	    defaultSortInfo: {field: 'name', direction: 'ASC'},
	    evalGrants: false,
	    gridConfig: {
	        autoExpandColumn: 'name'
	    },
	    
	    /**
	     * initComponent
	     */
	    initComponent: function() {
	        this.gridConfig.cm = this.getColumnModel();
	        Tine.Admin.container.GridPanel.superclass.initComponent.call(this);
	    },
	    
	    /**
	     * returns column model
	     * 
	     * @return Ext.grid.ColumnModel
	     * @private
	     */
	    getColumnModel: function() {
	        return new Ext.grid.ColumnModel({
	            defaults: {
	                sortable: true,
	                hidden: true,
	                resizable: true
	            },
	            columns: this.getColumns()
	        });
	    },
	    
	    /**
	     * returns columns
	     * @private
	     * @return Array
	     */
	    getColumns: function(){
	        return [
	            { header: this.app.i18n._('ID'), id: 'id', dataIndex: 'id', width: 50},
	            { header: this.app.i18n._('Container Name'), id: 'name', dataIndex: 'name', hidden: false, width: 200},
	            { header: this.app.i18n._('Application'), id: 'application_id', dataIndex: 'application_id', hidden: false, width: 100, renderer: this.appRenderer.createDelegate(this)},
	            { header: this.app.i18n._('Type'), id: 'type', dataIndex: 'type', hidden: false, width: 80, renderer: this.typeRenderer.createDelegate(this)},
	            { header: this.app.i18n._('Container Order'), id: 'order', dataIndex: 'order', hidden: true, width: 200}
	        ];
	    },
	    
	    /**
	     * returns application name
	     * 
	     * @param {Object} value
	     * @return {String}
	     */
	    appRenderer: function(value) {
	        return this.app.i18n._(value.name);
	    },
	    
	    /**
	     * returns translated type
	     * 
	     * @param {Object} value
	     * @return {String}
	     */
	    typeRenderer: function(value) {
	        return this.app.i18n._(value);
	    },
	    
	    /**
	     * initialises filter toolbar
	     */
	    initFilterPanel: function() {
	        this.filterToolbar = new Tine.widgets.grid.FilterToolbar({
	            filterModels: [
	                {label: this.app.i18n._('Container'),       field: 'query',    operators: ['contains']},
	                {label: this.app.i18n._('Type'),            field: 'type',     operators: ['contains']},
	                {filtertype: 'admin.application', app: this.app}
	            ],
	            defaultFilter: 'query',
	            filters: [
	                {field: 'type', operator: 'equals', value: 'shared'}
	            ],
	            plugins: [
	                new Tine.widgets.grid.FilterToolbarQuickFilterPlugin()
	            ]
	        });
	        this.plugins = this.plugins || [];
	        this.plugins.push(this.filterToolbar);
	    }
	});


/***/ },

/***/ 235:
/***/ 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) 2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	
	/*global Ext, Tine*/ 
	
	Ext.ns('Tine.Admin.customfield');
	
	/**
	 * Customfields 'mainScreen'
	 * 
	 * @static
	 */
	Tine.Admin.customfield.show = function () {
	    var app = Tine.Tinebase.appMgr.get('Admin');
	    if (! Tine.Admin.customfield.gridPanel) {
	        Tine.Admin.customfield.gridPanel = new Tine.Admin.customfield.GridPanel({
	            app: app
	        });
	    }
	    else {
	        Tine.Admin.customfield.gridPanel.loadGridData.defer(100, Tine.Admin.customfield.gridPanel, []);
	    }
	    
	    Tine.Tinebase.MainScreen.setActiveContentPanel(Tine.Admin.customfield.gridPanel, true);
	    Tine.Tinebase.MainScreen.setActiveToolbar(Tine.Admin.customfield.gridPanel.actionToolbar, true);
	};
	
	/************** models *****************/
	Ext.ns('Tine.Admin.Model');
	
	/**
	 * Model of a customfield
	 */
	Tine.Admin.Model.Customfield = Tine.Tinebase.data.Record.create(Tine.Tinebase.Model.Customfield.prototype.fields.items, {
	    appName: 'Admin',
	    modelName: 'Customfield',
	    idProperty: 'id',
	    titleProperty: 'name',
	    // ngettext('Customfield', 'Customfields', n);
	    recordName: 'Customfield',
	    recordsName: 'Customfields'
	});
	
	/************** backend *****************/
	
	Tine.Admin.customfieldBackend = new Tine.Tinebase.data.RecordProxy({
	    appName: 'Admin',
	    modelName: 'Customfield',
	    recordClass: Tine.Admin.Model.Customfield,
	    idProperty: 'id'
	});


/***/ },

/***/ 236:
/***/ 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) 2011-2012 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	 
	/*global Ext, Tine*/
	
	Ext.ns('Tine.Admin.customfield');
	
	/**
	 * @namespace   Tine.Admin.customfield
	 * @class       Tine.Admin.CustomfieldEditDialog
	 * @extends     Tine.widgets.dialog.EditDialog
	 * 
	 * <p>Customfield Edit Dialog</p>
	 * <p>
	 * </p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Admin.CustomfieldEditDialog
	 * 
	 */
	Tine.Admin.CustomfieldEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog, {
	    
	    /**
	     * @private
	     */
	    windowNamePrefix: 'customfieldEditWindow_',
	    appName: 'Admin',
	    recordClass: Tine.Admin.Model.Customfield,
	    recordProxy: Tine.Admin.customfieldBackend,
	    evalGrants: false,
	    modelStore: null,
	    
	    /**
	     * definition properties for cusomfield
	     * @type {Array}
	     */
	    definitionFields: ['label', 'type', 'value_search', 'length', 'required'],
	    
	    /**
	     * ui properties for customfield
	     * @type {Array}
	     */
	    uiconfigFields: ['order', 'group', 'tab'],
	    
	    /**
	     * type of field with stores
	     * @type {Array}
	     */
	    fieldsWithStore: ['record', 'keyField',  'recordList'],
	    
	    /**
	     * currently selected field type
	     * @type 
	     */
	    fieldType: null,
	        
	    /**
	     * executed after record got updated from proxy
	     *  - load values for customfield definition and ui
	     */
	    onRecordLoad: function () {
	        Tine.Admin.CustomfieldEditDialog.superclass.onRecordLoad.apply(this, arguments);
	        
	        // get definition
	        if (this.rendered && this.record.get('definition')) {
	            this.fieldType = this.record.get('definition').type;
	            
	            // load definition values
	            Ext.each(this.definitionFields, function (name) {
	                this.getForm().findField(name).setValue(this.record.get('definition')[name]);
	            }, this);
	            
	            // load ui config values
	            Ext.each(this.uiconfigFields, function (name) {
	                this.getForm().findField(name).setValue(this.record.get('definition').uiconfig[name]);
	            }, this);
	            
	            // load specific values for fields with store
	            if (this.record.get('definition')[this.fieldType + 'Config']) {
	                this[this.fieldType + 'Config'] = this.record.get('definition')[this.fieldType + 'Config'];
	            }
	        }
	    },    
	    
	    /**
	     * executed when record gets updated from form
	     *  - get values for customfield definition and ui
	     */
	    onRecordUpdate: function () {
	        Tine.Admin.CustomfieldEditDialog.superclass.onRecordUpdate.apply(this, arguments);
	        
	        // field definition
	        this.record.data.definition = {
	            uiconfig: {}
	        };
	        
	        // save definition
	        Ext.each(this.definitionFields, function (name) {
	            var field = this.getForm().findField(name);
	            
	            if (! field.disabled && (name !== 'value_search' || (name === 'value_search' && field.getValue() == 1))) {
	                this.record.data.definition[name] = field.getValue();
	            }
	        }, this);
	        
	        // save ui config
	        Ext.each(this.uiconfigFields, function (name) {
	            this.record.data.definition.uiconfig[name] = this.getForm().findField(name).getValue();;
	        }, this);
	        
	        // set specific values for fields with stores
	        Ext.each(this.fieldsWithStore, function (field) {
	            if (this.fieldsWithStore.indexOf(this.fieldType) !== -1 && this[field + 'Config']) {
	                this.record.data.definition[field + 'Config'] = this[field + 'Config'];
	            }
	        }, this);
	    },
	    
	    /**
	     * Apply changes handler
	     *  - validate some additional data before saving
	     * 
	     * @param {Ext.Button} button
	     * @param {Ext.EventObject} event
	     * @param {Boolean} closeWindow
	     */
	    onApplyChanges: function () {
	        if (this.fieldsWithStore.indexOf(this.fieldType) !== -1 && ! this[this.fieldType + 'Config']) {
	            Ext.Msg.alert(i18n._('Errors'), this.app.i18n._('Please configure store for this field type'));
	            return;
	        }
	        
	        Tine.Admin.CustomfieldEditDialog.superclass.onApplyChanges.apply(this, arguments);
	    },
	    
	    /**
	     * Called on type combo select
	     * 
	     * @param {Ext.form.Combobox}   combo
	     * @param {Ext.data.Recod}      record
	     * @param {Int}                 index
	     */
	    onTypeComboSelect: function (combo, record, index) {
	        this.fieldType = combo.getValue();
	        
	        this.getForm().findField('length').setDisabled(this.fieldType !== 'string');
	        this.getForm().findField('value_search').setValue(this.fieldType === 'searchcombo' ? 1 : 0);
	        this.configureStoreBtn.setDisabled(this.fieldsWithStore.indexOf(this.fieldType) === -1);
	    },
	    
	    /**
	     * Set field with store config
	     */ 
	    onStoreWindowOK: function () {
	        if (this[this.fieldType + 'Store'].isValid()) {
	            if (this.fieldType == 'record' || this.fieldType == 'recordList') {
	                this[this.fieldType + 'Config'] = {
	                    value: {
	                        records: this[this.fieldType + 'Store'].getValue()
	                    }
	                };
	            } else {
	                this[this.fieldType + 'Config'] = {value: this[this.fieldType + 'Store'].getValue()};
	            }
	             
	            this.onStoreWindowClose();
	        }
	    },
	    
	    /**
	     * Close store Window
	     */
	    onStoreWindowClose: function () {
	        this.storeWindow.purgeListeners();
	        this.storeWindow.close();
	    },
	    
	    /**
	     * Create store/grid for keyFields
	     * 
	     * @returns {Tine.widgets.grid.KeyFieldGridPanel}
	     */
	    initKeyFieldStore: function () {
	
	        this[this.fieldType + 'Store'] =  new Tine.Tinebase.widgets.keyfield.ConfigGrid({});
	
	        var configValue = ! Ext.isEmpty(this.record.get('definition')) && this.record.get('definition')[this.fieldType + 'Config']
	            ? this.record.get('definition')[this.fieldType + 'Config'].value
	            : null;
	
	        if (this.record.id != 0 && configValue) {
	            this[this.fieldType + 'Store'].setValue(configValue);
	        }
	
	        return this[this.fieldType + 'Store'];
	    },
	    
	    /**
	     * Create store for record field
	     * 
	     * @returns {Ext.Panel}
	     */
	    initRecordStore: function () {
	        Tine.log.info('Initialize record store config');
	        
	        var self = this;
	               
	        this[this.fieldType + 'Store'] = new Ext.FormPanel({
	            labelAlign: 'top',
	            frame: true,
	            border: false,
	            defaults: {anchor: '100%'},
	            bodyStyle: 'padding: 15px',
	            items:[{
	                xtype: 'combo',
	                store: this.appStore,
	                name: 'application_id',
	                displayField: 'name',
	                valueField: 'id',
	                fieldLabel: this.app.i18n._('Application'),
	                mode: 'local',
	                forceSelection: true,
	                editable: false,
	                listeners: {
	                    scope: this,
	                    'select': function (combo, rec) {
	                        // load combo with found models for selected application
	                        this[this.fieldType + 'Store'].items.get(1).store.loadData(this.getApplicationModels(rec, false));
	                    }
	                }
	            }, {
	                xtype: 'combo',
	                store: new Ext.data.ArrayStore({
	                    idIndex: 0,  
	                    fields: ['recordClass', 'recordName']
	                }),
	                name: 'recordClass',
	                displayField: 'recordName',
	                valueField: 'recordClass',
	                fieldLabel: this.app.i18n._('Record Class'),
	                mode: 'local',
	                forceSelection: false,
	                editable: true,
	                allowBlank: false
	            }],
	            setValue: function (data) {
	                var parts = data.split('.'), // e.g Tine.Admin.Model.Group
	                    app   = Tine.Tinebase.appMgr.get(parts[1]);
	                
	                // set value for application combo
	                this.items.get(0).setValue(app.id);
	                
	                // load records based on application combo and set value
	                this.items.get(1).store.loadData(self.getApplicationModels(app.appName, false));
	                this.items.get(1).setValue(data);
	                
	            },
	            getValue: function () {
	                return this.items.get(1).getValue();
	            },
	            isValid: function () {
	                try {
	                    var model = eval(this.items.get(1).getValue());
	                } catch (e) {
	                    Ext.Msg.alert(i18n._('Errors'), self.app.i18n._('Given record class not found'));
	                    return false;
	                }
	                
	                return true;
	            }
	        });
	        
	        /**
	         * Load values if exists in field definition
	         */
	        var configValue = ! Ext.isEmpty(this.record.get('definition')) && this.record.get('definition')[this.fieldType + 'Config'] 
	            ? this.record.get('definition')[this.fieldType + 'Config'].value 
	            : null;
	            
	        if (this.record.id != 0 && configValue) {
	            this[this.fieldType + 'Store'].setValue(configValue.records);
	        }
	        
	        return this[this.fieldType + 'Store'];
	    },
	
	    initRecordListStore: function () {
	        return this.initRecordStore();
	    },
	    
	    /**
	     * Show window for configuring field store
	     */
	    showStoreWindow: function () {
	        this.storeWindow = Tine.WindowFactory.getWindow({
	            modal: true, // this needs to be modal atm, popup does not work due to issues with this in tineInit.js
	            width: 500,
	            height: 320,
	            border: false,
	            items: this['init' + (this.fieldType.charAt(0).toUpperCase() + this.fieldType.substr(1)) + 'Store'](),
	            fbar: ['->', {
	                text: i18n._('Cancel'),
	                minWidth: 70,
	                scope: this,
	                handler: this.onStoreWindowClose,
	                iconCls: 'action_cancel'
	            }, {
	                text: i18n._('OK'),
	                minWidth: 70,
	                scope: this,
	                handler: this.onStoreWindowOK,
	                iconCls: 'action_applyChanges'
	            }]
	        });
	    },
	    
	    /**
	     * returns dialog
	     */
	    getFormItems: function () {
	        this.appStore = new Ext.data.JsonStore({
	            root: 'results',
	            totalProperty: 'totalcount',
	            fields: Tine.Admin.Model.Application
	        });
	
	        this.appStore.loadData({
	            results:    Tine.Tinebase.registry.get('userApplications'),
	            totalcount: Tine.Tinebase.registry.get('userApplications').length
	        });
	
	        this.appStore.each(function (app) {
	            if (this.getApplicationModels(app, true).length == 0) {
	                this.appStore.remove(app);
	                return;
	            }
	
	            var curApp =  Tine.Tinebase.appMgr.get(app.get('name'));
	            var curTitle = curApp ? curApp.getTitle() : '';
	
	            app.set('i18nName', curTitle);
	        }, this);
	
	        this.modelStore = new Ext.data.ArrayStore({
	            idIndex: 0,
	            fields: [{name: 'value'}, {name: 'name'}]
	        });
	
	        this.configureStoreBtn = new Ext.Button({
	            columnWidth: 0.4,
	            fieldLabel: '&#160;',
	            xtype: 'button',
	            iconCls: 'admin-node-customfields-store',
	            text: this.app.i18n._('Configure store'),
	            disabled: this.record.id == 0 || this.fieldsWithStore.indexOf(this.record.get('definition').type) === -1,
	            scope: this,
	            handler: this.showStoreWindow
	        });
	
	        return {
	            layout: 'vbox',
	            layoutConfig: {
	                align: 'stretch',
	                pack: 'start'
	            }, 
	            border: false,
	            items: [{
	                xtype: 'columnform',
	                border: false,
	                autoHeight: true,
	                items: [[{
	                    xtype: 'combo',
	                    readOnly: this.record.id != 0,
	                    store: this.appStore,
	                    columnWidth: 0.5,
	                    name: 'application_id',
	                    displayField: 'i18nName',
	                    valueField: 'id',
	                    scope: this,
	                    fieldLabel: this.app.i18n._('Application'),
	                    mode: 'local',
	                    anchor: '100%',
	                    allowBlank: false,
	                    forceSelection: true,
	                    editable: false,
	                    listeners: {
	                        scope: this,
	                        'select': function (combo, rec) {
	                            // add models for select application
	                            this.modelStore.loadData(this.getApplicationModels(rec, true));
	                            Ext.getCmp('cfModelCombo').setValue(this.modelStore.getAt(0).get('value'));
	                        }
	                    }
	                }, {
	                    xtype: 'combo',
	                    readOnly: this.record.id != 0,
	                    store: this.modelStore,
	                    columnWidth: 0.5,
	                    name: 'model',
	                    displayField: 'name',
	                    valueField: 'value',
	                    fieldLabel: this.app.i18n._('Model'),
	                    mode: 'local',
	                    anchor: '100%',
	                    allowBlank: false,
	                    forceSelection: true,
	                    editable: false,
	                    id: 'cfModelCombo'
	                }]]
	            }, {
	                xtype: 'fieldset',
	                bodyStyle: 'padding: 5px',
	                margins: {top: 5, right: 0, bottom: 0, left: 0},
	                title: this.app.i18n._('Custom field definition'),
	                labelAlign: 'top',
	                defaults: {anchor: '100%'},
	                items: [{
	                    xtype: 'columnform',
	                    border: false,
	                    items: [[{
	                        columnWidth: 0.6,
	                        xtype: 'combo',
	                        readOnly: this.record.id != 0,
	                        store: [
	                            ['string', this.app.i18n._('Text')],
	                            ['textarea', this.app.i18n._('Textarea')],
	                            ['integer', this.app.i18n._('Number')],
	                            ['date', this.app.i18n._('Date')],
	                            ['datetime', this.app.i18n._('DateTime')],
	                            ['time', this.app.i18n._('Time')],
	                            ['boolean', this.app.i18n._('Boolean')],
	                            ['searchcombo', this.app.i18n._('Search Combo')],
	                            ['keyField', this.app.i18n._('Key Field')],
	                            ['record', this.app.i18n._('Record')],
	                            ['recordList', this.app.i18n._('Record List')]
	                        ],
	                        name: 'type',
	                        fieldLabel: this.app.i18n._('Type'),
	                        mode: 'local',
	                        allowBlank: false,
	                        editable: false,
	                        forceSelection: true,
	                        listeners: {
	                            scope: this,
	                            'select': this.onTypeComboSelect
	                        }
	                    }, this.configureStoreBtn]]
	                }, {
	                    xtype: 'textfield',
	                    fieldLabel: this.app.i18n._('Name'), 
	                    name: 'name',
	                    allowBlank: false,
	                    maxLength: 50
	                }, {
	                    xtype: 'textfield',
	                    fieldLabel: this.app.i18n._('Label'), 
	                    name: 'label',
	                    allowBlank: false,
	                    maxLength: 50
	                }, {
	                    xtype: 'numberfield',
	                    fieldLabel: this.app.i18n._('Length'),
	                    name: 'length',
	                    disabled: this.record.id == 0 || this.record.get('definition').type !== 'string'
	                }, {
	                    xtype: 'checkbox',
	                    fieldLabel: this.app.i18n._('Required'),
	                    name: 'required'
	                }]
	            }, {
	                xtype: 'fieldset',
	                bodyStyle: 'padding: 5px',
	                margins: {top: 5, right: 0, bottom: 0, left: 0},
	                title: this.app.i18n._('Custom field additional properties'),
	                labelAlign: 'top',
	                defaults: {anchor: '100%'},
	                items: [{
	                    xtype: 'textfield',
	                    fieldLabel: this.app.i18n._('Tab Panel'),
	                    name: 'tab',
	                    maxLength: 50
	                }, {
	                    xtype: 'textfield',
	                    fieldLabel: this.app.i18n._('Group'), 
	                    name: 'group',
	                    maxLength: 50
	                }, {
	                    xtype: 'textfield',
	                    fieldLabel: this.app.i18n._('Order'),
	                    name: 'order',
	                    maxLength: 50
	                }]
	            }, {
	                xtype: 'hidden',
	                name: 'value_search',
	                value: 0
	            }]
	        };
	    },
	    
	    /**
	     * is form valid?
	     * 
	     * @return {Boolean}
	     */
	    isValid: function() {
	        var result = Tine.Admin.UserEditDialog.superclass.isValid.call(this);
	
	        if (! this.record.id && this.customFieldExists()) {
	            result = false;
	            this.getForm().markInvalid([{
	                id: 'name',
	                msg: this.app.i18n._("Customfield already exists. Please choose another name.")
	            }]);
	        }
	        
	        return result;
	    },
	    
	    /**
	     * check if customfield name already exists for this app
	     * 
	     * @return {Boolean}
	     */
	    customFieldExists: function() {
	        var applicationField = this.getForm().findField('application_id'),
	            store = applicationField.getStore(),
	            app = store.getById(applicationField.getValue()),
	            cfName = this.getForm().findField('name').getValue(),
	            cfExists = false;
	        
	        if (app && cfName) {
	            var customfieldsOfApp = Tine[app.get('name')].registry.get('customfields');
	            Ext.each(customfieldsOfApp, function(cfConfig) {
	                if (cfName === cfConfig.name) {
	                    cfExists = true;
	                }
	            }, this);
	        }
	        
	        return cfExists;
	    }
	});
	
	/**
	 * Customfield Edit Popup
	 * 
	 * @param   {Object} config
	 * @return  {Ext.ux.Window}
	 */
	Tine.Admin.CustomfieldEditDialog.openWindow = function (config) {
	    var window = Tine.WindowFactory.getWindow({
	        width: 500,
	        height: 500,
	        name: Tine.Admin.CustomfieldEditDialog.prototype.windowNamePrefix + Ext.id(),
	        contentPanelConstructor: 'Tine.Admin.CustomfieldEditDialog',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};


/***/ },

/***/ 237:
/***/ 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) 2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	Ext.ns('Tine.Admin.customfield');
	
	
	/**
	 * Customfield grid panel
	 * 
	 * @namespace   Tine.Admin.customfield
	 * @class       Tine.Admin.customfield.GridPanel
	 * @extends     Tine.widgets.grid.GridPanel
	 */
	Tine.Admin.customfield.GridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
	    
	    /**
	     * @cfg
	     */
	    newRecordIcon: 'admin-action-add-customfield',
	    recordClass: Tine.Admin.Model.Customfield,
	    recordProxy: Tine.Admin.customfieldBackend,
	    defaultSortInfo: {field: 'name', direction: 'ASC'},
	    evalGrants: false,
	    copyEditAction: true,
	    gridConfig: {
	        autoExpandColumn: 'name'
	    },
	    
	    /**
	     * initComponent
	     */
	    initComponent: function() {
	        this.gridConfig.cm = this.getColumnModel();
	        Tine.Admin.customfield.GridPanel.superclass.initComponent.call(this);
	    },
	    
	    /**
	     * returns column model
	     * 
	     * @return Ext.grid.ColumnModel
	     * @private
	     */
	    getColumnModel: function() {
	        return new Ext.grid.ColumnModel({
	            defaults: {
	                sortable: true,
	                hidden: true,
	                resizable: true
	            },
	            columns: this.getColumns()
	        });
	    },
	    
	    /**
	     * returns columns
	     * @private
	     * @return Array
	     */
	    getColumns: function(){
	        return [
	            { header: this.app.i18n._('ID'), id: 'id', dataIndex: 'id', width: 50},
	            { header: this.app.i18n._('Label'), id: 'label', dataIndex: 'definition', hidden: false, width: 100, renderer: this.labelRenderer.createDelegate(this)},
	            { header: this.app.i18n._('Name'), id: 'name', dataIndex: 'name', hidden: false, width: 75},
	            { header: this.app.i18n._('Type'), id: 'xtype', dataIndex: 'definition', hidden: false, width: 75, renderer: this.typeRenderer.createDelegate(this)},
	            { header: this.app.i18n._('Application'), id: 'application_id', dataIndex: 'application_id', hidden: false, width: 100, renderer: this.appRenderer.createDelegate(this)},
	            { header: this.app.i18n._('Model'), id: 'model', dataIndex: 'model', hidden: false, width: 100}
	        ];
	    },
	    
	    /**
	     * returns label name
	     * 
	     * @param {Object} value
	     * @return {String}
	     */
	    labelRenderer: function(value) {
	        return this.app.i18n._(value.label);
	    },
	    
	    /**
	     * returns type name
	     * 
	     * @param {Object} value
	     * @return {String}
	     */
	    typeRenderer: function(value) {
	        return this.app.i18n._(value.type);
	    },
	    
	    /**
	     * returns application name
	     * 
	     * @param {Object} value
	     * @return {String}
	     */
	    appRenderer: function(value) {
	        return this.app.i18n._(value.name);
	    },
	       
	    /**
	     * initialises filter toolbar
	     */
	    initFilterPanel: function() {
	        this.filterToolbar = new Tine.widgets.grid.FilterToolbar({
	            filterModels: [
	                {label: this.app.i18n._('Customfield'),       field: 'query',    operators: ['contains']},
	                {filtertype: 'admin.application', app: this.app}
	            ],
	            defaultFilter: 'query',
	            filters: [
	            ],
	            plugins: [
	                new Tine.widgets.grid.FilterToolbarQuickFilterPlugin()
	            ]
	        });
	        this.plugins = this.plugins || [];
	        this.plugins.push(this.filterToolbar);
	    },
	    
	    /**
	     * on update after edit
	     * 
	     * @param {String|Tine.Tinebase.data.Record} record
	     */
	    onUpdateRecord: function (record) {
	        Tine.Admin.customfield.GridPanel.superclass.onUpdateRecord.apply(this, arguments);
	        
	        Tine.Tinebase.common.confirmApplicationRestart();
	    },
	    
	    /**
	     * do something after deletion of records
	     * - reload the store
	     * 
	     * @param {Array} [ids]
	     */
	    onAfterDelete: function (ids) {
	        Tine.Admin.customfield.GridPanel.superclass.onAfterDelete.apply(this, arguments);
	        
	        Tine.Tinebase.common.confirmApplicationRestart();
	    },
	    
	    deleteRecords: function(sm, records) {
	        // directly remove records from the store (only for non-filter-selection)
	        if (Ext.isArray(records)) {
	            Ext.each(records, function(record) {
	                this.store.remove(record);
	            });
	            // if nested in an editDialog, just change the parent record
	            if (this.editDialog) {
	                var items = [];
	                this.store.each(function(item) {
	                    items.push(item.data);
	                });
	                this.editDialog.record.set(this.editDialogRecordProperty, items);
	                this.editDialog.fireEvent('updateDependent');
	                return;
	            }
	        }
	
	        if (this.recordProxy) {
	            if (this.usePagingToolbar) {
	                this.pagingToolbar.refresh.disable();
	            }
	
	            var i18nItems = this.app.i18n.n_hidden(this.recordClass.getMeta('recordName'), this.recordClass.getMeta('recordsName'), records.length),
	                recordIds = [].concat(records).map(function(v){ return v.id; });
	
	            this.deleteQueue = this.deleteQueue.concat(recordIds);
	
	            var options = {
	                scope: this,
	                success: function() {
	                    this.refreshAfterDelete(recordIds);
	                    this.onAfterDelete(recordIds);
	                },
	                failure: function (exception) {
	                    if (exception.code == 703) {
	                        Ext.Msg.confirm(this.app.i18n._('This custom field is still in use!'),
	                            this.app.i18n._('Are you sure you want to delete them?'),
	                            function(btn) {
	                                if (btn == 'yes') {
	                                    this.recordProxy.deleteRecords(records, options, {'context': { 'skipUsageCheck': true }});
	                                } else {
	                                    this.refreshAfterDelete(recordIds);
	                                    this.loadGridData();
	                                }
	                            }, this);
	                    } else {
	                        this.refreshAfterDelete(recordIds);
	                        this.loadGridData();
	                        Tine.Tinebase.ExceptionHandler.handleRequestException(exception);
	                    }
	                }
	            };
	        
	        this.recordProxy.deleteRecords(records, options);
	        }
	    }
	});


/***/ },

/***/ 238:
/***/ 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) 2009-2012 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	 
	/*global Ext, Tine*/
	
	Ext.ns('Tine.Admin.user');
	
	/**
	 * @namespace   Tine.Admin.user
	 * @class       Tine.Admin.UserEditDialog
	 * @extends     Tine.widgets.dialog.EditDialog
	 * 
	 * NOTE: this class dosn't use the user namespace as this is not yet supported by generic grid
	 * 
	 * <p>User Edit Dialog</p>
	 * <p>
	 * </p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Admin.UserEditDialog
	 */
	Tine.Admin.UserEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog, {
	    
	    /**
	     * @private
	     */
	    windowNamePrefix: 'userEditWindow_',
	    appName: 'Admin',
	    recordClass: Tine.Admin.Model.User,
	    recordProxy: Tine.Admin.userBackend,
	    evalGrants: false,
	    
	    /**
	     * @private
	     */
	    initComponent: function () {
	        var accountBackend = Tine.Tinebase.registry.get('accountBackend');
	        this.ldapBackend = (accountBackend === 'Ldap' || accountBackend === 'ActiveDirectory');
	
	        Tine.Admin.UserEditDialog.superclass.initComponent.call(this);
	    },
	
	    /**
	     * @private
	     */
	    onRecordLoad: function () {
	        // interrupt process flow until dialog is rendered
	        if (! this.rendered) {
	            this.onRecordLoad.defer(250, this);
	            return;
	        }
	        
	        // samba user
	        var response = {
	            responseText: Ext.util.JSON.encode(this.record.get('sambaSAM'))
	        };
	        this.samRecord = Tine.Admin.samUserBackend.recordReader(response);
	        // email user
	        var emailResponse = {
	            responseText: Ext.util.JSON.encode(this.record.get('emailUser'))
	        };
	        this.emailRecord = Tine.Admin.emailUserBackend.recordReader(emailResponse);
	        
	        // format dates
	        var dateTimeDisplayFields = ['accountLastLogin', 'accountLastPasswordChange', 'logonTime', 'logoffTime', 'pwdLastSet'];
	        for (var i = 0; i < dateTimeDisplayFields.length; i += 1) {
	            if (dateTimeDisplayFields[i] === 'accountLastLogin' || dateTimeDisplayFields[i] === 'accountLastPasswordChange') {
	                this.record.set(dateTimeDisplayFields[i], Tine.Tinebase.common.dateTimeRenderer(this.record.get(dateTimeDisplayFields[i])));
	            } else {
	                this.samRecord.set(dateTimeDisplayFields[i], Tine.Tinebase.common.dateTimeRenderer(this.samRecord.get(dateTimeDisplayFields[i])));
	            }
	        }
	
	        this.getForm().loadRecord(this.emailRecord);
	        this.getForm().loadRecord(this.samRecord);
	        this.record.set('sambaSAM', this.samRecord.data);
	
	        if (Tine.Admin.registry.get('manageSmtpEmailUser')) {
	            if (this.emailRecord.get('emailAliases')) {
	                this.aliasesGrid.setStoreFromArray(this.emailRecord.get('emailAliases'));
	            }
	            if (this.emailRecord.get('emailForwards')) {
	                this.forwardsGrid.setStoreFromArray(this.emailRecord.get('emailForwards'));
	            }
	        }
	        if (Tine.Admin.registry.get('manageImapEmailUser')) {
	            if (!this.emailRecord.get('emailMailQuota')) this.getForm().findField('emailMailQuota').setValue(null);
	        }
	
	        // load stores for memberships
	        if (this.record.id) {
	            this.storeGroups.loadData(this.record.get('groups'));
	            this.storeRoles.loadData(this.record.get('accountRoles'));
	        }
	        
	        Tine.Admin.UserEditDialog.superclass.onRecordLoad.call(this);
	    },
	    
	    /**
	     * @private
	     */
	    onRecordUpdate: function () {
	        Tine.Admin.UserEditDialog.superclass.onRecordUpdate.call(this);
	        
	        Tine.log.debug('Tine.Admin.UserEditDialog::onRecordUpdate()');
	        
	        var form = this.getForm();
	        form.updateRecord(this.samRecord);
	        if (this.samRecord.dirty) {
	            // only update sam record if something changed
	            this.unsetLocalizedDateTimeFields(this.samRecord, ['logonTime', 'logoffTime', 'pwdLastSet']);
	            this.record.set('sambaSAM', '');
	            this.record.set('sambaSAM', this.samRecord.data);
	        }
	
	        form.updateRecord(this.emailRecord);
	        // get aliases / forwards
	        if (Tine.Admin.registry.get('manageSmtpEmailUser')) {
	            // forcing blur of quickadd grids
	            this.aliasesGrid.doBlur();
	            this.forwardsGrid.doBlur();
	            this.emailRecord.set('emailAliases', this.aliasesGrid.getFromStoreAsArray());
	            this.emailRecord.set('emailForwards', this.forwardsGrid.getFromStoreAsArray());
	            Tine.log.debug('Tine.Admin.UserEditDialog::onRecordUpdate() -> setting aliases and forwards in email record');
	            Tine.log.debug(this.emailRecord);
	        }
	        this.unsetLocalizedDateTimeFields(this.emailRecord, ['emailLastLogin']);
	        this.record.set('emailUser', '');
	        this.record.set('emailUser', this.emailRecord.data);
	        
	        var newGroups = [],
	            newRoles = [];
	        
	        this.storeGroups.each(function (rec) {
	            newGroups.push(rec.data.id);
	        });
	        // add selected primary group to new groups if not exists
	        if (newGroups.indexOf(this.record.get('accountPrimaryGroup')) === -1) {
	            newGroups.push(this.record.get('accountPrimaryGroup'));
	        }
	         
	        this.storeRoles.each(function (rec) {
	            newRoles.push(rec.data.id);
	        });
	        
	        this.record.set('groups', newGroups);
	        this.record.set('accountRoles', newRoles);
	        
	        this.unsetLocalizedDateTimeFields(this.record, ['accountLastLogin', 'accountLastPasswordChange']);
	    },
	    
	    /**
	     * need to unset localized datetime fields before saving
	     * 
	     * @param {Object} record
	     * @param {Array} dateTimeDisplayFields
	     */
	    unsetLocalizedDateTimeFields: function(record, dateTimeDisplayFields) {
	        Ext.each(dateTimeDisplayFields, function (dateTimeDisplayField) {
	            record.set(dateTimeDisplayField, '');
	        }, this);
	    },
	
	    /**
	     * is form valid?
	     * 
	     * @return {Boolean}
	     */
	    isValid: function() {
	        var result = Tine.Admin.UserEditDialog.superclass.isValid.call(this);
	        if (! result) {
	            return false;
	        }
	        
	        if (Tine.Admin.registry.get('manageSmtpEmailUser')) {
	            var emailValue = this.getForm().findField('accountEmailAddress').getValue();
	            if (! this.checkEmailDomain(emailValue)) {
	                result = false;
	                this.getForm().markInvalid([{
	                    id: 'accountEmailAddress',
	                    msg: this.app.i18n._("Domain is not allowed. Check your SMTP domain configuration.")
	                }]);
	            }
	        }
	        
	        return result;
	    },
	    
	    /**
	     * check valid email domain (if email domain is set in config)
	     * 
	     * @param {String} email
	     * @return {Boolean}
	     * 
	     * TODO use this for smtp aliases, too
	     */
	    checkEmailDomain: function(email) {
	        if (! Tine.Admin.registry.get('primarydomain') || ! email) {
	            return true;
	        }
	        
	        var allowedDomains = [Tine.Admin.registry.get('primarydomain')],
	            emailDomain = email.split('@')[1];
	            
	        if (Ext.isString(Tine.Admin.registry.get('secondarydomains'))) {
	            allowedDomains = allowedDomains.concat(Tine.Admin.registry.get('secondarydomains').split(','));
	        }
	        
	        return (allowedDomains.indexOf(emailDomain) !== -1);
	    },
	    
	    /**
	     * Validate confirmed password
	     */
	    onPasswordConfirm: function () {
	        var confirmForm = this.passwordConfirmWindow.items.first().getForm(),
	            confirmValues = confirmForm.getValues(),
	            passwordStatus = confirmForm.findField('passwordStatus'),
	            passwordField = (this.getForm()) ? this.getForm().findField('accountPassword') : null;
	        
	        if (! passwordField) {
	            // oops: something went wrong, this should not happen
	            return false;
	        }
	        
	        if (confirmValues.passwordRepeat !== passwordField.getValue()) {
	            passwordStatus.el.setStyle('color', 'red');
	            passwordStatus.setValue(this.app.i18n.gettext('Passwords do not match!'));
	            
	            passwordField.passwordsMatch = false;
	            passwordField.markInvalid(this.app.i18n.gettext('Passwords do not match!'));
	        } else {
	            passwordStatus.el.setStyle('color', 'green');
	            passwordStatus.setValue(this.app.i18n.gettext('Passwords match!'));
	                        
	            passwordField.passwordsMatch = true;
	            passwordField.clearInvalid();
	        }
	        
	        return passwordField.passwordsMatch ? passwordField.passwordsMatch : passwordStatus.getValue();
	    },
	    
	    /**
	     * Get current primary group (selected from combobox or default primary group)
	     * 
	     * @return {String} - id of current primary group
	     */
	    getCurrentPrimaryGroupId: function () {
	        return this.getForm().findField('accountPrimaryGroup').getValue() || this.record.get('accountPrimaryGroup').id;
	    },
	    
	    /**
	     * Init User groups picker grid
	     * 
	     * @return {Tine.widgets.account.PickerGridPanel}
	     */
	    initUserGroups: function () {
	        this.storeGroups = new Ext.data.JsonStore({
	            root: 'results',
	            totalProperty: 'totalcount',
	            id: 'id',
	            fields: Tine.Admin.Model.Group
	        });
	        
	        var self = this;
	        
	        this.pickerGridGroups = new Tine.widgets.account.PickerGridPanel({
	            border: false,
	            frame: false,
	            store: this.storeGroups,
	            selectType: 'group',
	            selectAnyone: false,
	            selectTypeDefault: 'group',
	            groupRecordClass: Tine.Admin.Model.Group,
	            getColumnModel: function () {
	                return new Ext.grid.ColumnModel({
	                    defaults: { sortable: true },
	                    columns:  [
	                        {id: 'name', header: i18n._('Name'), dataIndex: this.recordPrefix + 'name', renderer: function (val, meta, record) {
	                            return record.data.id === self.getCurrentPrimaryGroupId() ? (record.data.name + '<span class="x-item-disabled"> (' + self.app.i18n.gettext('Primary group') + ')<span>') : record.data.name;
	                        }}
	                    ]
	                });
	            }
	        });
	        // disable remove of group if equal to current primary group
	        this.pickerGridGroups.selModel.on('beforerowselect', function (sm, index, keep, record) {
	            if (record.data.id === this.getCurrentPrimaryGroupId()) {
	                return false;
	            }
	        }, this);
	        
	        return this.pickerGridGroups;
	    },
	    
	    /**
	     * Init User roles picker grid
	     * 
	     * @return {Tine.widgets.account.PickerGridPanel}
	     */
	    initUserRoles: function () {
	        this.storeRoles = new Ext.data.JsonStore({
	            root: 'results',
	            totalProperty: 'totalcount',
	            id: 'id',
	            fields: Tine.Tinebase.Model.Role
	        });
	        
	        this.pickerGridRoles = new Tine.widgets.grid.PickerGridPanel({
	            border: false,
	            frame: false,
	            autoExpandColumn: 'name',
	            store: this.storeRoles,
	            recordClass: Tine.Tinebase.Model.Role,
	            columns: [{id: 'name', header: i18n.gettext('Name'), sortable: true, dataIndex: 'name'}],
	            initActionsAndToolbars: function () {
	                // for now removed abillity to edit role membership
	//                Tine.widgets.grid.PickerGridPanel.prototype.initActionsAndToolbars.call(this);
	//                
	//                this.comboPanel = new Ext.Container({
	//                    layout: 'hfit',
	//                    border: false,
	//                    items: this.getSearchCombo(),
	//                    columnWidth: 1
	//                });
	//                
	//                this.tbar = new Ext.Toolbar({
	//                    items: this.comboPanel,
	//                    layout: 'column'
	//                });
	            },
	            onAddRecordFromCombo: function (recordToAdd) {
	                // check if already in
	                if (! this.recordStore.getById(recordToAdd.id)) {
	                    this.recordStore.add([recordToAdd]);
	                }
	                this.collapse();
	                this.clearValue();
	                this.reset();
	            }
	        });
	        // remove listeners for this grid selection model
	        this.pickerGridRoles.selModel.purgeListeners();
	        
	        return this.pickerGridRoles;
	    },
	    
	    /**
	     * Init Fileserver tab items
	     * 
	     * @return {Array} - array ff fileserver tab items
	     */
	    initFileserver: function () {
	        if (this.ldapBackend) {
	            return [{
	                xtype: 'fieldset',
	                title: this.app.i18n.gettext('Unix'),
	                autoHeight: true,
	                checkboxToggle: false,
	                layout: 'hfit',
	                items: [{
	                    xtype: 'columnform',
	                    labelAlign: 'top',
	                    formDefaults: {
	                        xtype: 'textfield',
	                        anchor: '100%',
	                        labelSeparator: '',
	                        columnWidth: 0.333
	                    },
	                    items: [[{
	                        fieldLabel: this.app.i18n.gettext('Home Directory'),
	                        name: 'accountHomeDirectory',
	                        columnWidth: 0.666
	                    }, {
	                        fieldLabel: this.app.i18n.gettext('Login Shell'),
	                        name: 'accountLoginShell'
	                    }]]
	                }]
	            }, {
	                xtype: 'fieldset',
	                title: this.app.i18n.gettext('Windows'),
	                autoHeight: true,
	                checkboxToggle: false,
	                layout: 'hfit',
	                items: [{
	                    xtype: 'columnform',
	                    labelAlign: 'top',
	                    formDefaults: {
	                        xtype: 'textfield',
	                        anchor: '100%',
	                        labelSeparator: '',
	                        columnWidth: 0.333
	                    },
	                    items: [[{
	                        fieldLabel: this.app.i18n.gettext('Home Drive'),
	                        name: 'homeDrive',
	                        columnWidth: 0.666
	                    }, {
	                        xtype: 'displayfield',
	                        fieldLabel: this.app.i18n.gettext('Logon Time'),
	                        name: 'logonTime',
	                        emptyText: this.app.i18n.gettext('never logged in'),
	                        style: this.displayFieldStyle
	                    }], [{
	                        fieldLabel: this.app.i18n.gettext('Home Path'),
	                        name: 'homePath',
	                        columnWidth: 0.666
	                    }, {
	                        xtype: 'displayfield',
	                        fieldLabel: this.app.i18n.gettext('Logoff Time'),
	                        name: 'logoffTime',
	                        emptyText: this.app.i18n.gettext('never logged off'),
	                        style: this.displayFieldStyle
	                    }], [{
	                        fieldLabel: this.app.i18n.gettext('Profile Path'),
	                        name: 'profilePath',
	                        columnWidth: 0.666
	                    }, {
	                        xtype: 'displayfield',
	                        fieldLabel: this.app.i18n.gettext('Password Last Set'),
	                        name: 'pwdLastSet',
	                        emptyText: this.app.i18n.gettext('never'),
	                        style: this.displayFieldStyle
	                    }], [{
	                        fieldLabel: this.app.i18n.gettext('Logon Script'),
	                        name: 'logonScript',
	                        columnWidth: 0.666
	                    }], [{
	                        xtype: 'extuxclearabledatefield',
	                        fieldLabel: this.app.i18n.gettext('Password Can Change'),
	                        name: 'pwdCanChange',
	                        emptyText: this.app.i18n.gettext('not set')
	                    }, {
	                        xtype: 'extuxclearabledatefield',
	                        fieldLabel: this.app.i18n.gettext('Password Must Change'),
	                        name: 'pwdMustChange',
	                        emptyText: this.app.i18n.gettext('not set')
	                    }, {
	                        xtype: 'extuxclearabledatefield',
	                        fieldLabel: this.app.i18n.gettext('Kick Off Time'),
	                        name: 'kickoffTime',
	                        emptyText: this.app.i18n.gettext('not set')
	                    }]]
	                }]
	            }];
	        }
	        
	        return [];
	    },
	    
	    /**
	     * Init IMAP tab items
	     * 
	     * @return {Array} - array of IMAP tab items
	     */
	    initImap: function () {
	        if (Tine.Admin.registry.get('manageImapEmailUser')) {
	            return [{
	                xtype: 'fieldset',
	                title: this.app.i18n.gettext('IMAP Quota (MB)'),
	                autoHeight: true,
	                checkboxToggle: true,
	                layout: 'hfit',
	                listeners: {
	                    scope: this,
	                    collapse: function() {
	                        this.getForm().findField('emailMailQuota').setValue(null);
	                    }
	                },
	                items: [{
	                    xtype: 'columnform',
	                    labelAlign: 'top',
	                    formDefaults: {
	                        xtype: 'textfield',
	                        anchor: '100%',
	                        columnWidth: 0.666
	                    },
	                    items: [[{
	                        fieldLabel: this.app.i18n.gettext('Quota'),
	                        emptyText: this.app.i18n.gettext('no quota set'),
	                        name: 'emailMailQuota',
	                        xtype: 'uxspinner',
	                        strategy: new Ext.ux.form.Spinner.NumberStrategy({
	                            incrementValue : 10,
	                            alternateIncrementValue: 50,
	                            minValue: 0,
	                            allowDecimals : false
	                        })
	                    }], [{
	                        fieldLabel: this.app.i18n.gettext('Current Mailbox size'),
	                        name: 'emailMailSize',
	                        xtype: 'displayfield',
	                        style: this.displayFieldStyle
	                    }]]
	                }]
	            }, {
	                xtype: 'fieldset',
	                title: this.app.i18n.gettext('Sieve Quota (MB)'),
	                autoHeight: true,
	                checkboxToggle: true,
	                layout: 'hfit',
	                listeners: {
	                    scope: this,
	                    collapse: function() {
	                        this.getForm().findField('emailSieveQuota').setValue(null);
	                    }
	                },
	                items: [{
	                    xtype: 'columnform',
	                    labelAlign: 'top',
	                    formDefaults: {
	                        xtype: 'textfield',
	                        anchor: '100%',
	                        columnWidth: 0.666
	                    },
	                    items: [[{
	                        fieldLabel: this.app.i18n.gettext('Quota'),
	                        emptyText: this.app.i18n.gettext('no quota set'),
	                        name: 'emailSieveQuota',
	                        xtype: 'uxspinner',
	                        strategy: new Ext.ux.form.Spinner.NumberStrategy({
	                            incrementValue : 10,
	                            alternateIncrementValue: 50,
	                            minValue: 0,
	                            allowDecimals : false
	                        })
	                    }], [{
	                        fieldLabel: this.app.i18n.gettext('Current Sieve size'),
	                        name: 'emailSieveSize',
	                        xtype: 'displayfield',
	                        style: this.displayFieldStyle
	                    }]
	                    ]
	                }]
	            }, {
	                xtype: 'fieldset',
	                title: this.app.i18n.gettext('Information'),
	                autoHeight: true,
	                checkboxToggle: false,
	                layout: 'hfit',
	                items: [{
	                    xtype: 'columnform',
	                    labelAlign: 'top',
	                    formDefaults: {
	                        xtype: 'displayfield',
	                        anchor: '100%',
	                        columnWidth: 0.666,
	                        style: this.displayFieldStyle
	                    },
	                    items: [[{
	                        fieldLabel: this.app.i18n.gettext('Last Login'),
	                        name: 'emailLastLogin'
	                    }]]
	                }]
	            }];
	        }
	        
	        return [];
	    },
	    
	    /**
	     * @private
	     * 
	     * init email grids
	     * @return Array
	     * 
	     * TODO     add ctx menu
	     */
	    initSmtp: function () {
	        if (! Tine.Admin.registry.get('manageSmtpEmailUser')) {
	            return [];
	        }
	        
	        var commonConfig = {
	            autoExpandColumn: 'email',
	            quickaddMandatory: 'email',
	            frame: false,
	            useBBar: true,
	            dataField: 'email',
	            height: 200,
	            columnWidth: 0.5,
	            recordClass: Ext.data.Record.create([
	                { name: 'email' }
	            ])
	        };
	        
	        // TODO how to fetch smtp config if Felamimail isn't installed?
	        var smtpPrimarydomain = Tine.Admin.registry.get('primarydomain');
	        var smtpSecondarydomains = Tine.Admin.registry.get('secondarydomains');
	
	        var domains = (smtpSecondarydomains && smtpSecondarydomains.length) ? smtpSecondarydomains.split(',') : [];
	        if (smtpPrimarydomain.length) {
	            domains.push(smtpPrimarydomain);
	        }
	        var app = this.app,
	            record = this.record;
	            
	        this.aliasesGrid = new Tine.widgets.grid.QuickaddGridPanel(
	            Ext.apply({
	                onNewentry: function(value) {
	                    var split = value.email ? value.email.split('@') : [];
	                    if (split.length != 2 || split[1].split('.').length < 2) {
	                        return false;
	                    }
	                    var domain = split[1];
	                    if (domains.indexOf(domain) > -1) {
	                        Tine.widgets.grid.QuickaddGridPanel.prototype.onNewentry.call(this, value);
	                    } else {
	                        Ext.MessageBox.show({
	                            buttons: Ext.Msg.OK,
	                            icon: Ext.MessageBox.WARNING,
	                            title: app.i18n._('Domain not allowed'),
	                            msg: String.format(app.i18n._('The domain {0} of the alias {1} you tried to add is neither configured as primary domain nor set as a secondary domain in the setup.'
	                                + ' Please add this domain to the secondary domains in SMTP setup or use another domain which is configured already.'),
	                                '<b>' + domain + '</b>', '<b>' + value.email + '</b>')
	                        });
	                        return false;
	                    }
	                },
	                cm: new Ext.grid.ColumnModel([{
	                    id: 'email', 
	                    header: this.app.i18n.gettext('Email Alias'), 
	                    dataIndex: 'email', 
	                    width: 300, 
	                    hideable: false, 
	                    sortable: true,
	                    quickaddField: new Ext.form.TextField({
	                        emptyText: this.app.i18n.gettext('Add an alias address...'),
	                        vtype: 'email'
	                    }),
	                    editor: new Ext.form.TextField({allowBlank: false})
	                }])
	            }, commonConfig)
	        );
	        this.aliasesGrid.render(document.body);
	        
	        var aliasesStore = this.aliasesGrid.getStore();
	
	        this.forwardsGrid = new Tine.widgets.grid.QuickaddGridPanel(
	            Ext.apply({
	                onNewentry: function(value) {
	                    if (value.email === record.get('accountEmailAddress') || aliasesStore.find('email', value.email) !== -1) {
	                        Ext.MessageBox.show({
	                            buttons: Ext.Msg.OK,
	                            icon: Ext.MessageBox.WARNING,
	                            title: app.i18n._('Forwarding to self'),
	                            msg: app.i18n._('You are not allowed to set a forward email address that is identical to the users primary email or one of his aliases.')
	                        });
	                        return false;
	                    } else {
	                        Tine.widgets.grid.QuickaddGridPanel.prototype.onNewentry.call(this, value);
	                    }
	                },
	                cm: new Ext.grid.ColumnModel([{
	                    id: 'email', 
	                    header: this.app.i18n.gettext('Email Forward'), 
	                    dataIndex: 'email', 
	                    width: 300, 
	                    hideable: false, 
	                    sortable: true,
	                    quickaddField: new Ext.form.TextField({
	                        emptyText: this.app.i18n.gettext('Add a forward address...'),
	                        vtype: 'email'
	                    }),
	                    editor: new Ext.form.TextField({allowBlank: false}) 
	                }])
	            }, commonConfig)
	        );
	        this.forwardsGrid.render(document.body);
	        
	        return [
	            [this.aliasesGrid, this.forwardsGrid],
	            [{hidden: true},
	             {
	                fieldLabel: this.app.i18n.gettext('Forward Only'),
	                name: 'emailForwardOnly',
	                xtype: 'checkbox',
	                readOnly: false
	            }]
	        ];
	    },
	    
	    /**
	     * @private
	     */
	    getFormItems: function () {
	        this.displayFieldStyle = {
	            border: 'silver 1px solid',
	            padding: '3px',
	            height: '11px'
	        };
	        
	        this.passwordConfirmWindow = new Ext.Window({
	            title: this.app.i18n.gettext('Password confirmation'),
	            closeAction: 'hide',
	            modal: true,
	            width: 300,
	            height: 150,
	            items: [{
	                xtype: 'form',
	                bodyStyle: 'padding: 5px;',
	                buttonAlign: 'right',
	                labelAlign: 'top',
	                anchor: '100%',
	                monitorValid: true,
	                defaults: { anchor: '100%' },
	                items: [{
	                    xtype: 'textfield',
	                    inputType: 'password',
	                    id: 'passwordRepeat',
	                    fieldLabel: this.app.i18n.gettext('Repeat password'), 
	                    name: 'passwordRepeat',
	                    validator: this.onPasswordConfirm.createDelegate(this),
	                    listeners: {
	                        scope: this,
	                        specialkey: function (field, event) {
	                            if (event.getKey() === event.ENTER) {
	                                // call OK button handler
	                                this.passwordConfirmWindow.items.first().buttons[1].handler.call(this);
	                            }
	                        }
	                    }
	                }, {
	                    xtype: 'displayfield',
	                    hideLabel: true,
	                    id: 'passwordStatus',
	                    value: this.app.i18n.gettext('Passwords do not match!')
	                }],
	                buttons: [{
	                    text: i18n._('Cancel'),
	                    iconCls: 'action_cancel',
	                    scope: this,
	                    handler: function () {
	                        this.passwordConfirmWindow.hide();
	                    }
	                }, {
	                    text: i18n._('Ok'),
	                    formBind: true,
	                    iconCls: 'action_saveAndClose',
	                    scope: this,
	                    handler: function () {
	                        var confirmForm = this.passwordConfirmWindow.items.first().getForm();
	                        
	                        // check if confirm form is valid (we need this if special key called button handler)
	                        if (confirmForm.isValid()) {
	                            this.passwordConfirmWindow.hide();
	                            // focus email field
	                            this.getForm().findField('accountEmailAddress').focus(true, 100);
	                        }
	                    }
	                }]
	            }],
	            listeners: {
	                scope: this,
	                show: function (win) {
	                    var confirmForm = this.passwordConfirmWindow.items.first().getForm();
	                    
	                    confirmForm.reset();
	                    confirmForm.findField('passwordRepeat').focus(true, 500);
	                }
	            }
	        });
	        this.passwordConfirmWindow.render(document.body);
	        
	        var config = {
	            xtype: 'tabpanel',
	            deferredRender: false,
	            border: false,
	            plain: true,
	            activeTab: 0,
	            items: [{
	                title: this.app.i18n.gettext('Account'),
	                autoScroll: true,
	                border: false,
	                frame: true,
	                layout: 'hfit',
	                items: [{
	                    xtype: 'columnform',
	                    labelAlign: 'top',
	                    formDefaults: {
	                        xtype: 'textfield',
	                        anchor: '100%',
	                        labelSeparator: '',
	                        columnWidth: 0.333
	                    },
	                    items: [[{
	                        fieldLabel: this.app.i18n.gettext('First name'),
	                        name: 'accountFirstName',
	                        columnWidth: 0.5,
	                        tabIndex: 1,
	                        listeners: {
	                            render: function (field) {
	                                field.focus(false, 250);
	                                field.selectText();
	                            }
	                        }
	                    }, {
	                        fieldLabel: this.app.i18n.gettext('Last name'),
	                        name: 'accountLastName',
	                        allowBlank: false,
	                        tabIndex: 2,
	                        columnWidth: 0.5
	                    }], [{
	                        fieldLabel: this.app.i18n.gettext('Login name'),
	                        name: 'accountLoginName',
	                        allowBlank: false,
	                        tabIndex: 3,
	                        columnWidth: 0.5
	                    }, {
	                        fieldLabel: this.app.i18n.gettext('Password'),
	                        id: 'accountPassword',
	                        name: 'accountPassword',
	                        inputType: 'password',
	                        columnWidth: 0.5,
	                        tabIndex: 4,
	                        passwordsMatch: true,
	                        enableKeyEvents: true,
	                        listeners: {
	                            scope: this,
	                            blur: function (field) {
	                                var fieldValue = field.getValue();
	                                if (fieldValue !== '') {
	                                    // show password confirmation
	                                    // NOTE: we can't use Ext.Msg.prompt because field has to be of inputType: 'password'
	                                    this.passwordConfirmWindow.show.defer(100, this.passwordConfirmWindow);
	                                }
	                            },
	                            destroy: function () {
	                                // destroy password confirm window
	                                this.passwordConfirmWindow.destroy();
	                            },
	                            keydown: function (field) {
	                                field.passwordsMatch = false;
	                            }
	                        },
	                        validateValue: function (value) {
	                            return this.passwordsMatch;
	                        }
	                    }], [{
	                        vtype: 'email',
	                        fieldLabel: this.app.i18n.gettext('Email'),
	                        tabIndex: 5,
	                        name: 'accountEmailAddress',
	                        id: 'accountEmailAddress',
	                        columnWidth: 0.5
	                    }, {
	                        //vtype: 'email',
	                        fieldLabel: this.app.i18n.gettext('OpenID'),
	                        emptyText: '(' + this.app.i18n.gettext('Login name') + ')',
	                        tabIndex: 6,
	                        name: 'openid',
	                        columnWidth: 0.5
	                    }], [{
	                        xtype: 'tinerecordpickercombobox',
	                        fieldLabel: this.app.i18n.gettext('Primary group'),
	                        tabIndex: 7,
	                        listWidth: 250,
	                        name: 'accountPrimaryGroup',
	                        blurOnSelect: true,
	                        allowBlank: false,
	                        recordClass: Tine.Admin.Model.Group,
	                        listeners: {
	                            scope: this,
	                            'select': function (combo, record, index) {
	                                // refresh grid
	                                if (this.pickerGridGroups) {
	                                    this.pickerGridGroups.getView().refresh();
	                                }
	                            }
	                        }
	                    }, {
	                        xtype: 'combo',
	                        fieldLabel: this.app.i18n.gettext('Status'),
	                        name: 'accountStatus',
	                        mode: 'local',
	                        triggerAction: 'all',
	                        allowBlank: false,
	                        tabIndex: 8,
	                        editable: false,
	                        store: [
	                            ['enabled',  this.app.i18n.gettext('enabled')],
	                            ['disabled', this.app.i18n.gettext('disabled')],
	                            ['expired',  this.app.i18n.gettext('expired')],
	                            ['blocked',  this.app.i18n.gettext('blocked')]
	                        ],
	                        listeners: {
	                            scope: this,
	                            select: function (combo, record) {
	                                switch (record.data.field1) {
	                                    case 'blocked':
	                                        Ext.Msg.alert(this.app.i18n._('Invalid Status'),
	                                            this.app.i18n._('Blocked status is only valid if the user tried to login with a wrong password to often. It is not possible to set this status here.'));
	                                        combo.setValue(combo.startValue);
	                                        break;
	                                    case 'expired':
	                                        this.getForm().findField('accountExpires').setValue(new Date());
	                                        break;
	                                    case 'enabled':
	                                        var expiryDateField = this.getForm().findField('accountExpires'),
	                                            expiryDate = expiryDateField.getValue(),
	                                            now = new Date();
	                                            
	                                        if (expiryDate < now) {
	                                            expiryDateField.setValue('');
	                                        }
	                                        break;
	                                    default:
	                                        // do nothing
	                                }
	                            }
	                        }
	                    }, {
	                        xtype: 'extuxclearabledatefield',
	                        fieldLabel: this.app.i18n.gettext('Expires'),
	                        name: 'accountExpires',
	                        tabIndex: 9,
	                        emptyText: this.app.i18n.gettext('never')
	                    }], [{
	                        xtype: 'combo',
	                        fieldLabel: this.app.i18n.gettext('Visibility'),
	                        name: 'visibility',
	                        mode: 'local',
	                        tabIndex: 10,
	                        triggerAction: 'all',
	                        allowBlank: false,
	                        editable: false,
	                        store: [['displayed', this.app.i18n.gettext('Display in addressbook')], ['hidden', this.app.i18n.gettext('Hide from addressbook')]],
	                        listeners: {
	                            scope: this,
	                            select: function (combo, record) {
	                                // disable container_id combo if hidden
	                                var addressbookContainerCombo = this.getForm().findField('container_id');
	                                addressbookContainerCombo.setDisabled(record.data.field1 === 'hidden');
	                                if (addressbookContainerCombo.getValue() === '') {
	                                    addressbookContainerCombo.setValue(null);
	                                }
	                            }
	                        }
	                    }, {
	                        xtype: 'tinerecordpickercombobox',
	                        fieldLabel: this.app.i18n.gettext('Saved in Addressbook'),
	                        name: 'container_id',
	                        blurOnSelect: true,
	                        tabIndex: 11,
	                        allowBlank: false,
	                        forceSelection: true,
	                        listWidth: 250,
	                        recordClass: Tine.Tinebase.Model.Container,
	                        disabled: this.record.get('visibility') === 'hidden',
	                        recordProxy: Tine.Admin.sharedAddressbookBackend,
	                        listeners: {
	                            specialkey: function(combo, e) {
	                                if (e.getKey() == e.TAB && ! e.shiftKey) {
	                                    // move cursor to first input field (skip display fields)
	                                    // @see 0008226: when tabbing in user edit dialog, wrong tab content is displayed
	                                    e.preventDefault();
	                                    e.stopEvent();
	                                    this.getForm().findField('accountFirstName').focus();
	                                }
	                            },
	                            scope: this
	                        }
	                    }]] 
	                }, {
	                    xtype: 'fieldset',
	                    title: this.app.i18n.gettext('Information'),
	                    autoHeight: true,
	                    checkboxToggle: false,
	                    layout: 'hfit',
	                    items: [{
	                        xtype: 'columnform',
	                        labelAlign: 'top',
	                        formDefaults: {
	                            xtype: 'displayfield',
	                            anchor: '100%',
	                            labelSeparator: '',
	                            columnWidth: 0.333,
	                            style: this.displayFieldStyle
	                        },
	                        items: [[{
	                            fieldLabel: this.app.i18n.gettext('Last login at'),
	                            name: 'accountLastLogin',
	                            emptyText: this.ldapBackend ? this.app.i18n.gettext("don't know") : this.app.i18n.gettext('never logged in')
	                        }, {
	                            fieldLabel: this.app.i18n.gettext('Last login from'),
	                            name: 'accountLastLoginfrom',
	                            emptyText: this.ldapBackend ? this.app.i18n.gettext("don't know") : this.app.i18n.gettext('never logged in')
	                        }, {
	                            fieldLabel: this.app.i18n.gettext('Password set'),
	                            name: 'accountLastPasswordChange',
	                            emptyText: this.app.i18n.gettext('never')
	                        }]]
	                    }]
	                }]
	            }, {
	                title: this.app.i18n.gettext('User groups'),
	                border: false,
	                frame: true,
	                layout: 'fit',
	                items: this.initUserGroups()
	            }, {
	                title: this.app.i18n.gettext('User roles'),
	                border: false,
	                frame: true,
	                layout: 'fit',
	                items: this.initUserRoles()
	            }, {
	                title: this.app.i18n.gettext('Fileserver'),
	                disabled: !this.ldapBackend,
	                border: false,
	                frame: true,
	                items: this.initFileserver()
	            }, {
	                title: this.app.i18n.gettext('IMAP'),
	                disabled: ! Tine.Admin.registry.get('manageImapEmailUser'),
	                autoScroll: true,
	                border: false,
	                frame: true,
	                layout: 'hfit',
	                items: this.initImap()
	            }, {
	                xtype: 'columnform',
	                title: this.app.i18n.gettext('SMTP'),
	                disabled: ! Tine.Admin.registry.get('manageSmtpEmailUser'),
	                border: false,
	                frame: true,
	                labelAlign: 'top',
	                formDefaults: {
	                    xtype: 'textfield',
	                    anchor: '100%',
	                    labelSeparator: '',
	                    columnWidth: 0.5,
	                    readOnly: true
	                },
	                items: this.initSmtp()
	            }]
	        };
	        return config;
	    }
	});
	
	/**
	 * User Edit Popup
	 * 
	 * @param   {Object} config
	 * @return  {Ext.ux.Window}
	 */
	Tine.Admin.UserEditDialog.openWindow = function (config) {
	    var id = (config.record && config.record.id) ? config.record.id : 0;
	    var window = Tine.WindowFactory.getWindow({
	        width: 600,
	        height: 400,
	        name: Tine.Admin.UserEditDialog.prototype.windowNamePrefix + id,
	        contentPanelConstructor: 'Tine.Admin.UserEditDialog',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};


/***/ },

/***/ 239:
/***/ 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-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	Ext.ns('Tine.Admin.user');
	
	
	/**
	 * User grid panel
	 * 
	 * @namespace   Tine.Admin.user
	 * @class       Tine.Admin.user.GridPanel
	 * @extends     Tine.widgets.grid.GridPanel
	 */
	Tine.Admin.user.GridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
	    /**
	     * @property isLdapBackend
	     * @type Boolean
	     */
	    isLdapBackend: false,
	    
	    newRecordIcon: 'action_addContact',
	    recordClass: Tine.Admin.Model.User,
	    recordProxy: Tine.Admin.userBackend,
	    defaultSortInfo: {field: 'accountLoginName', direction: 'ASC'},
	    evalGrants: false,
	    gridConfig: {
	        id: 'gridAdminUsers',
	        autoExpandColumn: 'accountDisplayName'
	    },
	    
	    initComponent: function() {
	        this.gridConfig.cm = this.getColumnModel();
	        this.isLdapBackend = Tine.Tinebase.registry.get('accountBackend') == 'Ldap';
	        Tine.Admin.user.GridPanel.superclass.initComponent.call(this);
	    },
	    
	    /**
	     * init actions with actionToolbar, contextMenu and actionUpdater
	     * 
	     * @private
	     */
	    initActions: function() {
	        this.actionEnable = new Ext.Action({
	            requiredGrant: 'readGrant',
	            text: this.app.i18n._('Enable Account'),
	            allowMultiple: true,
	            disabled: true,
	            handler: this.enableDisableButtonHandler.createDelegate(this, ['enabled']),
	            iconCls: 'action_enable',
	            actionUpdater: this.enableDisableActionUpdater.createDelegate(this, [['disabled', 'blocked', 'expired']], true)
	        });
	    
	        this.actionDisable = new Ext.Action({
	            requiredGrant: 'readGrant',
	            text: this.app.i18n._('Disable Account'),
	            allowMultiple: true,
	            disabled: true,
	            handler: this.enableDisableButtonHandler.createDelegate(this, ['disabled']),
	            iconCls: 'action_disable',
	            actionUpdater: this.enableDisableActionUpdater.createDelegate(this, [['enabled']], true)
	        });
	    
	        this.actionResetPassword = new Ext.Action({
	            requiredGrant: 'readGrant',
	            text: this.app.i18n._('Reset Password'),
	            disabled: true,
	            handler: this.resetPasswordHandler,
	            iconCls: 'action_password',
	            scope: this
	        });
	
	        this.actionResetPin = new Ext.Action({
	            requiredGrant: 'readGrant',
	            text: this.app.i18n._('Reset Pin'),
	            disabled: true,
	            handler: this.resetPinHandler,
	            iconCls: 'action_password',
	            hidden: ! Tine.Tinebase.registry.get('secondFactorPinChangeAllowed'),
	            scope: this
	        });
	
	        this.actionUpdater.addActions([
	            this.actionEnable,
	            this.actionDisable,
	            this.actionResetPassword,
	            this.actionResetPin
	        ]);
	        
	        Tine.Admin.user.GridPanel.superclass.initActions.call(this);
	    },
	    
	    /**
	     * initialises filter toolbar
	     */
	    initFilterPanel: function() {
	        this.filterToolbar = new Tine.widgets.grid.FilterToolbar({
	            filterModels: [
	                {label: this.app.i18n.n_('User', 'Users', 1),    field: 'query',       operators: ['contains']}
	                //{label: this.app.i18n._('Description'),    field: 'description', operators: ['contains']},
	            ],
	            defaultFilter: 'query',
	            filters: [],
	            plugins: [
	                new Tine.widgets.grid.FilterToolbarQuickFilterPlugin()
	            ]
	        });
	        this.plugins = this.plugins || [];
	        this.plugins.push(this.filterToolbar);
	    },
	    
	    /**
	     * add custom items to action toolbar
	     * 
	     * @return {Object}
	     */
	    getActionToolbarItems: function() {
	        return [
	            Ext.apply(new Ext.Button(this.actionEnable), {
	                scale: 'medium',
	                rowspan: 2,
	                iconAlign: 'top'
	            }),
	            Ext.apply(new Ext.Button(this.actionDisable), {
	                scale: 'medium',
	                rowspan: 2,
	                iconAlign: 'top'
	            }),
	            Ext.apply(new Ext.Button(this.actionResetPassword), {
	                scale: 'medium',
	                rowspan: 2,
	                iconAlign: 'top'
	            }),
	            Ext.apply(new Ext.Button(this.actionResetPin), {
	                scale: 'medium',
	                rowspan: 2,
	                iconAlign: 'top'
	            })
	        ];
	    },
	    
	    /**
	     * add custom items to context menu
	     * 
	     * @return {Array}
	     */
	    getContextMenuItems: function() {
	        var items = [
	            '-',
	            this.actionEnable,
	            this.actionDisable,
	            '-',
	            this.actionResetPassword,
	            this.actionResetPin
	        ];
	        
	        return items;
	    },
	    
	    /**
	     * returns column model
	     * 
	     * @return Ext.grid.ColumnModel
	     * @private
	     */
	    getColumnModel: function() {
	        return new Ext.grid.ColumnModel({
	            defaults: {
	                sortable: true,
	                hidden: true,
	                resizable: true
	            },
	            columns: this.getColumns()
	        });
	    },
	    
	    /**
	     * returns columns
	     * @private
	     * @return Array
	     */
	    getColumns: function(){
	        return [
	            { header: this.app.i18n._('ID'), id: 'accountId', dataIndex: 'accountId', width: 50},
	            { header: this.app.i18n._('Status'), id: 'accountStatus', dataIndex: 'accountStatus', hidden: this.isLdapBackend, width: 50, renderer: this.statusRenderer},
	            { header: this.app.i18n._('Display name'), id: 'accountDisplayName', dataIndex: 'accountDisplayName', hidden: false},
	            { header: this.app.i18n._('Login name'), id: 'accountLoginName', dataIndex: 'accountLoginName', width: 160, hidden: false},
	            { header: this.app.i18n._('Last name'), id: 'accountLastName', dataIndex: 'accountLastName'},
	            { header: this.app.i18n._('First name'), id: 'accountFirstName', dataIndex: 'accountFirstName'},
	            { header: this.app.i18n._('Email'), id: 'accountEmailAddress', dataIndex: 'accountEmailAddress', width: 200, hidden: false},
	            { header: this.app.i18n._('OpenID'), id: 'openid', dataIndex: 'openid', width: 200},
	            { header: this.app.i18n._('Last login at'), id: 'accountLastLogin', dataIndex: 'accountLastLogin', hidden: this.isLdapBackend, width: 140, renderer: Tine.Tinebase.common.dateTimeRenderer},
	            { header: this.app.i18n._('Last login from'), id: 'accountLastLoginfrom', hidden: this.isLdapBackend, dataIndex: 'accountLastLoginfrom'},
	            { header: this.app.i18n._('Password changed'), id: 'accountLastPasswordChange', dataIndex: 'accountLastPasswordChange', width: 140, renderer: Tine.Tinebase.common.dateTimeRenderer, hidden: false},
	            { header: this.app.i18n._('Expires'), id: 'accountExpires', dataIndex: 'accountExpires', width: 140, renderer: Tine.Tinebase.common.dateTimeRenderer, hidden: false}
	        ];
	    },
	    
	    enableDisableButtonHandler: function(status) {
	        var accountIds = new Array();
	        var selectedRows = this.grid.getSelectionModel().getSelections();
	        for (var i = 0; i < selectedRows.length; ++i) {
	            accountIds.push(selectedRows[i].id);
	        }
	        
	        Ext.Ajax.request({
	            url : 'index.php',
	            method : 'post',
	            params : {
	                method : 'Admin.setAccountState',
	                accountIds : accountIds,
	                status: status
	            },
	            scope: this,
	            callback : function(_options, _success, _response) {
	                if(_success === true) {
	                    var result = Ext.util.JSON.decode(_response.responseText);
	                    if(result.success === true) {
	                        this.loadGridData({
	                            removeStrategy: 'keepBuffered'
	                        });
	                    }
	                }
	            }
	        });
	    },
	    
	    /**
	     * updates enable/disable actions
	     * 
	     * @param {Ext.Action} action
	     * @param {Object} grants grants sum of grants
	     * @param {Object} records
	     * @param {Boolean} isFilterSelect
	     * @param {Array} requiredAccountStatus
	     */
	    enableDisableActionUpdater: function(action, grants, records, isFilterSelect, requiredAccountStatus) {
	        var enabled = records.length > 0;
	        Ext.each(records, function(record){
	            enabled &= requiredAccountStatus.indexOf(record.get('accountStatus')) >=0;// === requiredAccountStatus;
	            return enabled;
	        }, this);
	        
	        action.setDisabled(!enabled);
	    },
	    
	    /**
	     * reset password
	     * 
	     * TODO add checkbox for must change pw
	     * TODO add pw repeat (see user edit dialog)
	     */
	    resetPasswordHandler: function(_button, _event) {
	        Ext.MessageBox.prompt(this.app.i18n._('Set new password'), this.app.i18n._('Please enter the new password:'), function(_button, _text) {
	            if(_button == 'ok') {
	                var accountObject = this.grid.getSelectionModel().getSelected().data;
	                
	                Ext.Ajax.request( {
	                    params: {
	                        method    : 'Admin.resetPassword',
	                        account   : accountObject,
	                        password  : _text,
	                        mustChange: false
	                    },
	                    scope: this,
	                    callback : function(_options, _success, _response) {
	                        if(_success === true) {
	                            var result = Ext.util.JSON.decode(_response.responseText);
	                            if(result.success === true) {
	                                this.grid.getStore().reload();
	                            }
	                        } else {
	                            Tine.Tinebase.ExceptionHandler.handleRequestException(_response);
	                        }
	                    }
	                });
	            }
	        }, this);
	    },
	
	    resetPinHandler: function(_button, _event) {
	        Ext.MessageBox.prompt(this.app.i18n._('Set new pin'), this.app.i18n._('Please enter the new pin:'), function(_button, _text) {
	            if(_button == 'ok') {
	                var accountObject = this.grid.getSelectionModel().getSelected().data;
	
	                Ext.Ajax.request( {
	                    params: {
	                        method    : 'Admin.resetPin',
	                        account   : accountObject,
	                        password  : _text
	                    },
	                    scope: this,
	                    callback : function(_options, _success, _response) {
	                        if(_success === true) {
	                            var result = Ext.util.JSON.decode(_response.responseText);
	                            if(result.success === true) {
	                                this.grid.getStore().reload();
	                            }
	                        } else {
	                            Tine.Tinebase.ExceptionHandler.handleRequestException(_response);
	                        }
	                    }
	                });
	            }
	        }, this);
	    },
	    
	    statusRenderer: function (_value, _cellObject, _record, _rowIndex, _colIndex, _dataStore) {
	        var gridValue;
	        
	        switch(_value) {
	            case 'blocked':
	                gridValue = "<img src='images/oxygen/16x16/status/security-medium.png' width='12' height='12'/>";
	                break;
	
	            case 'enabled':
	                gridValue = "<img src='images/oxygen/16x16/actions/dialog-apply.png' width='12' height='12'/>";
	                break;
	              
	            case 'disabled':
	                gridValue = "<img src='images/oxygen/16x16/actions/dialog-cancel.png' width='12' height='12'/>";
	                break;
	              
	            case 'expired':
	                gridValue = "<img src='images/oxygen/16x16/status/user-away.png' width='12' height='12'/>";
	                break;
	
	            default:
	                gridValue = _value;
	                break;
	        }
	        
	        return gridValue;
	    }
	});


/***/ },

/***/ 240:
/***/ 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-2010 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	
	/*global Ext, Tine*/ 
	
	Ext.ns('Tine.Admin.user');
	
	/**
	 * Users 'mainScreen'
	 * 
	 * @static
	 */
	Tine.Admin.user.show = function () {
	    var app = Tine.Tinebase.appMgr.get('Admin');
	    if (! Tine.Admin.user.gridPanel) {
	        Tine.Admin.user.gridPanel = new Tine.Admin.user.GridPanel({
	            app: app
	        });
	    }
	    else {
	        Tine.Admin.user.gridPanel.loadGridData.defer(100, Tine.Admin.user.gridPanel, []);
	    }
	
	    app.getMainScreen().setActiveContentPanel(Tine.Admin.user.gridPanel, true);
	    app.getMainScreen().setActiveToolbar(Tine.Admin.user.gridPanel.actionToolbar, true);
	};
	
	
	/************** models *****************/
	Ext.ns('Tine.Admin.Model');
	
	/**
	 * Model of an account
	 */
	Tine.Admin.Model.UserArray = [
	    { name: 'accountId' },
	    { name: 'accountFirstName' },
	    { name: 'accountLastName' },
	    { name: 'accountLoginName' },
	    { name: 'accountPassword' },
	    { name: 'accountDisplayName' },
	    { name: 'accountFullName' },
	    { name: 'accountStatus' },
	    { name: 'groups' },
	    { name: 'accountRoles' },
	    { name: 'accountPrimaryGroup' },
	    { name: 'accountExpires', type: 'date', dateFormat: Date.patterns.ISO8601Long },
	    { name: 'accountLastLogin', type: 'date', dateFormat: Date.patterns.ISO8601Long },
	    { name: 'accountLastPasswordChange', type: 'date', dateFormat: Date.patterns.ISO8601Long },
	    { name: 'accountLastLoginfrom' },
	    { name: 'accountEmailAddress' },
	    { name: 'accountHomeDirectory' },
	    { name: 'accountLoginShell' },
	    { name: 'openid'},
	    { name: 'visibility'},
	    { name: 'sambaSAM' },
	    { name: 'emailUser' },
	    { name: 'contact_id' },
	    { name: 'container_id' }
	];
	
	Tine.Admin.Model.User = Tine.Tinebase.data.Record.create(Tine.Admin.Model.UserArray, {
	    appName: 'Admin',
	    modelName: 'User',
	    idProperty: 'accountId',
	    titleProperty: 'accountDisplayName',
	    // ngettext('User', 'Users', n); gettext('Users');
	    recordName: 'User',
	    recordsName: 'Users'
	});
	
	/**
	 * returns default account data
	 * 
	 * @namespace Tine.Admin.Model.User
	 * @static
	 * @return {Object} default data
	 */
	Tine.Admin.Model.User.getDefaultData = function () {
	    var internalAddressbook = Tine.Admin.registry.get('defaultInternalAddressbook'),
	        emailUserDefaults = (Tine.Admin.registry.get('config').defaultImapUserSettings && Tine.Admin.registry.get('config').defaultImapUserSettings.value)
	            ? Tine.Admin.registry.get('config').defaultImapUserSettings.value : '';
	        
	    return {
	        sambaSAM: '',
	        emailUser: emailUserDefaults,
	        accountStatus: 'enabled',
	        visibility: (internalAddressbook !== null) ? 'displayed' : 'hidden',
	        container_id: internalAddressbook,
	        accountPrimaryGroup: Tine.Admin.registry.get('defaultPrimaryGroup')
	    };
	};
	
	Tine.Admin.Model.SAMUserArray = [
	    { name: 'sid'              },
	    { name: 'primaryGroupSID'  },
	    { name: 'acctFlags'        },
	    { name: 'homeDrive'        },
	    { name: 'homePath'         },
	    { name: 'profilePath'      },
	    { name: 'logonScript'      },
	    { name: 'logonTime',     type: 'date', dateFormat: Date.patterns.ISO8601Long },
	    { name: 'logoffTime',    type: 'date', dateFormat: Date.patterns.ISO8601Long },
	    { name: 'kickoffTime',   type: 'date', dateFormat: Date.patterns.ISO8601Long },
	    { name: 'pwdLastSet',    type: 'date', dateFormat: Date.patterns.ISO8601Long },
	    { name: 'pwdCanChange',  type: 'date', dateFormat: Date.patterns.ISO8601Long },
	    { name: 'pwdMustChange', type: 'date', dateFormat: Date.patterns.ISO8601Long }
	];
	
	Tine.Admin.Model.SAMUser = Tine.Tinebase.data.Record.create(Tine.Admin.Model.SAMUserArray, {
	    appName: 'Admin',
	    modelName: 'SAMUser',
	    idProperty: 'sid',
	    titleProperty: null,
	    // ngettext('Samba User', 'Samba Users', n);
	    recordName: 'Samba User',
	    recordsName: 'Samba Users'
	});
	
	Tine.Admin.Model.EmailUserArray = [
	    { name: 'emailUID' },
	    { name: 'emailGID' },
	    { name: 'emailMailQuota' },
	    { name: 'emailMailSize' },
	    { name: 'emailSieveQuota' },
	    { name: 'emailSieveSize' },
	    { name: 'emailLastLogin', type: 'date', dateFormat: Date.patterns.ISO8601Long },
	    { name: 'emailUserId' },
	    { name: 'emailAliases' },
	    { name: 'emailForwards' },
	    { name: 'emailForwardOnly' },
	    { name: 'emailAddress' },
	    { name: 'emailUsername' }
	];
	
	Tine.Admin.Model.EmailUser = Tine.Tinebase.data.Record.create(Tine.Admin.Model.EmailUserArray, {
	    appName: 'Admin',
	    modelName: 'EmailUser',
	    idProperty: 'sid',
	    titleProperty: null,
	    // ngettext('Email User', 'Email Users', n);
	    recordName: 'Email User',
	    recordsName: 'Email Users'
	});
	
	
	
	
	/************** backends *****************/
	
	Tine.Admin.userBackend = new Tine.Tinebase.data.RecordProxy({
	    appName: 'Admin',
	    modelName: 'User',
	    recordClass: Tine.Admin.Model.User,
	    idProperty: 'accountId'
	});
	
	Tine.Admin.samUserBackend = new Tine.Tinebase.data.RecordProxy({
	    appName: 'Admin',
	    modelName: 'SAMUser',
	    recordClass: Tine.Admin.Model.SAMUser,
	    idProperty: 'sid'
	});
	
	Tine.Admin.emailUserBackend = new Tine.Tinebase.data.RecordProxy({
	    appName: 'Admin',
	    modelName: 'EmailUser',
	    recordClass: Tine.Admin.Model.EmailUser,
	    idProperty: 'emailUID'
	});
	
	Tine.Admin.sharedAddressbookBackend = new Tine.Tinebase.data.RecordProxy({
	    appName: 'Admin',
	    modelName: 'SharedAddressbook',
	    recordClass: Tine.Tinebase.Model.Container,
	    idProperty: 'id'
	});


/***/ },

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

	exports = module.exports = __webpack_require__(1)();
	// imports
	
	
	// module
	exports.push([module.id, ".action_enable{background-image:url(" + __webpack_require__(50) + ")!important}.x-btn-medium .action_enable{background-image:url(" + __webpack_require__(72) + ")!important}.x-btn-large .action_enable{background-image:url(" + __webpack_require__(91) + ")!important}.action_disable{background-image:url(" + __webpack_require__(17) + ")!important}.x-btn-medium .action_disable{background-image:url(" + __webpack_require__(27) + ")!important}.x-btn-large .action_disable{background-image:url(" + __webpack_require__(31) + ")!important}.action_settings{background-image:url(" + __webpack_require__(63) + ")!important}.x-btn-medium .action_settings{background-image:url(" + __webpack_require__(84) + ")!important}.x-btn-large .action_settings{background-image:url(" + __webpack_require__(103) + ")!important}.action_permissions{background-image:url(" + __webpack_require__(26) + ")!important}.x-btn-medium .action_permissions{background-image:url(" + __webpack_require__(30) + ")!important}.x-btn-large .action_permissions{background-image:url(" + __webpack_require__(34) + ")!important}.action_addGroup{background-image:url(" + __webpack_require__(3) + ")!important}.x-btn-medium .action_addGroup{background-image:url(" + __webpack_require__(4) + ")!important}.x-btn-large .action_addGroup{background-image:url(" + __webpack_require__(5) + ")!important}.action_password{background-image:url(" + __webpack_require__(60) + ")!important}.x-btn-medium .action_password{background-image:url(" + __webpack_require__(82) + ")!important}.x-btn-large .action_password{background-image:url(" + __webpack_require__(101) + ")!important}.AdminIconCls{background-image:url(" + __webpack_require__(25) + ")!important}.x-btn-medium .AdminIconCls{background-image:url(" + __webpack_require__(29) + ")!important}.x-btn-large .AdminIconCls{background-image:url(" + __webpack_require__(33) + ")!important}.admin-node-accesslog{background-image:url(" + __webpack_require__(851) + ")!important}.x-btn-medium .admin-node-accesslog{background-image:url(" + __webpack_require__(1217) + ")!important}.x-btn-large .admin-node-accesslog{background-image:url(" + __webpack_require__(1578) + ")!important}.admin-node-user{background-image:url(" + __webpack_require__(1136) + ")!important}.x-btn-medium .admin-node-user{background-image:url(" + __webpack_require__(1503) + ")!important}.x-btn-large .admin-node-user{background-image:url(" + __webpack_require__(1863) + ")!important}.admin-node-groups{background-image:url(" + __webpack_require__(3) + ")!important}.x-btn-medium .admin-node-groups{background-image:url(" + __webpack_require__(4) + ")!important}.x-btn-large .admin-node-groups{background-image:url(" + __webpack_require__(5) + ")!important}.admin-node-computers{background-image:url(" + __webpack_require__(1132) + ")!important}.x-btn-medium .admin-node-computers{background-image:url(" + __webpack_require__(1499) + ")!important}.x-btn-large .admin-node-computers{background-image:url(" + __webpack_require__(1859) + ")!important}.admin-node-applications{background-image:url(" + __webpack_require__(1134) + ")!important}.x-btn-medium .admin-node-applications{background-image:url(" + __webpack_require__(1501) + ")!important}.x-btn-large .admin-node-applications{background-image:url(" + __webpack_require__(1861) + ")!important}.admin-node-containers{background-image:url(" + __webpack_require__(42) + ")!important}.admin-action-add-container{background-image:url(" + __webpack_require__(42) + ")!important}.x-btn-medium .admin-action-add-container{background-image:url(" + __webpack_require__(90) + ")!important}.x-btn-large .admin-action-add-container{background-image:url(" + __webpack_require__(109) + ")!important}.admin-node-customfields{background-image:url(" + __webpack_require__(134) + ")!important}.admin-action-add-customfield{background-image:url(" + __webpack_require__(134) + ")!important}.x-btn-medium .admin-action-add-customfield{background-image:url(" + __webpack_require__(1165) + ")!important}.x-btn-large .admin-action-add-customfield{background-image:url(" + __webpack_require__(1529) + ")!important}.admin-node-customfields-store{background-image:url(" + __webpack_require__(64) + ")!important}.x-tree-node-collapsed .x-tree-node-icon.x-tree-node-leaf-checkbox,.x-tree-node-expanded .x-tree-node-icon.x-tree-node-leaf-checkbox,.x-tree-node-leaf-checkbox,.x-tree-node-leaf .x-tree-node-icon.x-tree-node-leaf-checkbox{width:0}", ""]);
	
	// exports


/***/ },

/***/ 658:
/***/ 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__(568);
	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!./Admin.css", function() {
				var newContent = require("!!../../Tinebase/js/node_modules/css-loader/index.js!./Admin.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(); });
	}

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAGxSURBVHjapVNNSxtRFD0z72ViRNNKSEg3hQh+FeqiW13o0giCS39Lf0dX3dRlN2K7aEAQghu7bSm1oatBBTNoZpLJhzPJvOc7CJ2AiyZ4YIb34J5z7ruHa2mt8RxI/izLmgUwzyMmA11DY96XhrxQq9X+lMvlEqZAs9n0DHeVHbx2XbdUr9dBTPIkQ0SlUimRK3lvNBpwHAfvtvcxGo3w4+wrlFLI5XLgXUoJz/MwDnLItfln0duNHRx/v8StVcT6ZhVBEMD3fYRhiFarBQqyLooi9Ho9xHGcDjFJEoTdLm50Aed/A+yvSL4RQgq2+8SdWFtdSwWUSnB69Al7uwcovNT4/PEDOp12GpUQTwRs2xoT0Bot/w71L4fIZDII2j7d/zfJVIDHYqGArbCL7ZlZvM/nIZ0sstksNPS/ZDhMVl9fX4Ecwn5sx0Zv0Ec5/wKvlEI/iqB0glEyZEdGQDFgDIcxomhghAQ5aQd0IU6SGN7iEsTFL9CN3/39wIg4JpHHJAghBDmpAKGMi2uK3d8/QbQ77Yl3QS8vrZhY3mAaMHpyOYs5ANXxRZpiob49e50fAI9LwcmiHLzeAAAAAElFTkSuQmCC"

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAFxSURBVDiNlZK9ahtBFIW/nV2ttXHKEAeUMoVaq4lfIr1B3dZ6i7yDCwfUqVGbBKcUboLAqiRQIA+QOE0MkZbd+bnXhZARYRJWFy5cLodvzpkZVJW/++PnT81isdBtVelsNtOf9/c6u721Ma0hUqenz/O6rlFVVqsVAFmWdmLaKMB5R1BFRNgag7Kb2wOcQ0JARCiCB0BEjwPsMwYfQI904L0niCAiGGNQOBLgPCGEJxfoDtoa0DQ1qTGIyBPEOdceYJ2jk+foAcD+A5DFlkli8N6jgLWWLzc35EW3vQPnHdvNBmctHedIjNndRVvAn82mEVXqpuHtxQWDwYDfDw82Soj9732Px+O70Wj04X+aqIOyLF+XZXmZpumzPM97ZVleTiaTNzFtss+2XC7fF0XxDqCqqhd1Y3tWMk6MQ0l4dfbyl7X2B8B8Pr8aDofXcPAK0+l0mWVZx3ufhhDOu91u7/Ckfr//bb1efwUIIXzf7x8BJLQpbcVMGK8AAAAASUVORK5CYII="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIeSURBVHjaxZO9a1NRGMZ/5ya5N21Tk5I2baWKIhj8QOiguEjBTfAv6OKmf0AHxc3V2VEcHbs6OqiDg2DRovjVVtPYNrVJepvcr3PO6wkNdJYOPvDjec7h8PK8w1EiwnHkcUypcwsPlmdr5TNv36/1+AedPzsd/GzureXLpeD03cWF+Zs3LiDWoo1xLlijHQZjLCIaM8haM7hPk4R83mO71db5D583opWvTX7vdLBihw8N1rg8HKKzzOUMqzO63X2+/2gwNztJdz81HqLpZwrrl3h45zpqdBqvNIN3YgblnNI0arwGo1NsR0U2whH8kxfJz82DaPKI4c/2L/a7XZYef8Jae4gIYsEgpFpotkKiOENMTBofsLn1DqSChxjCrIgJaizfe4T2a44p0lyVxKuwe+DzrdEjDDVZnDkEYwrEdgzEDBpoEuuhjeXW0ydobRDc2dHuCX0zRlAZAbEopUAJJumRHrRhd+twhV5nB290EvxxVJAnTlL29jquah/rHpssQrIYqxPEoQoBfnmWXmvzcEBsAnSrSab7rmpEFGnIBSgHykOkAIB4OSRXwGYpveaXoxWiRHPtSp0ksRgRRCwM3BrHIA98iNEgmpdvVkD6wxWi2JHy4tl9skuLFFafo9IQOFIQBNTrddbX17l6ewnlecMGxjR2Vl+99k7ZSrVavdwpFnEBLwuAI/m+z8TEBGEYEtjwY9JudhAa//83/gUCnGBYOMzYcgAAAABJRU5ErkJggg=="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAH5SURBVHjajZJNaxNBGMefedmX7Ka7zdtGUittSkBBqtaCBxHyBQQRhX6Cogc9eRG89OLBi5/As2IR/QZCQQR7EKUVhEYNamgM2KRst5mdnRnHFSqUTZsfPAw8A7955j+DlFIwivUXj5coId0L1+6+hhFkCt48fXRmOGTvwjDKl6o1cBxnl6j41LmrtwdwCAwZSAnPE6nyEhRgwwQvqHnEtF9BBhQyyLnu1PnFRUBOGYT6Z/z881tjLMGPt6u5SrkwQIZVoKYNpmGl/dpM/Ttojr3CFqtwz3M7gDAgBBoFSkmY8CZaYwmazWaiEn4fEgYgGSge6SVKCFL3sgUZFBdurLW/thIR9UHFEWx8XGf5+uXtsUNMsQv9zU8b5ZgJyE8G6fhjT5AkEp2cO1tozF8By/UhmJ6t6x4+VtAZiGqvt/fwdz/cHtKK5NSH4vS8MkoNIqVsMcYfcC6CzJ/Y7Q5uYkyeOS7FBJM0fYzxoQ+mQAgRGwZdMk368kAwZJxstX/tT1V9w7ZMQAjBKPQEIKTazdlGYJmUpUd86fTuFH3X0D7QwiNL/i0pvJ1w7/rBK+z0wqpZJVJvYUoxEJyZVypgLIYwYlLnNHei6P/PYGVl1QxmSs1LC7O3crZ9WirhSgG2VBIAoQjpsfdZvPn+Q/sJ5pNry8sXOWj+AFiV9v8WscbCAAAAAElFTkSuQmCC"

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADeSURBVHja7ZU/DoIwFIdfoaj1BjDIVFZ1JvEQ/r2AHoYzyBHUW7DIDQozN9CaMOArKQmMhpI4QPL195ImXxh+D0hVVTDEYyGjeFgxjaJog3lFAkNOgVwoHnEYhtzzPCPWoiiCJEliJa6lrusCY6yXVErZjJzqoZbeHzfI8wws2wZ/4cPxcPrF23kx2r7YbfeQpk9wJg6sluuxx/++IK250wohhGpFfzF2ULXCTI+1OMNt4ZimNk9FpsRnXEHj34rxD9JtBSHExpgiDJkp9DxvUmMhJfJGpM6PmnW+dJZfsvhEk7aPJqAAAAAASUVORK5CYII="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACYQAAAmEBwTBV+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAALnSURBVHjatVVNaxNRFD0z8xpNUluSYr/UKLbBCmItlEJ1Y1XcFDcFF676M1z1B3SfbIoiBQUVBXHlQiyIoItaFwEXIUXTNGUiTZrvmcxkZrxzcdJOKUhpe+DxZl7uO/e8M2cmkuM4OAkI70IiuBOOBsdFh3hwcHAgmUw+FkJ076n4f5NdUUzWbrfrxLWoqmpB0KKSSCQ+TE9P36AfIMuyRwzbtt1Ne+XwPc1c581ebTAYxMLCwgzVTLLiQCDQk8lkOhsJ3ibeoCgKLMvyZm+9I4KuvQbM1bHCVbq0tISRkREu7OrqgmmaOCzW19cxNzcHj1hyiUOhEPr7z+La7YfYKmnoC0lIf32PYrGIoaFhUmVBCMGKm00NpVIR+8AcxMW281moWDIMAzfvPEDi3RomxmLINM7g1swsGo0mstks8vktmjeQy20SaYlsYU10snZn6LrOXJ5iPrZhGsiVTVROx5DK1fDiSw5Tjy6h3qgjGonCbJvsY6VSgaZpEERMa/xMSCXPakFlLp/HRqsFS01hOHgB1UoZk5d7sJX6jOL2Niz6nTawFdVqle04CIosM1eHmAq5+6vXLzF+fRyjwfvYzn7E87XvrKRMjfZCVuSDiYXCXD4r4EiQyfJUKsWDwMc9DBRZMJdPsaBugVMBzN69hynKY7Yvgmdv3h4qdsKvmIn5GJFoBK3lZQycOw9pcxPhK6NokhXxeByaplO+Bdfalo1wd5j97u3txc7ODqUm77NC9qxwu5Uosz2xGMT8PPSLMdQaDYqVTAQVtFoaDR0NWrPsNuq1GnRNo4ZNyjXXMcf+VHAuBb1xP8LdiD99gm9XxyB+/+I1Gu5D5FdXkOqWYbBKF2VqygoVxeXwpcKhG4eixHHJk4LFgEBgI8v3DpH9KRTgfbepgRetAzxmYsfl7HgcjUa461FgEw9x+ayg/E7gOJBOp3etWFlZ+bS6uvoTx4Baraa6nNK/b7ACQMLxwCFYJ/Zn+he3brFOtcrypwAAAABJRU5ErkJggg=="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACYQAAAmEBwTBV+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKDSURBVDiNpZRNSxtRFIbf3Nz5qlNUpKDS2o3QSqguJHRRt6X+BBd1YSCbriytP6FLW1d2I5J16dJFl0JxVemg+LGpgoHWhSVxxk6TmftxuogTE8gkNA4M3HNnzsN733POzRAROj2rax/Gpp9Ml++NjPDRsVG4Ay48z0Mul0MYhjg4OhRHx8cP3yy/Pu+UzzpSAUgp7woheFj7i2r1EgCwtbXVSGIMpmkaUiknLT8VzA1D2bYN13VBWoOIwNjN72kn7Qm+Vg3S1ARVrDuNNQCtdX9gKSUJKZoAIsJwPWyueynmvRSrFrBSCmHYgGt9aytU29Ety7qOVf9gJRVUi8eMMXDOQUT9e5woVkqBSLd52rDlNmAlobUG0U3BErVSyf7AURSxIAhwdRXAcey2TiCtIWLRH5hzrogItu3AMIzmPgHQRBBSQCmV2hpdrTBME1qrhqdaQ0qJOI4RRRGiKIaUMpMqLO2DlJKUUpBKNT1mjOH96irOzs7wfH4enPNUxV0HJBmIIPAxNDQMw/fxcnkZe/v7CP5cdUvtagWL4xhCNIokhEB+Zga2bePBxATqUYQsy2b/W7F/eXluZPlaXKu7p6enU4ODQ7ODU1Pxj5OT8u+LC1/G8V69VvuVKqu1P9PexcXFgZ2dHSqVSt8BZABkeuV09bhQKBgAZi3LMl3XBWPMXFpaegpAFwqFb5ubm6nFy7SOarFYXADwOInz+fyjZ3NzC3VlwMm2D4TneZ+2t7ePk9gwjM/r6+sHHcGe530B8CKxqFKpwPf9joomJyfbLqLd3d1XxWLxY0fwysrKHID7ABCGoW2aZs5xnLcduDQ+Pv6uXC4fJhvVavXrxsbGzyT+B3uOtBNX2N/nAAAAAElFTkSuQmCC"

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAABuvAAAbrwFeGpEcAAAAB3RJTUUH1wwFCwoyD6zN7wAAAxJJREFUeNrtkstuI0UUhr+6dNtxPCGaJNIYMUwAEWVDtgjxAMwCsWOBWCAQEhtegSUSC56AB+AtkNCsGXERSEjJwMRKMhPb8a3bdnfXjXI7wbOYHWI3R/rrr1Kp/vOfOocX8b+HANh/+zP1wZef/1ZY33LOkWpNotUaSqKkQBBw1mGtxVSGqqqoioiyREvBOwd3ijAZHn360X2jAUbTuTzpXh5qncqdDcXQOuYmQAAIhLCkyN5fwxGcwztLsA5nDRfHf5EO7nF0eFcDRrJ6gzeGt3Y1773e4t27G3hrr+HqxzW7GyyTSRBJRMrZox69p3ncbuKEBqBek1YbKVPe7Gzx2l7C4goEM5ASISKWHJYODcEanLcEU1JMxpz8/AvZeIw3Fjt7A7toroXNIhNV1uf4JOclu83ZIOCKCQQIYVW+rx2quA+169GTPqfHf+NsA33rFUS8061tVNpaCysFQiY87Gt+6s0ASQh69a8sL8UKLNlz+WTEuD8jbcXSywV2PqVa5HF/iDXlWtiWhmo2F6os6exoemMPKkEqjRSSuNRJijyne/yI+WRaT0W4roLmbRrNHfRGOx71Whg8zhiO9lM+vt/i9xPL9z8WVMGCWP3zZJRxeTEAUtTWHRJXYhdjTHRrZzFRMcfk93BlshZeuvMukGUz9hq/0vDbGPsqQilAM7rKmUWXDe2W/aAaZ1gXQG0QxCYhTZBEt3p5fsaxMFNcOeX8UvDVdy0QgVBmFKWh/3SA9YJ0cxvZ3CZtbKHbdllhRLkey6Zn4ROyhX+mea1d0FvkVpOPbwMwGY4ipoQA4MiHA5Crhvp6lm09ej6yj7zEefcUlz8zbuV0wHzY4+XOLtiCqlTYashmOyCkqoEQ1BEgeBmhIkTN+AQnmlz2JxSzyVo4EKJQhZnlnD8+5utvvuWLTz7k6uQBz4uDgwPa7TbdbpdOp4NUCbcO3uf0rM8kK8K/wn5+IaeT/WxDika/1xM/PPgzZp4ihOB5kaYpq/lXSCnrr5mPeqF/9tiY4R+rvgE3vAco/lt4oF/zi7iJfwB6n9p+pT/nXQAAAABJRU5ErkJggg=="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACYQAAAmEBwTBV+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAL3SURBVHjapZLJaxRBGMVfVXX1jDOZzCSZZDQmRlBEBXEDCQhBEAUvKqigKOIf4HIRwYMXQfTgQfDkRRQ86kEvLgQUBTdExIsgGiduZDFxMpneq762i5CDhskk8Qevv2rqq9fVr4rFcYy50H/9fMFxPHfPiYsh5kBD42e3Lh11Xe+KH4QtTfmWOJtZNIyY9vYeOPVqwcaPb17YV3O824iB1KIMWjs6kW8twnNr5FZGV/TuP1FGHThmIYyia2AMTEq4noMw8BGGPjgX3JLyNmbBQh3uXj0rU5lMU19fL6ymIibdAJ7rIpPJYmzoB1zHWb4QY4Pq6CiBSztRCoW2PFo6JBhjyLcV4VTHIxjmG8W6TWs3l9qbh8AEjIyh0dSYo7O7e6T85EZ63sYqssrZbFMFDAkxpp6EmBTMeadT9s/l24758zZete3QLxX6NxlpgMJECkxHYMmYxUll+tyCr1vl3Z20YnYtkysInsqaCMwSjI/9mliybnthQRkbChv2+RMT1dcUeSDfgak6cODWJh+iARwNYNnSg08DZWgVQPsu3rx9A8jcczTAQgPsVDq/cn0fvg1+RmX0J7p6VoMJwf9rx0rpdpFbeoRbFnLNeUg7DTNOt/WcTOYWz/vwRsbdXToKj1uW2JFI+q4DFVQRuB5SzW1xe7HIOGcRAfcEY9cA9Esp4rrGw9Vad2Vk8mWpPd8pJYfgAmbe/LmpjDFMY95jUykGEX2S0tpu29bXGcZBqKzP5ZEvnaVClxACti1gmDash9YEiglJ2wdbWhtSthX+lfGP4d8HC7lMl9IaQjBjaDRtXlfmo1rHIE1rvFDvnnF4WtEZbk01mQ1qIrNwDiKQiSOpUeAfnnHdFNFaDgZtmgmIFMGWAo3QUxkDzMTCds3Y8dMXA5sHv499iAJFnh+aAExv3ShMZGEYwXFDVCd9GhgYen+///2mWa/b5cuPslu29uywbbkRHMs4w2IitBJpzRkb40yMUkyDKqLXLz9+eXr66E4H//AHr/24BNCoCEkAAAAASUVORK5CYII="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAN2AAADdgF91YLMAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAKhQTFRF////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiYmJh4eHh4eHYmRgdHZzent4iIiIjpCNlJaTmJiYxsbGx8fH1tbV3d3d5OXk5ubm+fn5+vr6////K1MtjgAAACh0Uk5TAAECAwUHCgwNEBEVFhkaGx0fISQlJicpKywtMTM2OTw+QkRGSV9k0Uavg1EAAACGSURBVHja7ZIxDsJADARv7YtQwjuAgv8/hQJ4SJRwvsWXgiJK5BrByo21I1taGynQH/gAZ+Qds/DhwKmH7gDG8Yl06TNk068s4x3pesiYJ1LkuCZYplsDurZuHjZmvH4GCIMKow6PFZ37e75aVFwqUMB7ksZq1WXVAbjnpdpJU+LiFDNboDelX2wh7CFXjgAAAABJRU5ErkJggg=="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAR8SURBVHja7VdNbxtVFD0ez4wdJ7VjkzQuakVQFlYaqVA7VVqgzgK1qpBASCFUqdpsuqCIBRILpLJkxx9gQRdIWVSIrFKgFSoB4rQLGhkEQbKjmqSoJLbT+iN2/DX+4t4nj5PK2ASo3Q1XusrLvHnv3HvPefeNDdVqFU/SJDxhk/WBgQyAsQNBVcjL1VrpmQIG50D6yJ8mN6O9liffIH9I2CVDLePBmZmZq16v16Moiow2WrFYLPl8Pv/09PQ5APcYzEQ+4na7PalUSs5ms+3lnIyxGJM8LNd472UajEYjrFYr2m1UepkxGVvWNVgqlTA5OYnh4WFIktQe9VUqCAQCmJ2dFZj6KTDoAQwNDcHpdLIoYbPZMDo6ytHC7/dja2vrcWQOTdPAWDpuXXDlcpm8RJNFnDp1Gs8eOYlvflyDZABOTxzBxsoSFha+5+AosGO8kXDdTCYTtrfTCIVCrQJgDMZq7AMcFQkUlu5uHDo8hg+u3MSF18YxfHAffIEEjrlGYVlaQiKZwK3bt/5lCcAYjPXXAXD2HrcbV78LINX1DLrNCu5Ft/HlT2FoIzZ4PB7cuHEdg4ODMBpl4rTM68Q4n8+JqmazGRYyA1HGFT524JO1f/8Alpd/QSIRbwhAp4AmymJBLqchW1Dw2e3f8YKrD+FEHqWKXbyTyWRw926IgyXQPAtWbPg3x5epYQpoffYRCqTdFWD3LS5i4vhBJDJFOMxVWNUSHqY1TL14CNe+uIYkibFnXw+6LBZYSagDTqegzSBJe3LJKDWngAWyuRlF0L+Aj994CYurWaw/SGP+fTe++vxTxOMx8I2xtrbaeKtJhj2cAsAoSc0pKNJEoaCJTB0kNO9JL6SchA8vf0TgcQKX/utB5Co0PQUEIF4S2SSTCQpk7p9kuLcKtKKAWzGLis8629Hnj8LhcGD+2/nH1YIZ45EApN0UCHDKtL+/H+9cOI+X79/HmeAKLl+8iL6+p3hOuMlsqo8VVRF/VZOqP2Oh1ceyIrPvzLWiQFSAeB464ETo3fdwxuWCi54vzs1h4PVXkahp4MTxE6SVgjh6VqsN6XQaFU6A1vMeiiwzEPd+EVgsFkcwGEAVogLNRcj8MNd/xGKwU5Ppv/QWMipldultRHK5ug7u3PmB32cAvl71DXlzLjM/17+y+H9dQ7oGmleAM2CVRqJRjI97kVlfR8osIzs2hngyCUVRxKaHR0ZE9jkKqre3lwG5wQgRd3VZUNQ05Kgz2u120djSqTTCkTCLgDFaiFASFIAGWKV2a/3kChwG4NeJCagrwbo4N6ObnC07jR+IlqyqqshsY32jnmEkHIFuvK+gQGpJgZFLJYD8v4VQmToL58AB+G5+zULaKStlrJVL+jp2XqfTyHdAi2NobEWBJCgQE1Tu5WBAuKwqO5uQxxLxhs0zu+4C5qLRRPCtWzHEB0MBbFQHLlk7vscaAqiy88Ozb06hE8ZfVzquHkCReeF+30ErMjaTpZI/R/4KeQ86Y9vk18l/5gD0IHrEuDNWrQWh/f/r+E+nRGpLxWSCfAAAAABJRU5ErkJggg=="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdQAAA3UB0GyjoQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAPZSURBVFiFtVZNTxtXFD3v+fsDuzFKoSlOKVjqigU42XTRLsO6SCgI1IpsUVeFqIl3/QlddJGuLSGhLlClLrvprksi70ydlKSlONhgz3g+mHdvF7Yn44+WmQiPZMk67869Z849984IZoaPK7p/cFDLz304m81kkc1mkUgmQY6Do+fPcf/ePTiOA8MwcHr2D6rV49OH6+sLAKzrEks/1QFELpvNO1pbk/U3b2S71ZKRUEgys/zx2TMpQ1ISsyRmyYBk8B0AYT+JfQUB4Fu5HGZnZxCNxdG+vHQPGo2G+18IASkEpPT7XP4VABGBmMFEb1n12icgBjFfXQ1GgJkZRASvZ5gZ9Y8K3ihw73fTBEBMYOoV8ODCq0iP1CQIuAqQpwAzY/rkj+FAcIAeBPQAAUMt6J+5xd8S9MUiGIGeAgMEmHF8fOySoEm1oG/AcT1eXFyElLKLU4ARCELAnQKP6dwkveIMnrACxCMtGChFDGaalAcYihTYswv6HnBjwCDivh9ulAArUmDmkTEcjOruCxrTpv+6fL8L2q0Wmo0GLMtGKpkcJcA9+YmglOrRuUECsVgcuVs5vD8zg0QiMRqA7giqSRFQpPDqr9eIxGKIx+NdsN+K7hLumlQR1EQ8oBSmp6dB/XHE6N7ve4QmoACYGUopkFIDJiQiaJqGTqcDXddhGgYM05wMAcdRcJRyMzMzhBBIp9IoPS3Btm2sbzxEOBT2TcD3HugroBzHlZ6IkLEsEBFisRhMywQRQZHymzaYAvaVjYuLC0SjUcSjUdi2jdvtNmzbxrdPnqBeP8OLly8nswmFELAsC1JKpFMpEDMikQjur65C13UYpgnDNKF3jIksIoD473a7/UEkHEHHMBBttRCJRvHZo0e4bLVwZdvQ9Q6Mjg7BfAqfCoggby4hxMcAcgByS0tL3xSLxQdSShweHn53fn5eAXAB4BxAg5lrfnL6VwAAM9eEEC8AYHl5eXVjY+NBIpGAZVkH5XK54onz/VT+P+A9yZmZp6amzLm5OeTzeaRSKYc9V5B8gVpQKpUeM4tPZSQRZohP8nfvFoQQ+PPV69+Eumqx03EKhcKv29vb378zga2treLCwsLX44LX1ta+SKfTUxaFYF6FkI3Z7pliiZAgOI5TL5fLvwzfm8lkft/d3f1hGB/xwMrKyvLm5uZXw7ht26hUKgPYGbpWFx5sfn7+9s7Ozsj91Wo1A+B6Ao7jmM1mcwDTNA26rqNWq1074+l0eiyuaVpnHD7WA3t7e+95CAlN0yQAJJPJn4QQn/8fgWKx+PPR0dGXw/jJyYm2v7/vDOP/ArVgxn4OAPFgAAAAAElFTkSuQmCC"

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAABuvAAAbrwFeGpEcAAAAB3RJTUUH1wwFCwA1ayewxgAABWBJREFUeNrtlsuOHEUWhr/Ia2d3Fba7bY+hFwghcZFggcQCXoAdC14BiYdhz3KQkHgDdjMjWZo1aFiMxd1tMHS5r3XrrKrMyowIToSjKydrNxILJHzUR391ZkSe/1wjeCbP5C8viiAffvKPJ+Nlc88YQ6QUKhJFEXkEpZQo/lm30WKtBePQYAWN0YIGo7XoNbYedeveaW7navrjl1/uf3X/7zYhyK/ns7s7gz2IYzRBrKi2G2P+L+BT4w4cGjoSTxXRazJWe3KewONvf+A/x6Ob5fRcAR0BKwxzWfzyjZil4M9zQ2fXaycbw7aHzlinukMhsJzP+enrByxmc4os2XxxQwAh8M5LQ957/Tb/PrriaHISjCm2pItER8AZ66Lgc5SgYkUUw2w65ei7c3R6m2z/gDSLSLRVdY9AnPHkfMKjYsH5OMa2OiRabZWMq4UIFcUeEfXo6kUh+2r0eiVaYesljx884HR0gm7WWN0I0Qadpejp6VYE1ld8P7nJDzMtrGOy3Rvh4//r9nVIG9E1pnHYoNsW0zY0ghB7MvW85OE3D1kthYgaYBMtGNKSZZDWfQJtY2gWJW+/VvDfny5Y1a0PrRfPwpGJBUS9596QLyNLjI1SVGJ8Ks9+Oeb48cjXlYoionRHlueyNSNCk6ma6upJj4BKsoJXXhzywbsTXnsh4/P7ufM4hFx5DGRCE6iQ/6Da0K4qfj0aefL5jb8RJym2KWkXE3l3ynp1RdsaimKPZjnvR6CaXaiHRzP+WVwymt0kSe4Kqz1hnqK1M2nAdjx8FAKxOFKUF2NGozHGrIlaMVQtqKolxqa+IK0RTZ4jUhoVJ25/n4C1itU65V9f3wtPZmDGrqqI41jWJxBFLh5u82YO6Lrm8Y+PmE5LJNY+VdgIq3ZR+Q5J5Loh8+8il762Ik8MVXlCrwtMq0Vb8AZUMOSYprQu3FrUuGddJ5SzkifH57RNTlwkzguXZ5dPkjTF1nOp7TPaq2OxK1GpK4yQa3d2qKe/QY+Abj2BYGALI8GOmDGW85Mxi9qI4SHpMBVPFXpxyXp+SjOdSPWXwjkX7wtQQ2w+kCAYlNFEWSx+XfYJEOXeW3ud4mDU9TtR4lAgZb02TCdjP3AyO6edXlFJcdVVjcqGYmQPikOSAmJjXdt652zbYJq1/9+LNVs1UF1gKFyrdZUOzpDo0/69PDljPp2jo4J0sE+6e4vkziGZhPxmrJwBN4DcTHCDJxxCofcdGWLRhAhDPBv1CejIVaiLQph0sfM6EUz95suzMU2WUNy55wnhPKskAuUlWgzO1o0vZLB+fXcO6ICOTOMn5W6RQz3dSoG8sJENM895jd84kfYay4jGFZeom5JsxrAzGM60WEhfn4Ro+qLCVE2wsaJpcSej6g2ialGSNNmm8Jp1y8XpmLWsVlHuUhNSwlND0dYRaUwYSh47he53OMCMcbBdA9ow2Ek9gWW5YjWZs5cnDIrcjdONojwGotebCaE3AsZheOyvNB5BhVPTsljW1PNf+gSGgwHP33uRF+4e8NnHH/VOQqX6J2KAvtiA152D8g8PDw/J85zlcim5L7gcj9m/8wbTumtDsv1XctNW1VUdF3V0wHw84o+SW7vQpCllWWKHQ8rLC9Jbb9bN9OccaL0f+Z23dg72s/fr2fGgFqbGmL6XPpT/p4RBti0ufXE2KGdnj74A6hCBV9cHr750P8tSv3EhNTAbzzGWkPvYo6/8awyX1O6K2N0JMdqh01B8yi1y6tesVo3h7NN6kwJltVWxmjfaOItkuwX7Mq9PfzujrV0XmEDCtaAVtL26sP7jho6AQ92fA8b43+Giankmfxb5HUefmJvWu4NvAAAAAElFTkSuQmCC"

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAATJSURBVHjaxZdbiBtVHMa/c85MJsnkstlst9vtVrzg4qWttfUKPhSUIlgqfRCrCOJDqxX0Rfumj6Lgg9CFvqnFKmLBlyouKAj6UBWsFHqRtrq17d432+4mm0zmnDnneM5M2u3Ltt01wY98+c9MMny/nP8/4YRorfF/ysEKdGT/uw/mCu5uaPqk4zg1BTrMCR3a9tLb01imlrUCw0Nvel5+1ZcLC42d9raMn0fWL8DLZAAKqQR/59Gdez/AMkSxDLFM+XAjEDsJYaCUwfMySOdyKJR60N3Tz7LF8vu/fT20uyMAP3/23q4gaO6oVavQAAghkFoCWkNpBUIJGDVgqcyBHz7f57d9BiKF18JQ4L6N61GtNTE/X8XM9BQiCXAhQBIsWx2HlLcD+KqtAEGTP7Bh0wYMrFsHmi6AeT4aQQhAI+vn4zo+cgZnTxxHOsOebjsAISTT010EYY6xCxAK3/QflIGYY60k+u+4G9Url1Gfmxpo+wz4hVzN9VJJoDFArG344jVzXO5bA89LV9oKMPLTFw+v7e/7hxKaBBNjq1bBdV/lYqkbpXJpsK0AEKmz+UKBXQtSyqYmDyXtE7ROrjkOQyrtnWgrwJ1PPTcvomhMk9aHJrq1CMpUSyFBlDG0OYyuaCH2t30GGvXwFUTitFYCiDigI0BFJtCaQyt7Ls2Df3LbEy/+0XaAwa0vVLSODumIm+wmFA8AFQKyaWwrh+J1kJAf7NhPscucT8NmXSsTqIWBEKbKKLaKAkyMXgxy92492TEAf/2OqYmZuREluAkMDUC8EsYN8EYN1Tr/EUadAkggSv1HR8cmbfgigGnJ8ZOnkCl0Hev4fiDt52XaH8TZC+dgB1JyjkYgcPs994OBBh0HYJSUcsVVSKV9TF46j1p1Dr1ri8hmC+A8KHW0BVEkszS35hnKHLiOC8d1TXXAzDkBkCoMvGreU2w7wEyluX50/PLB6dnapEx1OYKk4z2AFAKxCIPKroab7yuKSI5Wa8HHs7WFzf9pSyaEdGZmF14WEd+bzaS3uA6DlDLeiDBGIYRCo74AqYFC3kcq5SLtubgqpRS0xi8APcAYDrsu47cMMFGpPXR5tvp9/+quEqUElFKwVtVaGQCGq7L3W6jrpZMXDIQGCGytEOhns9n00ZsCzM/XBsZn6sd7y36ZUgbHhBl6E7JU4NKSUkFbCApTUXFd9oiXcs7fcAZGLs5+013IlAkImAlyHQpDb5OhlQJJKG7JdvUI0VBSW/CeSMhDNxzCaR6VXNfZqE2wNGHMhNtEjcQgMcotG7YSChW3QyEU4vG5+erAkgD1sStvdJd8CiT908mO19YVGyZYSWNlW2fz6K4lAYKQv04IvTZIUWTDSXzzSiVbM6ZhgQAu1PNLAkioXteNF6D1ZomUw9AMhT1fkaXUtp2mwojYod60JMCvv//92OkzYxO1eghGSUxtJbi0PWxZx5bx8aLl4muta0nrokjGEM2mwJ/nJi4dGT62+aa/Ax8e+K5v8K6+fat7i9vKXbl1XsrNOQ6hSoEomcyFlK1wO+1IYJnjgNqVptAykpJzWWsEzdHx6eq3f10Y++itPdsrK/9z2tLQ0LAnGOvlUH0eI2sU1VqGagKaTHZ5vVN79mwRWIb+Bde9CdrNEBZYAAAAAElFTkSuQmCC"

/***/ }

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