(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__(196);
	__webpack_require__(201);
	__webpack_require__(205);
	__webpack_require__(191);
	__webpack_require__(192);
	__webpack_require__(189);
	__webpack_require__(182);
	__webpack_require__(181);
	__webpack_require__(188);
	__webpack_require__(203);
	__webpack_require__(190);
	__webpack_require__(209);
	__webpack_require__(187);
	__webpack_require__(42);
	__webpack_require__(208);
	__webpack_require__(186);
	__webpack_require__(185);
	__webpack_require__(199);
	__webpack_require__(194);
	__webpack_require__(210);
	__webpack_require__(195);
	__webpack_require__(198);
	__webpack_require__(197);
	__webpack_require__(200);
	__webpack_require__(193);
	__webpack_require__(43);
	__webpack_require__(202);
	__webpack_require__(204);
	__webpack_require__(184);
	__webpack_require__(183);
	__webpack_require__(206);
	__webpack_require__(207);
	__webpack_require__(647);


/***/ },

/***/ 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,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"

/***/ },

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

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

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIXSURBVDiNlVFBaxNBGH0zs7NJtk1KYillzaVEvQTSQPQQPPQieLIgFPwL6kXwonj1lpMn0X8gHgviL1DEWwIpIckhEhLsQps0bCcz3ZmMp4ZN0hb84Dt8zHuP994Qay2ums3Nzf10Ov2WUupKKX+PRqN3QojxMo5cJeB5nr+9vf2tVCqVNzY2cHJygmaz+eP4+PhACPE3jqXL5K2trVo+nz/K5/Nlxhjq9TrCMESxWHyYzWY/3uggnU4/9n3/sFgsukopDIdDKKUu32CMUe12++lkMvl+pYNkMvkol8u5o9EI3W4XQggYY2CMwXg8BiEk4XneszjHiR+Msftra2sYDAYwxqx0E4YhGGN3rhWw1t6WUkIphdlstiKgtYbW+ta1AsaY4PT09C6lFFEUrQgAwMXFxc/4vdCBlPJwMpmAEAJr7Tz/5U6n056U8kucs/ALhBDH87xaKpV6TilNxaLh/Py8ppR6b4wJb+pAA3idSCSOPM/7TCmdO9Ra/1omr0QAAMdxypTSJ9ZaGrfPOX/juu4+IYSsRCCEJDjnLyilB+vr6w8qlYobBAE6nc4cuLe3h7OzM9toNBpSyq9a6w+z2UwQx3FeMcZeFgqFezs7O4iiCK1WC0EQLDhjjKFQKMD3ffT7ffR6vT9KqU+Ecy6q1WpKCIF2u43pdLqcamWy2SwymQwGg0EEzrnd3d21hJD/Ws655Zzbf0QyFxgwQ+pFAAAAAElFTkSuQmCC"

/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Addressbook
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2007-2013 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.ns('Tine.Addressbook');
	
	/**
	 * Contact grid panel
	 * 
	 * @namespace   Tine.Addressbook
	 * @class       Tine.Addressbook.ContactGridPanel
	 * @extends     Tine.widgets.grid.GridPanel
	 * 
	 * <p>Contact Grid Panel</p>
	 * 
	 * @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)
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Addressbook.ContactGridPanel
	 */
	Tine.Addressbook.ContactGridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
	    /**
	     * record class
	     * @cfg {Tine.Addressbook.Model.Contact} recordClass
	     */
	    recordClass: Tine.Addressbook.Model.Contact,
	    
	    /**
	     * grid specific
	     * @private
	     */ 
	    defaultSortInfo: {field: 'n_fileas', direction: 'ASC'},
	    gridConfig: {
	        autoExpandColumn: 'n_fileas',
	        enableDragDrop: true,
	        ddGroup: 'containerDDGroup'
	    },
	    copyEditAction: true,
	    felamimail: false,
	    multipleEdit: true,
	    duplicateResolvable: true,
	    
	    /**
	     * @cfg {Bool} hasDetailsPanel 
	     */
	    hasDetailsPanel: true,
	    
	    /**
	     * inits this cmp
	     * @private
	     */
	    initComponent: function() {
	        this.recordProxy = Tine.Addressbook.contactBackend;
	        
	        // check if felamimail is installed and user has run right and wants to use felamimail in adb
	        if (Tine.Felamimail && Tine.Tinebase.common.hasRight('run', 'Felamimail') && Tine.Felamimail.registry.get('preferences').get('useInAdb')) {
	            this.felamimail = (Tine.Felamimail.registry.get('preferences').get('useInAdb') == 1);
	        }
	        this.gridConfig.cm = this.getColumnModel();
	
	        if (this.hasDetailsPanel) {
	            this.detailsPanel = this.getDetailsPanel();
	        }
	
	        Tine.Addressbook.ContactGridPanel.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 array with columns
	     * 
	     * @return {Array}
	     */
	    getColumns: function() {
	        return Tine.Addressbook.ContactGridPanel.getBaseColumns(this.app.i18n)
	            .concat(this.getModlogColumns().concat(this.getCustomfieldColumns()));
	    },
	    
	    /**
	     * @private
	     */
	    initActions: function() {
	        this.actions_import = new Ext.Action({
	            //requiredGrant: 'addGrant',
	            text: this.app.i18n._('Import contacts'),
	            disabled: false,
	            handler: this.onImport,
	            iconCls: 'action_import',
	            scope: this,
	            allowMultiple: true
	        });
	        
	        // register actions in updater
	        this.actionUpdater.addActions([
	            this.actions_import
	        ]);
	        
	        Tine.Addressbook.ContactGridPanel.superclass.initActions.call(this);
	    },
	
	    /**
	     * get default / selected addressbook container
	     *
	     * @returns {Object|Tine.Tinebase.Model.Container}
	     */
	    getDefaultContainer: function() {
	        return this.app.getMainScreen().getWestPanel().getContainerTreePanel().getDefaultContainer('defaultAddressbook');
	    },
	    
	    /**
	     * returns details panel
	     * 
	     * @private
	     * @return {Tine.Addressbook.ContactGridDetailsPanel}
	     */
	    getDetailsPanel: function() {
	        return new Tine.Addressbook.ContactGridDetailsPanel({
	            gridpanel: this,
	            il8n: this.app.i18n,
	            felamimail: this.felamimail
	        });
	    }
	});
	
	// Static Methods
	
	/**
	 * tid renderer
	 * 
	 * @private
	 * @return {String} HTML
	 */
	Tine.Addressbook.ContactGridPanel.contactTypeRenderer = function(data, cell, record) {
	    var i18n = Tine.Tinebase.appMgr.get('Addressbook').i18n,
	        hasAccount = ((record.get && record.get('account_id')) || record.account_id),
	        cssClass = hasAccount ? 'renderer_typeAccountIcon' : 'renderer_typeContactIcon',
	        qtipText = Tine.Tinebase.common.doubleEncode(hasAccount ? i18n._('Contact of a user account') : i18n._('Contact'));
	    
	    return '<div ext:qtip="' + qtipText + '" style="background-position:0px;" class="' + cssClass + '">&#160</div>';
	};
	
	Tine.Addressbook.ContactGridPanel.displayNameRenderer = function(data) {
	    var i18n = Tine.Tinebase.appMgr.get('Addressbook').i18n;
	    return data ?  Tine.Tinebase.EncodingHelper.encode(data) : ('<div class="renderer_displayNameRenderer_noName">' + i18n._('No name') + '</div>');
	};
	
	Tine.Addressbook.ContactGridPanel.countryRenderer = function(data) {
	    data = Locale.getTranslationData('CountryList', data);
	    return data;
	};
	
	/**
	 * Column renderer adb preferred_address field
	 * @param value
	 * @return {*}
	 */
	Tine.Addressbook.ContactGridPanel.preferredAddressRenderer = function(value) {
	    var i18n = Tine.Tinebase.appMgr.get('Addressbook').i18n;
	
	    switch (value) {
	        case '0':
	            return i18n._('Business');
	        case '1':
	            return i18n._('Private');
	        default:
	            return i18n._('Not set');
	    }
	};
	
	/**
	 * Statically constructs the columns used to represent a contact. Reused by ListMemberGridPanel + ListMemberRoleGridPanel
	 */
	Tine.Addressbook.ContactGridPanel.getBaseColumns = function(i18n) {
	    var columns = [
	        { id: 'type', header: i18n._('Type'), dataIndex: 'type', width: 30, renderer: Tine.Addressbook.ContactGridPanel.contactTypeRenderer.createDelegate(this), hidden: false },
	        { id: 'tags', header: i18n._('Tags'), dataIndex: 'tags', width: 50, renderer: Tine.Tinebase.common.tagsRenderer, sortable: false, hidden: false  },
	        { id: 'salutation', header: i18n._('Salutation'), dataIndex: 'salutation', renderer: Tine.Tinebase.widgets.keyfield.Renderer.get('Addressbook', 'contactSalutation') },
	        {
	            id: 'container_id',
	            dataIndex: 'container_id',
	            header: Tine.Addressbook.Model.Contact.getContainerName(),
	            width: 150,
	            renderer: Tine.Tinebase.common.containerRenderer
	        },
	        { id: 'n_prefix', header: i18n._('Title'), dataIndex: 'n_prefix', width: 80 },
	        { id: 'n_middle', header: i18n._('Middle Name'), dataIndex: 'n_middle', width: 80 },
	        { id: 'n_family', header: i18n._('Last Name'), dataIndex: 'n_family' },
	        { id: 'n_given', header: i18n._('First Name'), dataIndex: 'n_given', width: 80 },
	        { id: 'n_fn', header: i18n._('Full Name'), dataIndex: 'n_fn', renderer: Tine.Addressbook.ContactGridPanel.displayNameRenderer },
	        { id: 'n_fileas', header: i18n._('Display Name'), dataIndex: 'n_fileas', hidden: false, renderer: Tine.Addressbook.ContactGridPanel.displayNameRenderer},
	        { id: 'org_name', header: i18n._('Company'), dataIndex: 'org_name', width: 120, hidden: false },
	        { id: 'org_unit', header: i18n._('Unit'), dataIndex: 'org_unit'  },
	        { id: 'title', header: i18n._('Job Title'), dataIndex: 'title' },
	//            { id: 'role', header: i18n._('Job Role'), dataIndex: 'role' },
	//            { id: 'room', header: i18n._('Room'), dataIndex: 'room' },
	        { id: 'adr_one_street', header: i18n._('Street'), dataIndex: 'adr_one_street' },
	        { id: 'adr_one_locality', header: i18n._('City'), dataIndex: 'adr_one_locality', width: 150, hidden: false },
	        { id: 'adr_one_region', header: i18n._('Region'), dataIndex: 'adr_one_region' },
	        { id: 'adr_one_postalcode', header: i18n._('Postalcode'), dataIndex: 'adr_one_postalcode' },
	        { id: 'adr_one_countryname', header: i18n._('Country'), dataIndex: 'adr_one_countryname', renderer: Tine.Addressbook.ContactGridPanel.countryRenderer },
	        { id: 'adr_two_street', header: i18n._('Street (private)'), dataIndex: 'adr_two_street' },
	        { id: 'adr_two_locality', header: i18n._('City (private)'), dataIndex: 'adr_two_locality' },
	        { id: 'adr_two_region', header: i18n._('Region (private)'), dataIndex: 'adr_two_region' },
	        { id: 'adr_two_postalcode', header: i18n._('Postalcode (private)'), dataIndex: 'adr_two_postalcode' },
	        { id: 'adr_two_countryname', header: i18n._('Country (private)'), dataIndex: 'adr_two_countryname', renderer: Tine.Addressbook.ContactGridPanel.countryRenderer },
	        { id: 'preferred_address', header: i18n._('Preferred Address'), dataIndex: 'preferred_address', renderer: Tine.Addressbook.ContactGridPanel.preferredAddressRenderer },
	        { id: 'email', header: i18n._('Email'), dataIndex: 'email', width: 150, hidden: false },
	        { id: 'tel_work', header: i18n._('Phone'), dataIndex: 'tel_work', hidden: false },
	        { id: 'tel_cell', header: i18n._('Mobile'), dataIndex: 'tel_cell', hidden: false },
	        { id: 'tel_fax', header: i18n._('Fax'), dataIndex: 'tel_fax' },
	        { id: 'tel_car', header: i18n._('Car phone'), dataIndex: 'tel_car' },
	        { id: 'tel_pager', header: i18n._('Pager'), dataIndex: 'tel_pager' },
	        { id: 'tel_home', header: i18n._('Phone (private)'), dataIndex: 'tel_home' },
	        { id: 'tel_fax_home', header: i18n._('Fax (private)'), dataIndex: 'tel_fax_home' },
	        { id: 'tel_cell_private', header: i18n._('Mobile (private)'), dataIndex: 'tel_cell_private' },
	        { id: 'email_home', header: i18n._('Email (private)'), dataIndex: 'email_home' },
	        { id: 'url', header: i18n._('Web'), dataIndex: 'url' },
	        { id: 'url_home', header: i18n._('URL (private)'), dataIndex: 'url_home' },
	        { id: 'note', header: i18n._('Note'), dataIndex: 'note' },
	        { id: 'tz', header: i18n._('Timezone'), dataIndex: 'tz' },
	        { id: 'geo', header: i18n._('Geo'), dataIndex: 'geo' },
	        { id: 'bday', header: i18n._('Birthday'), dataIndex: 'bday', renderer: Tine.Tinebase.common.dateRenderer },
	        { id: 'memberroles', header: i18n._('List Roles'), dataIndex: 'memberroles', renderer: Tine.Addressbook.ListMemberRoleRenderer }
	    ];
	
	    if (Tine.Tinebase.appMgr.get('Addressbook').featureEnabled('featureIndustry')) {
	        columns.push({ id: 'industry', header: i18n._('Industry'), dataIndex: 'industry', renderer: Tine.Tinebase.common.foreignRecordRenderer});
	    }
	    
	    return columns;
	};
	
	/**
	 *list member role render
	 *
	 * @param value
	 * @returns {string}
	 * @constructor
	 */
	Tine.Addressbook.ListMemberRoleRenderer = function(value) {
	    if (Ext.isArray(value)) {
	        var result = [];
	        Ext.each(value, function(memberrole) {
	            if (memberrole.list_role_id.name) {
	                result.push(memberrole.list_role_id.name);
	            }
	        });
	        return result.toString();
	    }
	
	    return '';
	};


/***/ },

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

	/*
	 * Tine 2.0
	 * contacts combo box and store
	 * 
	 * @package     Addressbook
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2007-2016 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	
	Ext.ns('Tine.Addressbook');
	
	/**
	 * contact selection combo box
	 * 
	 * @namespace   Tine.Addressbook
	 * @class       Tine.Addressbook.SearchCombo
	 * @extends     Ext.form.ComboBox
	 * 
	 * <p>Contact Search Combobox</p>
	 * <p><pre>
	 * TODO         make this a twin trigger field with 'clear' button?
	 * TODO         add switch to filter for expired/enabled/disabled user accounts
	 * </pre></p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Addressbook.SearchCombo
	 * 
	 * TODO         add     forceSelection: true ?
	 */
	Tine.Addressbook.ContactSearchCombo = Ext.extend(Tine.Tinebase.widgets.form.RecordPickerComboBox, {
	    
	    /**
	     * @cfg {Boolean} userOnly
	     */
	    userOnly: false,
	    
	    /**
	     * use account objects/records in get/setValue
	     * 
	     * @cfg {Boolean} legacy
	     * @legacy
	     * 
	     * TODO remove this later
	     */
	    useAccountRecord: false,
	    allowBlank: false,
	    
	    itemSelector: 'div.search-item',
	    minListWidth: 350,
	    
	    //private
	    initComponent: function(){
	        this.app = Tine.Tinebase.appMgr.get('Addressbook');
	
	        if (this.recordClass === null) {
	            this.recordClass = Tine.Addressbook.Model.Contact;
	            this.recordProxy = Tine.Addressbook.contactBackend;
	        }
	
	        this.emptyText = this.emptyText || (this.userOnly ?
	            this.app.i18n._('Search for users ...') :
	            this.app.i18n._('Search for Contacts ...')
	        );
	
	        this.initTemplate();
	        Tine.Addressbook.SearchCombo.superclass.initComponent.call(this);
	    },
	    
	    /**
	     * is called in accountMode to reset the value
	     * @param value
	     */
	    processValue: function(value) {
	        if (this.useAccountRecord) {
	            if (value == '') {
	                this.accountId = null;
	                this.selectedRecord = null;
	            }
	        }
	        return Tine.Addressbook.SearchCombo.superclass.processValue.call(this, value);
	    },
	
	    /**
	     * use beforequery to set query filter
	     * 
	     * @param {Event} qevent
	     */
	    onBeforeQuery: function(qevent){
	        Tine.Addressbook.SearchCombo.superclass.onBeforeQuery.apply(this, arguments);
	
	        var contactFilter = {condition: 'AND', filters: this.store.baseParams.filter},
	            pathFilter = { field: 'path', operator: 'contains', value: qevent.query };
	
	        this.store.baseParams.filter = [{condition: "OR", filters: [
	            contactFilter,
	            pathFilter
	        ] }];
	
	        if (this.userOnly) {
	            this.store.baseParams.filter.push({field: 'type', operator: 'equals', value: 'user'});
	        }
	    },
	    
	    /**
	     * init template
	     * @private
	     */
	    initTemplate: function() {
	        // Custom rendering Template
	        if (! this.tpl) {
	            this.tpl = new Ext.XTemplate(
	                '<tpl for="."><div class="search-item addressbook-search-combo x-combo-list-item">',
	                    '<table>',
	                        '<tr>',
	                            '<td style="min-width: 20px;">{[Tine.Addressbook.ContactGridPanel.contactTypeRenderer(null, null, values)]}</td>',
	                            '<td width="30%"><b>{[Tine.Addressbook.ContactGridPanel.displayNameRenderer(values.n_fileas)]}</b><br/>,' +
	                                '{[Tine.Tinebase.EncodingHelper.encode(values.org_name)]}</td>',
	                            '<td width="25%">{[Tine.Tinebase.EncodingHelper.encode(values.adr_one_street)]}<br/>',
	                                '{[Tine.Tinebase.EncodingHelper.encode(values.adr_one_postalcode)]} {[this.encode(values.adr_one_locality)]}</td>',
	                            '<td width="25%">{[Tine.Tinebase.EncodingHelper.encode(values.tel_work)]}<br/>{[Tine.Tinebase.EncodingHelper.encode(values.tel_cell)]}</td>',
	                            '<td width="50px">',
	                                '<img width="45px" height="39px" src="{jpegphoto}" />',
	                            '</td>',
	                        '</tr>',
	                    '</table>',
	                    '{[Tine.widgets.path.pathsRenderer(values.paths, this.getLastQuery())]}',
	                '</div></tpl>', {
	                    getLastQuery: this.getLastQuery.createDelegate(this)
	                }
	            );
	        }
	    },
	    
	    getValue: function() {
	        if (this.useAccountRecord) {
	            if (this.selectedRecord) {
	                return this.selectedRecord.get('account_id');
	            } else {
	                return this.accountId;
	            }
	        } else {
	            return Tine.Addressbook.SearchCombo.superclass.getValue.call(this);
	        }
	    },
	
	    setValue: function (value) {
	        if (this.useAccountRecord) {
	            if (value) {
	                if(value.accountId) {
	                    // account object
	                    this.accountId = value.accountId;
	                    value = value.accountDisplayName;
	                } else if (typeof(value.get) == 'function') {
	                    // account record
	                    this.accountId = value.get('id');
	                    value = value.get('name');
	                }
	            } else {
	                this.accountId = null;
	                this.selectedRecord = null;
	            }
	        }
	        return Tine.Addressbook.SearchCombo.superclass.setValue.call(this, value);
	    }
	
	});
	
	// legacy
	Tine.Addressbook.SearchCombo = Tine.Addressbook.ContactSearchCombo;
	
	Ext.reg('addressbookcontactpicker', Tine.Addressbook.ContactSearchCombo);
	Tine.widgets.form.RecordPickerManager.register('Addressbook', 'Contact', Tine.Addressbook.ContactSearchCombo);


/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIESURBVDiNjZLPalNREMa/c+6f3OSmSfPvRlIrbUpAQarWggsR8gKCiEKfoOhCV24EN924cOMTuFYsom8gFESwC1FaQWjUoIbGQJuE29uc3HtmXFSq1RvJwNkM3/nNzDcjmBmjYv3ZwyXTMNrnrtx+OUoj4gCvHj84NRioN74fpAvlClKpVN/g4Ykzl2/2/tbKOCoRnkbEaQJDWjYyXiVj2M6LOK0Zl0y67tTZxUWIVBGaD4gfv3+pjQX49no1WSrmesJK5EzbgW0lAACVmerXOMA/I2ypUpjJuC0ICSEAgMFMmMhMNMYC1Ov1iKPwLiIFkAKHAUgFkSH4zlgAAMgvXFtrfm5EOuiChwE23q+rdPXidpw21kQAgJPrbn7YKA6VRnrSi21/ZAdRROL43Olcbf4SEm4W3vRsNYooVnsk2erpcqezd3+n628PzBKFZhb56Xm2CjWDiBpKhffCUHt//jm8xHa7d11K40nKNaUhDQAMKY8WJWJorYeWZS7Ztvn8EDBQobHV/LE/Vc5aTsKGONhfbIShhibuJx3LS9imkgDwqdW5lc+6FiDAzP99xAwindn1964Cv7aw2/HLdtkgBknTlDBkrF9gZig1hB8o2un6c8fy2d8erKys2t5MoX5hYfZG0nFOEmuXNBxiAoQIBHF/Xw03375rPpLh5Nry8vkQAH4CWJX2/6ITvsAAAAAASUVORK5CYII="

/***/ },

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

	/*
	 * Tine 2.0
	 *
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Michael Spahn <m.spahn@metaways.de>
	 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Addressbook');
	
	/**
	 * Render given addresss
	 *
	 * You need to pass the record and a config to use this renderer.
	 * The config contains a mapping, which fields from the record should have which place in the template.
	 * Undefined fields won't be rendered, this keeps it well reusable for all address like purposes.
	 *
	 * @namespace   Tine.Addressbook
	 * @author      Michael Spahn <m.spahn@metaways.de>
	 * @singleton
	 */
	Tine.Addressbook.addressRenderer = function (v, metadata, record, store, a, b, config) {
	    var template = new Ext.XTemplate(
	        '<tpl for="." class="address">' +
	        '<tpl if="street">{street} <br /></tpl>' +
	        '<tpl if="street2">{street2} <br /></tpl>' +
	        '<tpl if="postalcode">{postalcode}</tpl> <tpl if="locality">{locality}</tpl><br />' +
	        '<tpl if="region">{region} <br /></tpl>' +
	        '<tpl if="country">{country}</tpl>' +
	        '</tpl>');
	    template.compile();
	
	    var local = Ext.apply({}, config);
	    var keys = Object.keys(local);
	
	    // According to config, resolve the given fields from record
	    keys.forEach(function (key) {
	        local[key] = Tine.Tinebase.EncodingHelper.encode(record.get(local[key]));
	
	        // Country code to country name
	        // @todo: Wouldn't it be cool, if this could be managed by the modelconfig as well?
	        if (key === 'country') {
	            var countryRenderer = Tine.widgets.grid.RendererManager.get("Addressbook", "Addressbook_Model_Contact", "country", "displayPanel");
	            local[key] = countryRenderer(local[key]);
	        }
	    });
	
	    return template.applyTemplate(local);
	};
	
	Tine.widgets.grid.RendererManager.register('Addressbook', 'Addressbook_Model_Contact', 'addressblock', Tine.Addressbook.addressRenderer, 'displayPanel');

/***/ },

/***/ 182:
/***/ 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-2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	
	Ext.ns('Tine.Addressbook');
	
	/**
	 * @namespace   Tine.Addressbook
	 * @class       Tine.Addressbook.Application
	 * @extends     Tine.Tinebase.Application
	 * Addressbook Application Object <br>
	 * 
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 */
	Tine.Addressbook.Application = Ext.extend(Tine.Tinebase.Application, {
	    
	    /**
	     * auto hook text i18n._('New Contact')
	     */
	    addButtonText: 'New Contact',
	    
	    /**
	     * Get translated application title of the calendar application
	     * 
	     * @return {String}
	     */
	    getTitle: function() {
	        return this.i18n.ngettext('Addressbook', 'Addressbooks', 1);
	    },
	
	    /** 
	     * Overide get main screen to allow for feature gating
	     *
	     **/
	    getMainScreen: function() {
	        var mainscreen = Tine.Addressbook.Application.superclass.getMainScreen.call(this);
	
	        if (!Tine.Tinebase.appMgr.get('Addressbook').featureEnabled('featureListView')
	            && !Tine.Tinebase.appMgr.get('Addressbook').featureEnabled('featureResources')) {
	            mainscreen.useModuleTreePanel = false;
	        }
	
	        return mainscreen;
	    },
	
	    registerCoreData: function() {
	        Tine.CoreData.Manager.registerGrid('adb_lists', Tine.Addressbook.ListGridPanel, {
	            app: this,
	            initialLoadAfterRender: false
	        });
	
	        Tine.CoreData.Manager.registerGrid(
	            'adb_list_roles',
	            Tine.widgets.grid.GridPanel,
	            {
	                recordClass: Tine.Addressbook.Model.ListRole,
	                app: this,
	                initialLoadAfterRender: false,
	                // TODO move this to a generic place
	                gridConfig: {
	                    autoExpandColumn: 'name',
	                    columns: [{
	                        id: 'id',
	                        header: this.i18n._("ID"),
	                        width: 150,
	                        sortable: true,
	                        dataIndex: 'id',
	                        hidden: true
	                    }, {
	                        id: 'name',
	                        header: this.i18n._("Name"),
	                        width: 300,
	                        sortable: true,
	                        dataIndex: 'name'
	                    }, {
	                        id: 'description',
	                        header: this.i18n._("Description"),
	                        width: 300,
	                        sortable: true,
	                        dataIndex: 'description',
	                        hidden: true
	                    }]
	                }
	            }
	        );
	        
	        Tine.CoreData.Manager.registerGrid(
	            'adb_industries',
	            Tine.widgets.grid.GridPanel,
	            {
	                recordClass: Tine.Addressbook.Model.Industry,
	                app: this,
	                initialLoadAfterRender: false,
	                // TODO move this to a generic place
	                gridConfig: {
	                    autoExpandColumn: 'name',
	                    columns: [{
	                        id: 'id',
	                        header: this.i18n._("ID"),
	                        width: 150,
	                        sortable: true,
	                        dataIndex: 'id',
	                        hidden: true
	                    }, {
	                        id: 'name',
	                        header: this.i18n._("Name"),
	                        width: 300,
	                        sortable: true,
	                        dataIndex: 'name'
	                    }, {
	                        id: 'description',
	                        header: this.i18n._("Description"),
	                        width: 300,
	                        sortable: true,
	                        dataIndex: 'description',
	                        hidden: true
	                    }]
	                }
	            }
	        );
	    }
	});
	
	/**
	 * @namespace   Tine.Addressbook
	 * @class       Tine.Addressbook.MainScreen
	 * @extends     Tine.widgets.MainScreen
	 * MainScreen of the Addressbook Application <br>
	 * 
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 */
	Tine.Addressbook.MainScreen = Ext.extend(Tine.widgets.MainScreen, {
	    activeContentType: 'Contact',
	    contentTypes: [
	        {model: 'Contact', requiredRight: null, singularContainerMode: false}
	    ],
	
	    initComponent: function() {
	        if(Tine.Tinebase.appMgr.get('Addressbook').featureEnabled('featureResources')) {
	           this.contentTypes.push({model: 'Resource', requiredRight: null, singularContainerMode: true});
	        }
	
	        if(Tine.Tinebase.appMgr.get('Addressbook').featureEnabled('featureListView')) {
	            this.contentTypes.push({model: 'List', requiredRight: null, singularContainerMode: false});
	        }
	        
	        Tine.Addressbook.MainScreen.superclass.initComponent.call(this);
	    }
	});
	
	Tine.Addressbook.ContactTreePanel = function(config) {
	    Ext.apply(this, config);
	    
	    this.id = 'Addressbook_Contact_Tree';
	    this.filterMode = 'filterToolbar';
	    this.recordClass = Tine.Addressbook.Model.Contact;
	    Tine.Addressbook.ContactTreePanel.superclass.constructor.call(this);
	};
	Ext.extend(Tine.Addressbook.ContactTreePanel , Tine.widgets.container.TreePanel);
	
	Tine.Addressbook.ListTreePanel = function(config) {
	    Ext.apply(this, config);
	    
	    this.id = 'Addressbook_List_Tree';
	    this.filterMode = 'filterToolbar';
	    this.recordClass = Tine.Addressbook.Model.List;
	    Tine.Addressbook.ListTreePanel.superclass.constructor.call(this);
	};
	Ext.extend(Tine.Addressbook.ListTreePanel , Tine.widgets.container.TreePanel);
	
	
	Tine.Addressbook.handleRequestException = Tine.Tinebase.ExceptionHandler.handleRequestException;
	
	Tine.Addressbook.ContactFilterPanel = function(config) {
	    Ext.apply(this, config);
	    Tine.Addressbook.ContactFilterPanel.superclass.constructor.call(this);
	};
	
	Ext.extend(Tine.Addressbook.ContactFilterPanel, Tine.widgets.persistentfilter.PickerPanel, {
	    filter: [{field: 'model', operator: 'equals', value: 'Addressbook_Model_ContactFilter'}]
	});
	
	Tine.Addressbook.ListFilterPanel = function(config) {
	    Ext.apply(this, config);
	    Tine.Addressbook.ListFilterPanel.superclass.constructor.call(this);
	};
	
	Ext.extend(Tine.Addressbook.ListFilterPanel, Tine.widgets.persistentfilter.PickerPanel, {
	    filter: [{field: 'model', operator: 'equals', value: 'Addressbook_Model_ListFilter'}]
	});


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Addressbook
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Stefanie Stamer <s.stamer@metaways.de>
	 * @copyright   Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	
	Ext.namespace('Tine.Addressbook');
	
	/**
	 * admin settings panel
	 * 
	 * @namespace   Tine.Addressbook
	 * @class       Tine.Addressbook.AdminPanel
	 * @extends     Ext.TabPanel
	 * 
	 * <p>Addressbook Admin Panel</p>
	 * <p><pre>
	 * </pre></p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Stefanie Stamer <s.stamer@metaways.de>
	 * @copyright   Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Addressbook.AdminPanel
	 */
	Tine.Addressbook.AdminPanel = Ext.extend(Ext.TabPanel, {
	
	    border: false,
	    activeTab: 0,
	
	    /**
	     * @private
	     */
	    initComponent: function() {
	        
	        this.app = Tine.Tinebase.appMgr.get('Addressbook');
	        
	        this.items = [
	            new Tine.Admin.config.GridPanel({
	                configApp: this.app
	            })
	        ];
	        
	        Tine.Addressbook.AdminPanel.superclass.initComponent.call(this);
	    }
	});
	    
	/**
	 * Addressbook Admin Panel Popup
	 * 
	 * @param   {Object} config
	 * @return  {Ext.ux.Window}
	 */
	Tine.Addressbook.AdminPanel.openWindow = function (config) {
	    var window = Tine.WindowFactory.getWindow({
	        width: 600,
	        height: 470,
	        name: 'addressbook-admin-panel',
	        contentPanelConstructor: 'Tine.Addressbook.AdminPanel',
	        contentPanelConstructorConfig: config
	    });
	};


/***/ },

/***/ 184:
/***/ 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) 2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Addressbook');
	
	/**
	 * render the CardDAV Url into property panel of contianers
	 * 
	 * @class   Tine.Addressbook.CardDAVContainerPropertiesHookField
	 * @extends Ext.form.TextField
	 */
	Tine.Addressbook.CardDAVContainerPropertiesHookField = Ext.extend(Ext.form.TextField, {
	
	    anchor: '100%',
	    readOnly: true,
	    
	    /**
	     * @private
	     */
	    initComponent: function() {
	        this.on('added', this.onContainerAdded, this);
	
	        Tine.Addressbook.CardDAVContainerPropertiesHookField.superclass.initComponent.call(this);
	    },
	    
	    /**
	     * @private
	     */
	    onContainerAdded: function() {
	        this.app = Tine.Tinebase.appMgr.get('Addressbook');
	        this.fieldLabel = this.app.i18n._('CardDAV URL');
	        
	        this.propertiesDialog = this.findParentBy(function(p) {return !! p.grantContainer});
	        this.grantContainer = this.propertiesDialog.grantContainer;
	        
	        if (this.grantContainer.application_id && this.grantContainer.application_id.name) {
	            this.isAddressbook = (this.grantContainer.application_id.name == 'Addressbook');
	        } else {
	            this.isAddressbook = this.grantContainer.application_id === this.app.id;
	        }
	        
	        this.hidden = ! this.isAddressbook;
	        // cardDAV URL
	        this.value = [
	            window.location.href.replace(/\/?(index\.php.*)?$/, ''),
	            '/addressbooks/',
	            Tine.Tinebase.registry.get('currentAccount').contact_id,
	            '/',
	            this.grantContainer.id
	        ].join('');
	    }
	    
	});
	
	Ext.ux.ItemRegistry.registerItem('Tine.widgets.container.PropertiesDialog.FormItems.Properties', Tine.Addressbook.CardDAVContainerPropertiesHookField, 100);

/***/ },

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

	/*
	 * Tine 2.0
	 *
	 * @package     Addressbook
	 * @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.Addressbook');
	
	/**
	 * @namespace   Tine.Addressbook
	 * @class       Tine.Addressbook.ContactEditDialog
	 * @extends     Tine.widgets.dialog.EditDialog
	 * Addressbook Edit Dialog <br>
	 *
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 */
	Tine.Addressbook.ContactEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog, {
	
	    /**
	     * parse address button
	     * @type Ext.Button
	     */
	    parseAddressButton: null,
	
	    windowNamePrefix: 'ContactEditWindow_',
	    appName: 'Addressbook',
	    recordClass: Tine.Addressbook.Model.Contact,
	    showContainerSelector: true,
	    multipleEdit: true,
	    displayNotes: true,
	
	    preferredAddressBusinessCheckbox: null,
	    preferredAddressPrivateCheckbox: null,
	
	    getFormItems: function () {
	        if (Tine.Tinebase.configManager.get('mapPanel') && Tine.widgets.MapPanel) {
	            this.mapPanel = new Tine.Addressbook.MapPanel({
	                layout: 'fit',
	                title: this.app.i18n._('Map'),
	                disabled: (Ext.isEmpty(this.record.get('adr_one_lon')) || Ext.isEmpty(this.record.get('adr_one_lat'))) && (Ext.isEmpty(this.record.get('adr_two_lon')) || Ext.isEmpty(this.record.get('adr_two_lat')))
	            });
	
	            Tine.widgets.dialog.MultipleEditDialogPlugin.prototype.registerSkipItem(this.mapPanel);
	
	        } else {
	            this.mapPanel = new Ext.Panel({
	                layout: 'fit',
	                title: this.app.i18n._('Map'),
	                disabled: true,
	                html: ''
	            });
	        }
	
	
	        this.preferredAddressBusinessCheckbox = new Ext.form.Checkbox({
	            checked: this.record.get('preferred_address') === "0",
	            hideLabel: false,
	            fieldLabel: i18n._('Preferred Address'),
	            listeners: {
	                'check': function(checkbox, value) {
	                    if (value) {
	                        this.preferredAddressPrivateCheckbox.setValue(false);
	                        this.record.set('preferred_address', 0);
	                    }
	                },
	                scope: this
	            }
	        });
	
	        this.preferredAddressPrivateCheckbox = new Ext.form.Checkbox({
	            checked: this.record.get('preferred_address') === "1",
	            hideLabel: false,
	            fieldLabel: i18n._('Preferred Address'),
	            listeners: {
	                'check': function(checkbox, value) {
	                    if (value) {
	                        this.preferredAddressBusinessCheckbox.setValue(false);
	                        this.record.set('preferred_address', 1);
	                    }
	                },
	                scope: this
	            }
	        });
	
	        return {
	            xtype: 'tabpanel',
	            border: false,
	            plain: true,
	            activeTab: 0,
	            plugins: [{
	                ptype : 'ux.tabpanelkeyplugin'
	            }],
	            defaults: {
	                hideMode: 'offsets'
	            },
	            items: [{
	                title: this.app.i18n.n_('Contact', 'Contacts', 1),
	                border: false,
	                frame: true,
	                layout: 'border',
	                items: [{
	                    region: 'center',
	                    layout: 'border',
	                    items: [{
	                        xtype: 'fieldset',
	                        region: 'north',
	                        autoHeight: true,
	                        title: this.app.i18n._('Personal Information'),
	                        items: [{
	                            xtype: 'panel',
	                            layout: 'hbox',
	                            align: 'stretch',
	                            plugins: [{
	                                ptype: 'ux.itemregistry',
	                                key:   'Tine.Addressbook.editDialog.northPanel'
	                            }],
	                            items: [{
	                                flex: 1,
	                                xtype: 'columnform',
	                                autoHeight: true,
	                                style:'padding-right: 5px;',
	                                items: [[
	                                    new Tine.Tinebase.widgets.keyfield.ComboBox({
	                                        fieldLabel: this.app.i18n._('Salutation'),
	                                        name: 'salutation',
	                                        app: 'Addressbook',
	                                        keyFieldName: 'contactSalutation',
	                                        value: '',
	                                        columnWidth: 0.35,
	                                        listeners: {
	                                            scope: this,
	                                            'select': function (combo, record, index) {
	                                                var jpegphoto = this.getForm().findField('jpegphoto');
	                                                // set new empty photo depending on chosen salutation only if user doesn't have own image
	                                                jpegphoto.setDefaultImage(record.json.image || 'images/empty_photo_blank.png');
	                                            }
	                                        }
	                                }), {
	                                    columnWidth: 0.65,
	                                    fieldLabel: this.app.i18n._('Title'),
	                                    name: 'n_prefix',
	                                    maxLength: 64
	                                }], [{
	                                    columnWidth: 0.35,
	                                    fieldLabel: this.app.i18n._('First Name'),
	                                    name: 'n_given',
	                                    maxLength: 64
	                                }, {
	                                    columnWidth: 0.30,
	                                    fieldLabel: this.app.i18n._('Middle Name'),
	                                    name: 'n_middle',
	                                    maxLength: 64
	                                }, {
	                                    columnWidth: 0.35,
	                                    fieldLabel: this.app.i18n._('Last Name'),
	                                    name: 'n_family',
	                                    maxLength: 255
	                                }], [{
	                                    columnWidth: 0.65,
	                                    xtype: 'mirrortextfield',
	                                    fieldLabel: this.app.i18n._('Company'),
	                                    name: 'org_name',
	                                    maxLength: 255
	                                }, {
	                                    columnWidth: 0.35,
	                                    fieldLabel: this.app.i18n._('Unit'),
	                                    name: 'org_unit',
	                                    maxLength: 64
	                                }
	                                ]/* move to seperate tab, [{
	                                    columnWidth: .4,
	                                    fieldLabel: this.app.i18n._('Suffix'),
	                                    name:'n_suffix'
	                                }, {
	                                    columnWidth: .4,
	                                    fieldLabel: this.app.i18n._('Job Role'),
	                                    name:'role'
	                                }, {
	                                    columnWidth: .2,
	                                    fieldLabel: this.app.i18n._('Room'),
	                                    name:'room'
	                                }]*/
	                            ]},
	                            new Ext.ux.form.ImageField({
	                                name: 'jpegphoto',
	                                width: 90,
	                                height: 120
	                            })
	                        ]
	                        }, {
	                            xtype: 'columnform',
	                            items: [[
	                                !Tine.Tinebase.appMgr.get('Addressbook').featureEnabled('featureIndustry') ?
	                                {
	                                    columnWidth: 0.64,
	                                    xtype: 'combo',
	                                    fieldLabel: this.app.i18n._('Display Name'),
	                                    name: 'n_fn',
	                                    disabled: true
	                                } :
	                                (
	                                    new Tine.Addressbook.IndustrySearchCombo({
	                                    fieldLabel: this.app.i18n._('Industry'),
	                                    columnWidth: 0.64,
	                                    name: 'industry'
	                                    })
	                                ), {
	                                     columnWidth: 0.36,
	                                     fieldLabel: this.app.i18n._('Job Title'),
	                                     name: 'title',
	                                     maxLength: 64
	                                }, {
	                                     width: 110,
	                                     xtype: 'extuxclearabledatefield',
	                                     fieldLabel: this.app.i18n._('Birthday'),
	                                     name: 'bday'
	                                }
	                            ]]
	                        }]
	                    }, {
	                        xtype: 'fieldset',
	                        region: 'center',
	                        title: this.app.i18n._('Contact Information'),
	                        autoScroll: true,
	                        plugins: [{
	                            ptype: 'ux.itemregistry',
	                            key:   'Tine.Addressbook.editDialog.centerPanel'
	                        }],
	                        items: [{
	                            xtype: 'columnform',
	                            items: [[{
	                                fieldLabel: this.app.i18n._('Phone'),
	                                labelIcon: 'images/oxygen/16x16/apps/kcall.png',
	                                name: 'tel_work',
	                                maxLength: 40
	                            }, {
	                                fieldLabel: this.app.i18n._('Mobile'),
	                                labelIcon: 'images/oxygen/16x16/devices/phone.png',
	                                name: 'tel_cell',
	                                maxLength: 40
	                            }, {
	                                fieldLabel: this.app.i18n._('Fax'),
	                                labelIcon: 'images/oxygen/16x16/devices/printer.png',
	                                name: 'tel_fax',
	                                maxLength: 40
	                            }], [{
	                                fieldLabel: this.app.i18n._('Phone (private)'),
	                                labelIcon: 'images/oxygen/16x16/apps/kcall.png',
	                                name: 'tel_home',
	                                maxLength: 40
	                            }, {
	                                fieldLabel: this.app.i18n._('Mobile (private)'),
	                                labelIcon: 'images/oxygen/16x16/devices/phone.png',
	                                name: 'tel_cell_private',
	                                maxLength: 40
	                            }, {
	                                fieldLabel: this.app.i18n._('Fax (private)'),
	                                labelIcon: 'images/oxygen/16x16/devices/printer.png',
	                                name: 'tel_fax_home',
	                                maxLength: 40
	                            }], [{
	                                fieldLabel: this.app.i18n._('E-Mail'),
	                                labelIcon: 'images/oxygen/16x16/actions/kontact-mail.png',
	                                name: 'email',
	                                vtype: 'email',
	                                maxLength: 64
	                            }, {
	                                fieldLabel: this.app.i18n._('E-Mail (private)'),
	                                labelIcon: 'images/oxygen/16x16/actions/kontact-mail.png',
	                                name: 'email_home',
	                                vtype: 'email',
	                                maxLength: 64
	                            }, {
	                                xtype: 'mirrortextfield',
	                                fieldLabel: this.app.i18n._('Web'),
	                                labelIcon: 'images/oxygen/16x16/actions/network.png',
	                                name: 'url',
	                                maxLength: 128,
	                                listeners: {
	                                    scope: this,
	                                    focus: function (field) {
	                                        if (! field.getValue()) {
	                                            field.setValue('http://www.');
	                                            field.selectText.defer(100, field, [7, 11]);
	                                        }
	                                    },
	                                    blur: function (field) {
	                                        if (field.getValue() === 'http://www.') {
	                                            field.setValue(null);
	                                            field.validate();
	                                        }
	                                        if (field.getValue().indexOf('http://http://') == 0 || field.getValue().indexOf('http://https://') == 0) {
	                                            field.setValue(field.getValue().substr(7));
	                                            field.validate();
	                                        }
	                                        if (field.getValue().indexOf('http://www.http://') == 0 || field.getValue().indexOf('http://www.https://') == 0) {
	                                            field.setValue(field.getValue().substr(11));
	                                            field.validate();
	                                        }
	                                    }
	                                }
	                            }]]
	                        }]
	                    }, {
	                        xtype: 'tabpanel',
	                        region: 'south',
	                        border: false,
	                        deferredRender: false,
	                        height: 160,
	                        split: true,
	                        activeTab: 0,
	                        defaults: {
	                            frame: true
	                        },
	                        plugins: [{
	                            ptype: 'ux.itemregistry',
	                            key:   'Tine.Addressbook.editDialog.southPanel'
	                        }],
	                        items: [{
	                            title: this.app.i18n._('Company Address'),
	                            xtype: 'columnform',
	                            items: [[{
	                                fieldLabel: this.app.i18n._('Street'),
	                                name: 'adr_one_street',
	                                maxLength: 64
	                            }, {
	                                fieldLabel: this.app.i18n._('Street 2'),
	                                name: 'adr_one_street2',
	                                maxLength: 64
	                            }, {
	                                fieldLabel: this.app.i18n._('Region'),
	                                name: 'adr_one_region',
	                                maxLength: 64
	                            }], [{
	                                fieldLabel: this.app.i18n._('Postal Code'),
	                                name: 'adr_one_postalcode',
	                                maxLength: 64
	                            }, {
	                                fieldLabel: this.app.i18n._('City'),
	                                name: 'adr_one_locality',
	                                maxLength: 64
	                            }, {
	                                xtype: 'widget-countrycombo',
	                                fieldLabel: this.app.i18n._('Country'),
	                                name: 'adr_one_countryname',
	                                maxLength: 64
	                            }], [this.preferredAddressBusinessCheckbox]]
	                        }, {
	                            title: this.app.i18n._('Private Address'),
	                            xtype: 'columnform',
	                            items: [[{
	                                fieldLabel: this.app.i18n._('Street'),
	                                name: 'adr_two_street',
	                                maxLength: 64
	                            }, {
	                                fieldLabel: this.app.i18n._('Street 2'),
	                                name: 'adr_two_street2',
	                                maxLength: 64
	                            }, {
	                                fieldLabel: this.app.i18n._('Region'),
	                                name: 'adr_two_region',
	                                maxLength: 64
	                            }], [{
	                                fieldLabel: this.app.i18n._('Postal Code'),
	                                name: 'adr_two_postalcode',
	                                maxLength: 64
	                            }, {
	                                fieldLabel: this.app.i18n._('City'),
	                                name: 'adr_two_locality',
	                                maxLength: 64
	                            }, {
	                                xtype: 'widget-countrycombo',
	                                fieldLabel: this.app.i18n._('Country'),
	                                name: 'adr_two_countryname',
	                                maxLength: 64
	                            }], [this.preferredAddressPrivateCheckbox]]
	                        }]
	                    }]
	                }, {
	                    // activities and tags
	                    // TODO make order of accordion items stateful
	                    region: 'east',
	                    layout: 'accordion',
	                    animate: true,
	                    width: 210,
	                    split: true,
	                    collapsible: true,
	                    collapseMode: 'mini',
	                    header: false,
	                    margins: '0 5 0 5',
	                    border: true,
	                    plugins: [{
	                        ptype: 'ux.itemregistry',
	                        key:   'Tine.Addressbook.editDialog.eastPanel'
	                    }],
	                    items: [
	                        new Ext.Panel({
	                            // @todo generalise!
	                            title: this.app.i18n._('Description'),
	                            iconCls: 'descriptionIcon',
	                            layout: 'form',
	                            labelAlign: 'top',
	                            border: false,
	                            items: [{
	                                style: 'margin-top: -4px; border 0px;',
	                                labelSeparator: '',
	                                xtype: 'textarea',
	                                name: 'note',
	                                hideLabel: true,
	                                grow: false,
	                                preventScrollbars: false,
	                                anchor: '100% 100%',
	                                emptyText: this.app.i18n._('Enter description'),
	                                requiredGrant: 'editGrant'
	                            }]
	                        }), new Ext.Panel({
	                            title: this.app.i18n._('Groups'),
	                            iconCls: 'tinebase-accounttype-group',
	                            layout: 'fit',
	                            border: false,
	                            bodyStyle: 'border:1px solid #B5B8C8;',
	                            items: [
	                                this.groupsPanel
	                            ]
	                        }), new Tine.widgets.tags.TagPanel({
	                            app: 'Addressbook',
	                            border: false,
	                            bodyStyle: 'border:1px solid #B5B8C8;'
	                        })
	                    ]
	                }]
	            }, this.mapPanel,
	            new Tine.widgets.activities.ActivitiesTabPanel({
	                app: this.appName,
	                record_id: (this.record && ! this.copyRecord) ? this.record.id : '',
	                record_model: this.appName + '_Model_' + this.recordClass.getMeta('modelName')
	            })
	            ]
	        };
	    },
	
	    /**
	     * init component
	     */
	    initComponent: function () {
	        var relatedRecords = {};
	
	        this.initToolbar();
	        this.groupsPanel = new Tine.Addressbook.contactListsGridPanel({
	            frame: false
	        });
	        this.supr().initComponent.apply(this, arguments);
	    },
	
	    /**
	     * initToolbar
	     */
	    initToolbar: function() {
	        this.parseAddressButton = new Ext.Action({
	            text: Tine.Tinebase.appMgr.get('Addressbook').i18n._('Parse address'),
	            handler: this.onParseAddress,
	            iconCls: 'action_parseAddress',
	            disabled: false,
	            scope: this,
	            enableToggle: true
	        });
	        this.printButton = new Ext.Action({
	            text: Tine.Tinebase.appMgr.get('Addressbook').i18n._('Print contact'),
	            handler: this.onPrint,
	            iconCls:'action_print',
	            disabled: false,
	            scope: this
	        });
	
	        this.tbarItems = this.tbarItems || [];
	        this.tbarItems = this.tbarItems.concat([this.parseAddressButton, this.printButton]);
	    },
	
	    onPrint: function(printMode) {
	        this.onRecordUpdate();
	        var renderer = new Tine.Addressbook.Printer.ContactRenderer();
	        renderer.print(this.record);
	    },
	
	    /**
	     * export pdf handler
	     */
	    onExportContact: function () {
	        var downloader = new Ext.ux.file.Download({
	            params: {
	                method: 'Addressbook.exportContacts',
	                filter: Ext.encode([{field: 'id', operator: 'in', value: this.record.id}]),
	                options: Ext.util.JSON.encode({
	                    format: 'pdf'
	                })
	            }
	        });
	        downloader.start();
	    },
	
	    /**
	     * parse address handler
	     *
	     * opens message box where user can paste address
	     *
	     * @param {Ext.Button} button
	     */
	    onParseAddress: function (button) {
	        if (button.pressed) {
	            Ext.Msg.prompt(this.app.i18n._('Paste address'), this.app.i18n._('Please paste an address or a URI to a vcard that should be parsed:'), function(btn, text) {
	                if (btn == 'ok'){
	                    this.parseAddress(text);
	                } else if (btn == 'cancel') {
	                    button.toggle();
	                }
	            }, this, 100);
	        } else {
	            button.setText(this.app.i18n._('Parse address'));
	            this.tokenModePlugin.endTokenMode();
	        }
	    },
	
	    /**
	     * send address to server + fills record/form with parsed data + adds unrecognizedTokens to description box
	     *
	     * @param {String} address
	     */
	    parseAddress: function(address) {
	        Tine.log.debug('parsing address ... ');
	
	        Tine.Addressbook.parseAddressData(address, function(result, response) {
	            Tine.log.debug('parsed address:');
	            Tine.log.debug(result);
	
	            if (result.hasOwnProperty('exceptions')) {
	                Ext.Msg.alert(this.app.i18n._('Failed to parse address!'), this.app.i18n._('The address could not be read.'));
	            } else {
	                // only set the fields that could be detected
	                Ext.iterate(result.contact, function(key, value) {
	                    if (value && ! this.record.get(key)) {
	                        this.record.set(key, value);
	                    }
	                }, this);
	
	                var oldNote = (this.record.get('note')) ? this.record.get('note') : '';
	
	                if (result.hasOwnProperty('unrecognizedTokens')) {
	                    this.record.set('note', result.unrecognizedTokens.join(' ') + oldNote);
	                }
	
	                this.onRecordLoad();
	
	                this.parseAddressButton.setText(this.app.i18n._('End token mode'));
	                this.tokenModePlugin.startTokenMode();
	            }
	        }, this);
	    },
	
	    /**
	     * onRecordLoad
	     */
	    onRecordLoad: function () {
	        // NOTE: it comes again and again till
	        if (this.rendered) {
	            var container = this.record.get('container_id');
	
	            // handle default container
	            // TODO should be generalized
	            if (! this.record.id && ! Ext.isObject(container)) {
	                container = this.app.getMainScreen().getWestPanel().getContainerTreePanel().getSelectedContainer('addGrant', Tine.Addressbook.registry.get('defaultAddressbook'));
	                this.record.set('container_id', container);
	            }
	
	            if (this.mapPanel instanceof Tine.Addressbook.MapPanel) {
	                this.mapPanel.onRecordLoad(this.record);
	            }
	        }
	        if (this.record.id) {
	            this.groupsPanel.store.loadData(this.record.get('groups'));
	        }
	        this.supr().onRecordLoad.apply(this, arguments);
	    }
	});
	
	/**
	 * Opens a new contact edit dialog window
	 *
	 * @return {Ext.ux.Window}
	 */
	Tine.Addressbook.ContactEditDialog.openWindow = function (config) {
	    var id = (config.record && config.record.id) ? config.record.id : 0;
	    var window = Tine.WindowFactory.getWindow({
	        width: 800,
	        height: 610,
	        name: Tine.Addressbook.ContactEditDialog.prototype.windowNamePrefix + id,
	        contentPanelConstructor: 'Tine.Addressbook.ContactEditDialog',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2010 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Calendar');
	
	/**
	 * @namespace   Tine.Calendar
	 * @class       Tine.Addressbook.ContactFilterModel
	 * @extends     Tine.widgets.grid.FilterModel
	 * 
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 */
	Tine.Addressbook.ContactFilterModel = Ext.extend(Tine.widgets.grid.FilterModel, {
	    /**
	     * @property Tine.Tinebase.Application app
	     */
	    app: null,
	    
	    field: 'contact_id',
	    defaultOperator: 'equals',
	    
	    /**
	     * @private
	     */
	    initComponent: function() {
	        Tine.Addressbook.ContactFilterModel.superclass.initComponent.call(this);
	        
	        this.app = Tine.Tinebase.appMgr.get('Addressbook');
	        
	        this.operators = ['equals'/*, 'notin'*/];
	        this.label = this.label || this.app.i18n._('Contact');
	    },
	    
	    /**
	     * value renderer
	     * 
	     * @param {Ext.data.Record} filter line
	     * @param {Ext.Element} element to render to 
	     */
	    valueRenderer: function(filter, el) {
	        var value = new Tine.Addressbook.SearchCombo({
	            app: this.app,
	            filter: filter,
	            width: this.filterValueWidth,
	            listWidth: 400,
	            listAlign : 'tr-br?',
	            id: 'tw-ftb-frow-valuefield-' + filter.id,
	            value: filter.data.value ? filter.data.value : this.defaultValue,
	            renderTo: el,
	            getValue: function() {
	                return this.selectedRecord.id;
	            },
	            onSelect: function(record) {
	                this.setValue(record);
	                this.collapse();
	        
	                this.fireEvent('select', this, record);
	                if (this.blurOnSelect) {
	                    this.fireEvent('blur', this);
	                }
	            },
	            setValue: function(value) {
	                this.selectedRecord = value;
	                var displayValue = Tine.Calendar.AttendeeGridPanel.prototype.renderAttenderUserName.call(this, value);
	                Tine.Addressbook.SearchCombo.superclass.setValue.call(this, displayValue);
	            }
	        });
	        value.on('select', this.onFiltertrigger, this);
	        return value;
	    }
	});
	
	Tine.widgets.grid.FilterToolbar.FILTERS['addressbook.contact'] = Tine.Addressbook.ContactFilterModel;
	


/***/ },

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

	/**
	 * Tine 2.0
	 *
	 * @package     Addressbook
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2007-2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 * TODO         add preference for sending mails with felamimail or mailto?
	 */
	
	Ext.ns('Tine.Addressbook');
	
	/**
	 * the details panel (shows contact details)
	 *
	 * @namespace   Tine.Addressbook
	 * @class       Tine.Addressbook.ContactGridDetailsPanel
	 * @extends     Tine.widgets.grid.DetailsPanel
	 */
	Tine.Addressbook.ContactGridDetailsPanel = Ext.extend(Tine.widgets.grid.DetailsPanel, {
	
	    il8n: null,
	    felamimail: false,
	
	    recordClass: Tine.Addressbook.Model.Contact,
	
	    getSingleRecordPanel: function() {
	        var me = this;
	        if (! this.singleRecordPanel) {
	            this.singleRecordPanel = new Tine.widgets.display.RecordDisplayPanel({
	                recordClass: this.recordClass,
	                getBodyItems: function() {
	                    return [{
	                        layout: 'hbox',
	                        flex: 1,
	                        border: false,
	                        layoutConfig: {
	                            padding: '0',
	                            align: 'stretch'
	                        },
	                        defaults: {
	                            margins: '0 5 0 0'
	                        },
	                        items: [{
	                            width: 90,
	                            layout: 'ux.display',
	                            layoutConfig: {
	                                background: 'solid'
	                            },
	                            items: [{
	                                xtype: 'ux.displayfield',
	                                name: 'jpegphoto',
	                                cls: 'preview-panel-image',
	                                anchor:'100% 100%',
	                                hideLabel: true,
	                                htmlEncode: false,
	                                renderer: Tine.widgets.grid.RendererManager.get('Addressbook', 'Addressbook_Model_Contact', 'image', 'displayPanel').createDelegate(me)
	                            }]
	                        }, {
	                            flex: 1,
	                            layout: 'ux.display',
	                            labelWidth: 60,
	                            layoutConfig: {
	                                background: 'solid'
	                            },
	                            items: [{
	                                layout: 'hbox',
	                                border: false,
	                                anchor: '100% 100%',
	                                layoutConfig: {
	                                    align: 'stretch'
	                                },
	                                items: [{
	                                    layout: 'ux.display',
	                                    layoutConfig: {
	                                        background: 'inner',
	                                        labelLWidth: 100,
	                                        declaration: this.app.i18n._('Business')
	                                    },
	                                    labelAlign: 'top',
	                                    border: false,
	                                    flex: 1,
	                                    items: [{
	                                        xtype: 'ux.displayfield',
	                                        name: 'org_name',
	                                        hideLabel: true,
	                                        htmlEncode: false,
	                                        renderer: function(value) {
	                                            return '<b>' +  Tine.Tinebase.EncodingHelper.encode(value) + '</b>';
	                                        }
	                                    }, {
	                                        xtype: 'ux.displayfield',
	                                        name: 'dtstart',
	                                        hideLabel: true,
	                                        htmlEncode: false,
	                                        renderer: Tine.widgets.grid.RendererManager.get('Addressbook', 'Addressbook_Model_Contact', 'addressblock', 'displayPanel').createDelegate(me, {
	                                            'street': 'adr_one_street',
	                                            'street2': 'adr_one_street2',
	                                            'postalcode': 'adr_one_postalcode',
	                                            'locality': 'adr_one_locality',
	                                            'region': 'adr_one_region',
	                                            'country': 'adr_one_countryname'
	                                        }, true)
	                                    }]
	                                }, {
	                                    layout: 'ux.display',
	                                    layoutConfig: {
	                                        background: 'inner'
	                                    },
	                                    labelWidth: 50,
	                                    flex: 1,
	                                    border: false,
	                                    items: [{
	                                        xtype: 'ux.displayfield',
	                                        name: 'tel_work',
	                                        fieldLabel: this.app.i18n._('Phone')
	                                    }, {
	                                        xtype: 'ux.displayfield',
	                                        name: 'tel_cell',
	                                        fieldLabel: this.app.i18n._('Mobile')
	                                    }, {
	                                        xtype: 'ux.displayfield',
	                                        name: 'tel_fax',
	                                        fieldLabel: this.app.i18n._('Fax')
	                                    }, {
	                                        xtype: 'ux.displayfield',
	                                        name: 'email',
	                                        fieldLabel: this.app.i18n._('E-Mail'),
	                                        htmlEncode: false,
	                                        renderer: Tine.widgets.grid.RendererManager.get('Addressbook', 'Addressbook_Model_Contact', 'email', 'displayPanel').createDelegate(me)
	                                    }, {
	                                        xtype: 'ux.displayfield',
	                                        name: 'url',
	                                        fieldLabel: this.app.i18n._('Web'),
	                                        htmlEncode: false,
	                                        renderer: Tine.widgets.grid.RendererManager.get('Addressbook', 'Addressbook_Model_Contact', 'url', 'displayPanel').createDelegate(me)
	                                    }]
	                                }]
	                            }]
	                        }, {
	                            flex: 1,
	                            layout: 'ux.display',
	                            labelAlign: 'top',
	                            autoScroll: true,
	                            layoutConfig: {
	                                background: 'solid',
	                                declaration: this.app.i18n._('Private')
	                            },
	
	                            // @todo: this field doesn't actually require a certain field, there should be two methods for RenderManager:
	                            //  + get()
	                            //  + getBlock() // block actually doesn't specify a certain field and only an record, the field declaration should come from the modelconfig later
	                            items: [{
	                                xtype: 'ux.displayfield',
	                                name: 'attendee',
	                                hideLabel: true,
	                                htmlEncode: false,
	                                renderer: Tine.widgets.grid.RendererManager.get('Addressbook', 'Addressbook_Model_Contact', 'addressblock', 'displayPanel').createDelegate(me, {
	                                    'street': 'adr_two_street',
	                                    'street2': 'adr_two_street2',
	                                    'postalcode': 'adr_two_postalcode',
	                                    'locality': 'adr_two_locality',
	                                    'region': 'adr_two_region',
	                                    'country': 'adr_two_countryname'
	                                }, true)
	                            }]
	                        }, {
	                            flex: 1,
	                            layout: 'fit',
	
	                            border: false,
	                            items: [{
	                                cls: 'x-ux-display-background-border',
	                                xtype: 'ux.displaytextarea',
	                                name: 'note'
	                            }]
	                        }]
	                    }];
	                }
	            });
	        }
	
	        return this.singleRecordPanel;
	    },
	
	    /**
	     * add on click event after render
	     */
	    afterRender: function() {
	        Tine.Addressbook.ContactGridDetailsPanel.superclass.afterRender.apply(this, arguments);
	
	        if (this.felamimail === true) {
	            this.body.on('click', this.onClick, this);
	        }
	    },
	
	    /**
	     * on click for compose mail
	     *
	     * @param {} e
	     *
	     * TODO check if account is configured?
	     * TODO generalize that
	     */
	    onClick: function(e) {
	        var target = e.getTarget('a[class=tinebase-email-link]');
	        if (target) {
	            var email = target.id.split(':')[1];
	            var defaults = Tine.Felamimail.Model.Message.getDefaultData();
	            defaults.to = [email];
	            defaults.body = Tine.Felamimail.getSignature();
	
	            var record = new Tine.Felamimail.Model.Message(defaults, 0);
	
	            Tine.Felamimail.MessageEditDialog.openWindow({
	                record: record
	            });
	        }
	    }
	});


/***/ },

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

	/*
	 * Tine 2.0
	 *
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Michael Spahn <m.spahn@metaways.de>
	 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Addressbook');
	
	/**
	 * Render country name by it's iso code
	 *
	 * @namespace   Tine.Addressbook
	 * @author      Michael Spahn <m.spahn@metaways.de>
	 * @singleton
	 */
	Tine.Addressbook.countryRenderer = function (v) {
	    return Locale.getTranslationData('CountryList', v);
	};
	
	Tine.widgets.grid.RendererManager.register('Addressbook', 'Addressbook_Model_Contact', 'country', Tine.Addressbook.countryRenderer, 'displayPanel');

/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Addressbook
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Alexander Stintzing <a.stintzing@metaways.de>
	 * @copyright   Copyright (c) 2013 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	
	Ext.ns('Tine.Addressbook');
	
	/**
	 * @namespace   Tine.Addressbook
	 * @class       Tine.Addressbook.GenericContactGridPanelHook
	 * 
	 * Hook prototype for other applications to hook into the addressbook contact grid context menu<br>
	 * 
	 * @author      Alexander Stintzing <a.stintzing@metaways.de>
	 */
	
	Tine.Addressbook.GenericContactGridPanelHook = function(config) {
	    Tine.log.info('initialising addressbook hook');
	    Ext.apply(this, config);
	    
	    this.recordClass = Tine[this.app.name].Model[this.modelName];
	    var text = this.recordClass.getMeta('recordName');
	    
	    this.addRecordAction = new Ext.Action({
	        actionType: 'add',
	        requiredGrant: 'readGrant',
	        text: text,
	        iconCls: this.app.getIconCls(),
	        scope: this,
	        handler: this.onUpdateRecord,
	        allowMultiple: true,
	        listeners: {
	            scope: this,
	            render: this.onRender
	        }
	    });
	    
	    this.newRecordAction = new Ext.Action({
	        actionType: 'new',
	        requiredGrant: 'readGrant',
	        text: text,
	        iconCls: this.app.getIconCls(),
	        scope: this,
	        handler: this.onAddRecord,
	        allowMultiple: true,
	        listeners: {
	            scope: this,
	            render: this.onRender
	        }
	    });
	    
	    Ext.ux.ItemRegistry.registerItem('Addressbook-Contact-GridPanel-ContextMenu-Add', this.addRecordAction, 100);
	    Ext.ux.ItemRegistry.registerItem('Addressbook-Contact-GridPanel-ContextMenu-New', this.newRecordAction, 100);
	};
	
	Ext.apply(Tine.Addressbook.GenericContactGridPanelHook.prototype, {
	    
	    /**
	     * The hooking application
	     * 
	     * @type Tine.Tinebase.Application
	     */
	    app: null,
	    
	    /**
	     * The hooking model name of the
	     * 
	     * @type 
	     */
	    modelName: null,
	    
	    /**
	     * The Addressbook Contact Grid to hook into
	     * 
	     * @type {Tine.Addressbook.ContactGridPanel}
	     */
	    contactGridPanel: null,
	        
	    /**
	     * get addressbook contact grid panel
	     */
	    getContactGridPanel: function() {
	        if (! this.contactGridPanel) {
	            this.contactGridPanel = Tine.Tinebase.appMgr.get('Addressbook').getMainScreen().getCenterPanel();
	        }
	        return this.contactGridPanel;
	    },
	
	    /**
	     * add selected contacts to a new record
	     * 
	     * @param {Button} btn 
	     */
	    onAddRecord: function(btn) {
	        var ms = this.app.getMainScreen(),
	            cp = ms.getCenterPanel(),
	            filter = this.getFilter(ms);
	        
	        if (!filter) {
	            var addRelations = this.getSelectionsAsArray();
	        } else {
	            var addRelations = true;
	        }
	
	        cp.onEditInNewWindow.call(cp, 'add', null, [{
	            ptype: 'addrelations_edit_dialog', selectionFilter: filter, addRelations: addRelations, callingApp: 'Addressbook', callingModel: 'Contact'
	        }]);
	    },
	    
	    /**
	     * adds selected contacts to an existing record
	     */
	    onUpdateRecord: function() {
	        var ms = this.app.getMainScreen(),
	            cp = ms.getCenterPanel(),
	            filter = this.getFilter(ms),
	            sm = this.getContactGridPanel().selectionModel;
	            
	        if (! filter) {
	            var addRelations = this.getSelectionsAsArray(),
	                count = this.getSelectionsAsArray().length;
	        } else {
	            var addRelations = true,
	                count = sm.store.totalLength;
	        }
	        var cn = 'AddTo' + this.modelName + 'Panel';
	        
	        Tine[this.app.name][cn].openWindow({
	            count: count, selectionFilter: filter, addRelations: addRelations, callingApp: 'Addressbook', callingModel: 'Contact'
	        });
	    },
	    
	    /**
	     * returns the current filter if is filter selection
	     * @param {Tine.widgets.MainScreen}
	     * @return {Object}
	     */
	    getFilter: function(ms) {
	        var sm = this.getContactGridPanel().selectionModel,
	            filter = null;
	        
	        if (sm.isFilterSelect) {
	            var filter = sm.getSelectionFilter();
	        }
	        return filter;
	    },
	    
	    /**
	     * returns selected contacts
	     * @returns {Array}
	     */
	    getSelectionsAsArray: function() {
	        var contacts = this.getContactGridPanel().grid.getSelectionModel().getSelections(),
	            cont = [];
	        
	        Ext.each(contacts, function(contact) {
	           if (contact.data) cont.push(contact.data);
	        });
	        
	        return cont;
	    },
	    
	    /**
	     * add to action updater the first time we render
	     */
	    onRender: function() {
	        var actionUpdater = this.getContactGridPanel().actionUpdater,
	            registeredActions = actionUpdater.actions;
	
	        if (registeredActions.indexOf(this.addRecordAction) < 0) {
	            actionUpdater.addActions([this.addRecordAction]);
	        }
	
	        if (registeredActions.indexOf(this.newRecordAction) < 0) {
	            actionUpdater.addActions([this.newRecordAction]);
	        }
	    }
	});

/***/ },

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

	/*
	 * Tine 2.0
	 *
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Michael Spahn <m.spahn@metaways.de>
	 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Addressbook');
	
	/**
	 * Render given image
	 *
	 * @namespace   Tine.Addressbook
	 * @author      Michael Spahn <m.spahn@metaways.de>
	 * @singleton
	 */
	Tine.Addressbook.imageRenderer = function (jpegphoto, metadata, record) {
	    function getImageUrl(url, width, height, contact) {
	        var mtime = contact.last_modified_time || contact.creation_time;
	        if (url.match(/&/)) {
	            url = Ext.ux.util.ImageURL.prototype.parseURL(url);
	            url.width = width;
	            url.height = height;
	            url.ratiomode = 0;
	            url.mtime = Ext.isDate(mtime) ? mtime.getTime() : new Date().getTime();
	        }
	        return url;
	    }
	
	    var url = getImageUrl(jpegphoto, 90, 113, record.data);
	
	    return '<img src="' + url + '" />';
	};
	
	Tine.widgets.grid.RendererManager.register('Addressbook', 'Addressbook_Model_Contact', 'image', Tine.Addressbook.imageRenderer, 'displayPanel');

/***/ },

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

	/*
	 * Tine 2.0
	 *
	 * @package     Addressbook
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Stefanie Stamer <s.stamer@metaways.de>
	 * @copyright   Copyright (c) 2016 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	
	/*global Ext, Tine*/
	
	Ext.ns('Tine.Addressbook');
	
	/**
	 * @namespace   Tine.Addressbook
	 * @class       Tine.Addressbook.ListRoleEditDialog
	 * @extends     Tine.widgets.dialog.EditDialog
	 * Addressbook Edit Dialog <br>
	 *
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 */
	Tine.Addressbook.IndustryEditDialog = Ext.extend(Tine.widgets.dialog.SimpleRecordEditDialog, {
	    windowNamePrefix: 'IndustryEditWindow_',
	    appName: 'Addressbook',
	    recordClass: Tine.Addressbook.Model.Industry
	});
	
	/**
	 * Opens a new contact edit dialog window
	 *
	 * @return {Ext.ux.Window}
	 */
	Tine.Addressbook.IndustryEditDialog.openWindow = function (config) {
	    var id = (config.record && config.record.id) ? config.record.id : 0;
	    var window = Tine.WindowFactory.getWindow({
	        width: 400,
	        height: 300,
	        name: Tine.Addressbook.IndustryEditDialog.prototype.windowNamePrefix + id,
	        contentPanelConstructor: 'Tine.Addressbook.IndustryEditDialog',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};


/***/ },

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

	/*
	 * Tine 2.0
	 * Addressbook industry combo box
	 * 
	 * @package     Addressbook
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2016 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	
	Ext.ns('Tine.Addressbook');
	
	/**
	 * Contract selection combo box
	 * 
	 * @namespace   Tine.Addressbook
	 * @class       Tine.Addressbook.IndustrySearchCombo
	 * @extends     Ext.form.ComboBox
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>log
	 * @copyright   Copyright (c) 2016 Metaways Infosystems GmbH (http://www.metaways.de)
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Addressbook.IndustrySearchCombo
	 */
	Tine.Addressbook.IndustrySearchCombo = Ext.extend(Tine.Tinebase.widgets.form.RecordPickerComboBox, {
	    
	    initComponent: function(){
	        this.recordClass = Tine.Addressbook.Model.Industry;
	
	        Tine.Addressbook.IndustrySearchCombo.superclass.initComponent.call(this);
	
	        this.displayField = 'name';
	        this.sortBy = 'name';
	    }
	});
	
	Tine.widgets.form.RecordPickerManager.register('Addressbook', 'Industry', Tine.Addressbook.IndustrySearchCombo);

/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Addressbook
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Frederic Heihoff <heihoff@sh-systems.eu>
	 * @copyright   Copyright (c) 2009-2016 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	
	/*global Ext, Tine*/
	
	Ext.ns('Tine.Addressbook');
	
	/**
	 * @namespace   Tine.Addressbook
	 * @class       Tine.Addressbook.ListEditDialog
	 * @extends     Tine.widgets.dialog.EditDialog
	 * Addressbook Edit Dialog <br>
	 * 
	 * @author      Frederic Heihoff <heihoff@sh-systems.eu>
	 */
	Tine.Addressbook.ListEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog, {
	
	    windowNamePrefix: 'ListEditWindow_',
	    appName: 'Addressbook',
	    recordClass: Tine.Addressbook.Model.List,
	    showContainerSelector: true,
	    multipleEdit: true,
	    displayNotes: true,
	
	    /**
	     * init component
	     */
	    initComponent: function () {
	        this.on('load', this.resolveMemberData, this);
	        this.initToolbar();
	
	        this.memberGridPanel = new Tine.Addressbook.ListMemberRoleGridPanel({
	            region: "center",
	            frame: true,
	            margins: '6 0 0 0'
	        });
	        this.memberRolesPanel = new Tine.Addressbook.ListRoleGridPanel({
	            region: "south",
	            frame: true,
	            margins: '6 0 0 0',
	            height: 150
	        });
	        this.supr().initComponent.apply(this, arguments);
	    },
	
	    initToolbar: function() {
	        this.printButton = new Ext.Action({
	            text: String.format(Tine.Tinebase.appMgr.get('Addressbook').i18n._('Print {0}'), this.recordClass.getMeta('modelName')),
	            handler: this.onPrint,
	            iconCls:'action_print',
	            disabled: false,
	            scope: this
	        });
	
	        this.tbarItems = [this.printButton];
	    },
	
	    getFormItems: function () {
	        return {
	            xtype: 'tabpanel',
	            border: false,
	            plain: true,
	            activeTab: 0,
	            plugins: [{
	                ptype : 'ux.tabpanelkeyplugin'
	            }],
	            items: [{
	                title: this.app.i18n.n_('List', 'Lists', 1),
	                border: false,
	                frame: true,
	                layout: 'border',
	                items: [{
	                    region: 'center',
	                    layout: 'border',
	                    items: [{
	                        xtype: 'fieldset',
	                        region: 'north',
	                        autoHeight: true,
	                        title: this.app.i18n._('List Information'),
	                        items: [{
	                            xtype: 'panel',
	                            layout: 'hbox',
	                            align: 'stretch',
	                            items: [{
	                                flex: 1,
	                                xtype: 'columnform',
	                                autoHeight: true,
	                                style:'padding-right: 5px;',
	                                items: [[{
	                                    columnWidth: 1,
	                                    fieldLabel: this.app.i18n._('Name'),
	                                    name: 'name',
	                                    maxLength: 64
	                                }],
	                                [new Tine.Tinebase.widgets.keyfield.ComboBox({
	                                        columnWidth: 1,
	                                        fieldLabel: this.app.i18n._('List type'),
	                                        name: 'list_type',
	                                        app: 'Addressbook',
	                                        keyFieldName: 'listType',
	                                        value: ''
	                                    })
	                                ]]
	                            }]
	                        }]
	                    },
	                        // TODO allow user to switch between those two grid panels (card layout?)
	                        this.memberGridPanel,
	                        this.memberRolesPanel
	                    ]
	                }, {
	                    // activities and tags
	                    region: 'east',
	                    layout: 'accordion',
	                    animate: true,
	                    width: 210,
	                    split: true,
	                    collapsible: true,
	                    collapseMode: 'mini',
	                    header: false,
	                    margins: '0 5 0 5',
	                    border: true,
	                    items: [
	                        new Ext.Panel({
	                            // @todo generalise!
	                            title: this.app.i18n._('Description'),
	                            iconCls: 'descriptionIcon',
	                            layout: 'form',
	                            labelAlign: 'top',
	                            border: false,
	                            items: [{
	                                style: 'margin-top: -4px; border 0px;',
	                                labelSeparator: '',
	                                xtype: 'textarea',
	                                name: 'description',
	                                hideLabel: true,
	                                grow: false,
	                                preventScrollbars: false,
	                                anchor: '100% 100%',
	                                emptyText: this.app.i18n._('Enter description'),
	                                requiredGrant: 'editGrant'
	                            }]
	                        }),
	                        new Tine.widgets.tags.TagPanel({
	                            app: 'Addressbook',
	                            border: false,
	                            bodyStyle: 'border:1px solid #B5B8C8;'
	                        })
	                    ]
	                }]
	            },
	            new Tine.widgets.activities.ActivitiesTabPanel({
	                app: this.appName,
	                record_id: (this.record && ! this.copyRecord) ? this.record.id : '',
	                record_model: this.appName + '_Model_' + this.recordClass.getMeta('modelName')
	            })
	            ]
	        };
	    },
	    
	    /**
	     * checks if form data is valid
	     * 
	     * @return {Boolean}
	     */
	    isValid: function () {
	        var form = this.getForm();
	        var isValid = true;
	        
	        // you need to fill in one of: n_given n_family org_name
	        // @todo required fields should depend on salutation ('company' -> org_name, etc.)
	        //       and not required fields should be disabled (n_given, n_family, etc.)
	        if (form.findField('name').getValue() === '') {
	            var invalidString = String.format(this.app.i18n._('{0} must be given'), this.app.i18n._('Name'));
	            
	            form.findField('name').markInvalid(invalidString);
	            
	            isValid = false;
	        }
	        
	        return isValid && Tine.Addressbook.ListEditDialog.superclass.isValid.apply(this, arguments);
	    },
	    
	    /**
	     * onRecordLoad
	     */
	    resolveMemberData: function (editDialog, record, ticketFn) {
	        this.memberGridPanel.record = this.record;
	        if (this.record.id) {
	            var ticket = ticketFn();
	            this.memberGridPanel.setMembers(ticket);
	            this.memberGridPanel.memberRolesPanel = this.memberRolesPanel;
	        }
	    },
	
	    /**
	     * onRecordUpdate
	     */
	    onRecordUpdate: function() {
	        Tine.Addressbook.ListEditDialog.superclass.onRecordUpdate.apply(this, arguments);
	        this.record.set("members", this.memberGridPanel.getMembers());
	        this.record.set("memberroles", this.memberGridPanel.getMemberRoles());
	    },
	
	    onPrint: function(printMode) {
	        this.onRecordUpdate();
	
	        var renderer = new Tine.Addressbook.Printer.ListRenderer();
	        renderer.print(this);
	    }
	});
	
	/**
	 * Opens a new List edit dialog window
	 * 
	 * @return {Ext.ux.Window}
	 */
	Tine.Addressbook.ListEditDialog.openWindow = function (config) {
	    
	    // if a container is selected in the tree, take this as default container
	    var treeNode = Ext.getCmp('Addressbook_Tree') ? Ext.getCmp('Addressbook_Tree').getSelectionModel().getSelectedNode() : null;
	    if (treeNode && treeNode.attributes && treeNode.attributes.container.type) {
	        config.forceContainer = treeNode.attributes.container;
	    } else {
	        config.forceContainer = null;
	    }
	    
	    var id = (config.record && config.record.id) ? config.record.id : 0;
	    var window = Tine.WindowFactory.getWindow({
	        width: 800,
	        height: 610,
	        name: Tine.Addressbook.ListEditDialog.prototype.windowNamePrefix + id,
	        contentPanelConstructor: 'Tine.Addressbook.ListEditDialog',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Addressbook
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Frederic Heihoff <heihoff@sh-systems.eu>
	 * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.ns('Tine.Addressbook');
	
	/**
	 * List grid panel
	 * 
	 * @namespace   Tine.Addressbook
	 * @class       Tine.Addressbook.ListGridPanel
	 * @extends     Tine.widgets.grid.GridPanel
	 * 
	 * <p>List Grid Panel</p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Frederic Heihoff <heihoff@sh-systems.eu>
	 * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Addressbook.ListGridPanel
	 */
	Tine.Addressbook.ListGridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
	    /**
	     * record class
	     * @cfg {Tine.Addressbook.Model.List} recordClass
	     */
	    recordClass: Tine.Addressbook.Model.List,
	    
	    /**
	     * grid specific
	     * @private
	     */ 
	    defaultSortInfo: {field: 'name', direction: 'ASC'},
	    copyEditAction: true,
	    felamimail: false,
	    multipleEdit: false,
	    duplicateResolvable: false,
	    
	    /**
	     * @cfg {Bool} hasDetailsPanel 
	     */
	    hasDetailsPanel: false,
	    
	    /**
	     * inits this cmp
	     * @private
	     */
	    initComponent: function() {
	        this.recordProxy = Tine.Addressbook.listBackend;
	        
	        // check if felamimail is installed and user has run right and wants to use felamimail in adb
	        if (Tine.Felamimail && Tine.Tinebase.common.hasRight('run', 'Felamimail') && Tine.Felamimail.registry.get('preferences').get('useInAdb')) {
	            this.felamimail = (Tine.Felamimail.registry.get('preferences').get('useInAdb') == 1);
	        }
	        this.gridConfig.cm = this.getColumnModel();
	        this.filterToolbar = this.filterToolbar || this.getFilterToolbar();
	
	        if (this.hasDetailsPanel) {
	            this.detailsPanel = this.getDetailsPanel();
	        }
	
	        this.plugins = this.plugins || [];
	        this.plugins.push(this.filterToolbar);
	        
	        Tine.Addressbook.ListGridPanel.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 array with columns
	     * 
	     * @return {Array}
	     */
	    getColumns: function() {
	        return [
	            { id: 'type', header: this.app.i18n._('Type'), dataIndex: 'type', width: 30, renderer: Tine.Addressbook.ListGridPanel.listTypeRenderer, hidden: false },
	            { id: 'tags', header: this.app.i18n._('Tags'), dataIndex: 'tags', width: 50, renderer: Tine.Tinebase.common.tagsRenderer, sortable: false, hidden: false },
	            { id: 'name', header: this.app.i18n._('Name'), dataIndex: 'name', width: 30, hidden: false },
	            { id: 'list_type', header: this.app.i18n._('List type'), dataIndex: 'list_type', width: 30, renderer: Tine.Tinebase.widgets.keyfield.Renderer.get('Addressbook', 'listType'), hidden: false },
	            { id: 'emails', header: this.app.i18n._('Emails'), dataIndex: 'emails', hidden: false, renderer: function(value) {
	                if (! value) {
	                    return '';
	                }
	                // TODO should be fixed on server side
	                // remove leading comma
	                return value.replace(/^,/, '');
	            }},
	        ].concat(this.getModlogColumns().concat(this.getCustomfieldColumns()));
	    },
	    
	    /**
	     * @private
	     */
	    initActions: function() {        
	        Tine.Addressbook.ListGridPanel.superclass.initActions.call(this);
	    },
	
	    /**
	     * returns details panel
	     * 
	     * @private
	     * @return {Tine.Addressbook.ListGridDetailsPanel}
	     */
	    getDetailsPanel: function() {
	        return new Tine.Addressbook.ListGridDetailsPanel({
	            gridpanel: this,
	            il8n: this.app.i18n
	        });
	    }
	});
	
	/**
	 * list type renderer
	 *
	 * @private
	 * @return {String} HTML
	 */
	Tine.Addressbook.ListGridPanel.listTypeRenderer = function(data, cell, record) {
	    var i18n = Tine.Tinebase.appMgr.get('Addressbook').i18n,
	        type = ((record.get && record.get('type')) || record.type),
	        cssClass = type == 'group' ? 'renderer_typeGroupIcon' : 'renderer_typeListIcon',
	        qtipText = Tine.Tinebase.common.doubleEncode(type == 'group' ? i18n._('System Group') : i18n._('Group'));
	
	    return '<div ext:qtip="' + qtipText + '" style="background-position:0px;" class="' + cssClass + '">&#160</div>';
	};


/***/ },

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

	/**
	 * Tine 2.0
	 * 
	 * @package     Addressbook
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Frederic Heihoff <heihoff@sh-systems.eu>
	 * @copyright   Copyright (c) 2007-2009 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.ns('Tine.Addressbook');
	
	/**
	 * the details panel (shows List details)
	 * 
	 * @namespace   Tine.Addressbook
	 * @class       Tine.Addressbook.ListGridDetailsPanel
	 * @extends     Tine.widgets.grid.DetailsPanel
	 */
	Tine.Addressbook.ListGridDetailsPanel = Ext.extend(Tine.widgets.grid.DetailsPanel, {
	    
	    il8n: null,
	    felamimail: false,
	    
	    /**
	     * init
	     */
	    initComponent: function() {
	
	        // init templates
	        this.initTemplate();
	        this.initDefaultTemplate();
	        
	        Tine.Addressbook.ListGridDetailsPanel.superclass.initComponent.call(this);
	    },
	
	    /**
	     * add on click event after render
	     */
	    afterRender: function() {
	        Tine.Addressbook.ListGridDetailsPanel.superclass.afterRender.apply(this, arguments);
	    },
	    
	    /**
	     * init default template
	     */
	    initDefaultTemplate: function() {
	        
	        this.defaultTpl = new Ext.XTemplate(
	            '<div class="preview-panel-list-nobreak">',    
	                '<!-- Preview contacts -->',
	                '<div class="preview-panel preview-panel-list-left">',
	                    '<div class="bordercorner_1"></div>',
	                    '<div class="bordercorner_2"></div>',
	                    '<div class="bordercorner_3"></div>',
	                    '<div class="bordercorner_4"></div>',
	                    '<div class="preview-panel-declaration">' + this.il8n._('Lists') + '</div>',
	                    '<div class="preview-panel-list-leftside preview-panel-left">',
	                        '<span class="preview-panel-bold">',
	                            this.il8n._('Select list') + '<br/>',
	                            '<br/>',
	                            '<br/>',
	                            '<br/>',
	                        '</span>',
	                    '</div>',
	                '</div>',
	            '</div>'        
	        );
	    },
	    
	    /**
	     * init single List template (this.tpl)
	     */
	    initTemplate: function() {
	        this.tpl = new Ext.XTemplate(
	            '<div class="preview-panel-list-nobreak">',    
	                '<!-- Preview contacts -->',
	                '<div class="preview-panel preview-panel-list-left">',
	                    '<div class="bordercorner_1"></div>',
	                    '<div class="bordercorner_2"></div>',
	                    '<div class="bordercorner_3"></div>',
	                    '<div class="bordercorner_4"></div>',
	                    '<div class="preview-panel-declaration">' + this.il8n._('Lists') + '</div>',
	                    '<div class="preview-panel-list-leftside preview-panel-left" style="width: 100%">',
	                        '<span class="preview-panel-bold">',
	                            this.il8n._('List') + '<br/>',
	                        '</span>',
	                        '<div style="word-wrap:break-word;">{[values.emails]}</div>',
	                    '</div>',
	                '</div>',
	            '</div>'
	        );
	    }
	});


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010-2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 * 
	 * TODO         add 'one of / in' operator?
	 */
	Ext.ns('Tine.Addressbook');
	
	/**
	 * @namespace   Tine.Addressbook
	 * @class       Tine.Addressbook.ListMemberFilterModel
	 * @extends     Tine.widgets.grid.FilterModel
	 * 
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 */
	Tine.Addressbook.ListMemberFilterModel = Ext.extend(Tine.widgets.grid.FilterModel, {
	    /**
	     * @property Tine.Tinebase.Application app
	     */
	    app: null,
	    
	    field: 'list',
	    defaultOperator: 'equals',
	
	    /**
	     * @private
	     */
	    initComponent: function() {
	        Tine.Addressbook.ListMemberFilterModel.superclass.initComponent.call(this);
	        
	        this.app = Tine.Tinebase.appMgr.get('Addressbook');
	        
	        this.operators = ['equals'];
	        this.label = this.app.i18n._('Member of List');
	    },
	    
	    /**
	     * value renderer
	     * 
	     * @param {Ext.data.Record} filter line
	     * @param {Ext.Element} element to render to 
	     */
	    valueRenderer: function(filter, el) {
	        var value = new Tine.Tinebase.widgets.form.RecordPickerComboBox({
	            blurOnSelect: true,
	            recordClass: this.field == 'list' ? Tine.Addressbook.Model.List : Tine.Addressbook.Model.Contact,
	            filter: filter,
	            width: this.filterValueWidth,
	            id: 'tw-ftb-frow-valuefield-' + filter.id,
	            value: filter.data.value ? filter.data.value : this.defaultValue,
	            renderTo: el
	        });
	        value.on('select', this.onFiltertrigger, this);
	        return value;
	    }
	});
	
	Tine.widgets.grid.FilterToolbar.FILTERS['addressbook.listMember'] = Tine.Addressbook.ListMemberFilterModel;


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Addressbook
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2016 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.ns('Tine.Addressbook');
	
	/**
	 * @namespace   Tine.Addressbook
	 * @class       Tine.Addressbook.ListMemberRoleGridPanel
	 * @extends     Ext.grid.EditorGridPanel
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 */
	Tine.Addressbook.ListMemberRoleGridPanel = Ext.extend(Tine.widgets.grid.PickerGridPanel, {
	
	    recordClass: Tine.Addressbook.Model.Contact,
	    clicksToEdit: 1,
	    enableHdMenu: false,
	    autoExpandColumn: 'n_fileas',
	    memberroles: null,
	    memberRolesPanel: null,
	
	    // the list record
	    record: null,
	
	    /**
	     * init component
	     */
	    initComponent: function() {
	        this.app = this.app ? this.app : Tine.Tinebase.appMgr.get('Addressbook');
	
	        this.title = this.hasOwnProperty('title') ? this.title : this.app.i18n._('Members');
	        this.plugins = this.plugins || [];
	        this.plugins.push(new Ext.ux.grid.GridViewMenuPlugin({}));
	
	        this.sm = new Ext.grid.RowSelectionModel({singleSelect:true});
	
	        this.initColumns();
	        this.store = new Ext.data.Store({
	            autoSave: false,
	            fields:  Tine.Addressbook.Model.Contact,
	            proxy: Tine.Addressbook.contactBackend,
	            reader: Tine.Addressbook.contactBackend.getReader(),
	            listeners: {
	                load: this.onLoad,
	                beforeload: this.onBeforeLoad,
	                scope: this
	            }
	        });
	
	        this.addListener("beforeedit", this.onBeforeEdit, this);
	        this.addListener("afteredit", this.onAfterEdit, this);
	
	        Tine.Addressbook.ListMemberRoleGridPanel.superclass.initComponent.call(this);
	    },
	
	    /**
	     * before cell edit
	     *
	     * @param o
	     */
	    onBeforeEdit: function(o) {
	        var ed = this.colModel.getCellEditor(o.column, o.row);
	        ed.record = o.record
	    },
	
	    /**
	     * before cell edit
	     *
	     * @param o
	     */
	    onAfterEdit: function(o) {
	        o.record.commit();
	
	        // update this.memberroles + memberRolesPanel
	        this.memberRolesPanel.setListRolesOfContact(o.record);
	    },
	
	    /**
	     * initialises grid with an array of member uids
	     */
	    setMembers: function(cb, scope) {
	        var options = {
	            loadCb: cb || Ext.emptyFn,
	            scope: scope
	        };
	
	        this.memberroles = this.record.get("memberroles");
	        this.store.load(options)
	    },
	
	    onBeforeLoad: function (store, options) {
	        var members = this.record.get("members") || [];
	
	        options.params = options.params || {};
	        options.params.paging = {"sort":"n_fileas","dir":"ASC"};
	        options.params.filter = [
	            {"field": "id", "operator": "in", "value": members}
	        ];
	    },
	
	    onLoad: function(store, records, options) {
	        this.store.sort("n_fileas", "ASC");
	        
	        if (this.memberroles) {
	            this.store.each(function(contact) {
	                var contactRoles = [];
	                Tine.log.debug(contact);
	                // TODO improve detection of matching contact (filter?)
	                Ext.each(this.memberroles, function(memberrole) {
	                    if (memberrole.contact_id.id == contact.get('id')
	                        && memberrole.list_id == this.record.get('id')
	                        && memberrole.list_role_id.id
	                    )
	                    {
	                        contactRoles.push(memberrole);
	                    }
	                }, this);
	                if (contactRoles.length > 0) {
	                    contact.set('memberroles', contactRoles);
	                    contact.commit();
	                }
	            }, this);
	
	            this.memberRolesPanel.setListRoles(this.memberroles);
	        }
	
	        if (Ext.isFunction(options.loadCb)) {
	            options.loadCb.call(options.scope || window);
	        }
	    },
	
	    /**
	     * returns current array of member uids
	     *
	     * @return []
	     */
	    getMembers: function() {
	        var result = [],
	            roles = null;
	        this.memberroles = [];
	
	        this.store.each(function(contact) {
	            if (contact.get('id')) {
	                result.push(contact.get('id'));
	                if (contact.get('memberroles').length > 0) {
	                    roles = contact.get('memberroles');
	                    Ext.each(roles, function (role) {
	                        role.contact_id = contact.get('id');
	                        role.list_id = this.record.get('id');
	                        this.memberroles.push(role);
	                    }, this);
	                }
	            }
	        }, this);
	
	        return result;
	    },
	
	    /**
	     * returns current array of member roles
	     *
	     * @return []
	     */
	    getMemberRoles: function() {
	        return this.memberroles;
	    },
	
	    /**
	     * init columns
	     */
	    initColumns: function() {
	        this.columns = this.getColumns();
	        this.editors = [];
	        var visibleColumns = ["n_fileas", "email", "memberroles"];
	        Ext.each(this.columns, function(value, idx) {
	            if (visibleColumns.indexOf(this.columns[idx].id) === -1) {
	                this.columns[idx].hidden = true;
	            } else {
	                this.columns[idx].width = 150;
	            }
	            if (this.columns[idx].id === "memberroles") {
	                this.editors[idx] = new Tine.Addressbook.ListMemberRoleLayerCombo({});
	                this.columns[idx].editor = this.editors[idx];
	            }
	        }, this);
	    },
	
	    /**
	     * returns array with columns
	     * 
	     * @return {Array}
	     */
	    getColumns: function() {
	        return Tine.Addressbook.ContactGridPanel.getBaseColumns(this.app.i18n);
	    },
	
	    // NOTE: Ext doc seems to be wrong on arguments here
	    onContextMenu: function(e, target) {
	        e.preventDefault();
	        var row = this.getView().findRowIndex(target);
	        var contact = this.store.getAt(row);
	        if (contact) {
	            // don't delete 'add' row
	            if (! contact.get('id')) {
	                return;
	            }
	
	            // select row
	            this.getSelectionModel().selectRow(row);
	
	            Tine.log.debug('onContextMenu - contact:');
	            Tine.log.debug(contact);
	
	            var items = [{
	                text: this.app.i18n._('Remove Member'),
	                iconCls: 'action_delete',
	                scope: this,
	                //disabled: ! this.record.get('editGrant'),
	                handler: function() {
	                    this.store.removeAt(row);
	                }
	            }, '-'];
	
	            this.ctxMenu = new Ext.menu.Menu({
	                items: items,
	                plugins: [{
	                    ptype: 'ux.itemregistry',
	                    key:   'Tinebase-MainContextMenu'
	                }],
	                listeners: {
	                    scope: this,
	                    hide: function() {
	                        this.getSelectionModel().clearSelections();
	                    }
	                }
	            });
	            this.ctxMenu.showAt(e.getXY());
	        }
	    }
	});


/***/ },

/***/ 198:
/***/ 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) 2016 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	Ext.ns('Tine.Addressbook');
	
	/**
	 * config grid panel
	 *
	 * @namespace   Tine.Addressbook
	 * @class       Tine.Addressbook.ListMemberRoleLayerCombo
	 * @extends     Tine.widgets.grid.LayerCombo
	 */
	Tine.Addressbook.ListMemberRoleLayerCombo = Ext.extend(Tine.widgets.grid.PickerGridLayerCombo, {
	
	    /**
	     * @cfg contact record
	     */
	    record: null,
	
	    /**
	     * @cfg grid record class
	     */
	    gridRecordClass: Tine.Addressbook.Model.ListRole,
	
	    /**
	     * sets values to innerForm (grid)
	     */
	    setFormValue: function (value) {
	        var listRoles = [];
	        if (Ext.isArray(value)) {
	            Ext.each(value, function (role) {
	                listRoles.push(role.list_role_id);
	            });
	        }
	
	        this.setStoreFromArray(listRoles);
	    },
	
	    /**
	     * retrieves values from grid
	     *
	     * @returns {*|Array}
	     */
	    getFormValue: function () {
	        var listRoles = this.getFromStoreAsArray(),
	            result = [];
	
	        Ext.each(listRoles, function(role) {
	            result.push({
	                list_role_id: role,
	                contact_id: this.record,
	            })
	        }, this);
	
	        return result;
	    },
	});


/***/ },

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

	/*
	 * Tine 2.0
	 *
	 * @package     Addressbook
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2016 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	
	/*global Ext, Tine*/
	
	Ext.ns('Tine.Addressbook');
	
	/**
	 * @namespace   Tine.Addressbook
	 * @class       Tine.Addressbook.ListRoleEditDialog
	 * @extends     Tine.widgets.dialog.EditDialog
	 * Addressbook Edit Dialog <br>
	 *
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 */
	Tine.Addressbook.ListRoleEditDialog = Ext.extend(Tine.widgets.dialog.SimpleRecordEditDialog, {
	    windowNamePrefix: 'ListRoleEditWindow_',
	    appName: 'Addressbook',
	    recordClass: Tine.Addressbook.Model.ListRole,
	});
	
	/**
	 * Opens a new contact edit dialog window
	 *
	 * @return {Ext.ux.Window}
	 */
	Tine.Addressbook.ListRoleEditDialog.openWindow = function (config) {
	    var id = (config.record && config.record.id) ? config.record.id : 0;
	    var window = Tine.WindowFactory.getWindow({
	        width: 400,
	        height: 300,
	        name: Tine.Addressbook.ListRoleEditDialog.prototype.windowNamePrefix + id,
	        contentPanelConstructor: 'Tine.Addressbook.ListRoleEditDialog',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Addressbook
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2016 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.ns('Tine.Addressbook');
	
	/**
	 * @namespace   Tine.Addressbook
	 * @class       Tine.Addressbook.ListRoleGridPanel
	 * @extends     Ext.grid.EditorGridPanel
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 *
	 * NOTE: this is currently only used in ListEditDialog. If we need a separate ListRole grid panel with toolbars, filters,
	 * ... this needs to be splitted/renamed.
	 */
	Tine.Addressbook.ListRoleGridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
	
	    recordClass: Tine.Addressbook.Model.ListRole,
	    usePagingToolbar: false,
	
	    autoExpandColumn: 'name',
	    memberroles: null,
	
	    // the list record
	    record: null,
	
	    // deactivate some fns
	    initActions: Ext.emptyFn,
	    initFilterPanel: Ext.emptyFn,
	
	    /**
	     * init component
	     */
	    initComponent: function() {
	        this.app = this.app ? this.app : Tine.Tinebase.appMgr.get('Addressbook');
	
	        this.gridConfig.cm = new Ext.grid.ColumnModel({
	            defaults: {
	                resizable: true
	            },
	            columns: this.getColumns()
	        });
	
	        this.title = this.app.i18n._('List Roles')
	
	        Tine.Addressbook.ListRoleGridPanel.superclass.initComponent.call(this);
	    },
	
	    getColumns: function() {
	        return [{
	            id: 'id',
	            header: this.app.i18n._("ID"),
	            width: 50,
	            sortable: true,
	            dataIndex: 'id',
	            hidden: true
	        }, {
	            id: 'name',
	            header: this.app.i18n._("Name"),
	            width: 100,
	            sortable: true,
	            dataIndex: 'name'
	        }, {
	            id: 'members',
	            header: this.app.i18n._("Members"),
	            width: 150,
	            sortable: true,
	            dataIndex: 'members',
	            renderer: this.memberRenderer
	        }];
	    },
	
	    /**
	     * fill store with list roles and the members
	     *
	     * @param [] memberroles
	     */
	    setListRoles: function(memberroles) {
	        Ext.each(memberroles, function(memberrole) {
	            this.updateListRole(memberrole);
	        }, this);
	    },
	
	    updateListRole: function(memberrole) {
	        // check if already in store
	        var listRoleId = memberrole.list_role_id.id;
	
	        if (listRoleId) {
	            var listRole = this.getStore().getById(listRoleId),
	                insertNew = false,
	                members = [],
	                newMember = true;
	
	            if (! listRole) {
	                listRole = new this.recordClass(memberrole.list_role_id);
	                insertNew = true;
	                members = [memberrole.contact_id];
	            } else {
	                members = listRole.get('members');
	
	                Ext.each(members, function(member) {
	                    if (member.id == memberrole.contact_id.id) {
	                        // already id
	                        newMember = false;
	                    }
	                });
	
	                if (! newMember) {
	                    return;
	                }
	
	                members.push(memberrole.contact_id)
	            }
	
	            listRole.set('members', members);
	            listRole.commit();
	
	            if (insertNew) {
	                this.getStore().insert(0, listRole);
	            }
	        }
	    },
	
	    /**
	     * TODO implement removal of a memberrole OR reset role members after each update
	     *
	     * @param contact
	     */
	    setListRolesOfContact: function(contact) {
	        Ext.each(contact.get('memberroles'), function(memberrole) {
	            memberrole.contact_id = Ext.copyTo({}, contact.data, 'id,n_fn');
	            this.updateListRole(memberrole);
	        }, this);
	    },
	
	    memberRenderer: function(value) {
	        if (Ext.isArray(value)) {
	            var result = [];
	            Ext.each(value, function(contact) {
	                if (contact) {
	                    result.push(contact.n_fn);
	                }
	            });
	            return result.toString();
	        }
	
	        return '';
	    }
	});


/***/ },

/***/ 201:
/***/ 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) 2016 Metaways Infosystems GmbH (http://www.metaways.de)
	 * 
	 * TODO         add 'one of / in' operator?
	 */
	Ext.ns('Tine.Addressbook');
	
	/**
	 * @namespace   Tine.Addressbook
	 * @class       Tine.Addressbook.ListRoleMemberFilterModel
	 * @extends     Tine.widgets.grid.FilterModel
	 * 
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 */
	Tine.Addressbook.ListRoleMemberFilterModel = Ext.extend(Tine.widgets.grid.FilterModel, {
	    /**
	     * @property Tine.Tinebase.Application app
	     */
	    app: null,
	    
	    field: 'list_role_id',
	    defaultOperator: 'equals',
	    
	    /**
	     * @private
	     */
	    initComponent: function() {
	        Tine.Addressbook.ListRoleMemberFilterModel.superclass.initComponent.call(this);
	        
	        this.app = Tine.Tinebase.appMgr.get('Addressbook');
	        
	        this.operators = ['equals'];
	        this.label = this.app.i18n._('List Role');
	    },
	    
	    /**
	     * value renderer
	     * 
	     * @param {Ext.data.Record} filter line
	     * @param {Ext.Element} element to render to 
	     */
	    valueRenderer: function(filter, el) {
	        var value = new Tine.Tinebase.widgets.form.RecordPickerComboBox({
	            blurOnSelect: true,
	            recordClass: Tine.Addressbook.Model.ListRole,
	            filter: filter,
	            width: this.filterValueWidth,
	            id: 'tw-ftb-frow-valuefield-' + filter.id,
	            value: filter.data.value ? filter.data.value : this.defaultValue,
	            renderTo: el
	        });
	        value.on('select', this.onFiltertrigger, this);
	        return value;
	    }
	});
	
	Tine.widgets.grid.FilterToolbar.FILTERS['addressbook.listRoleMember'] = Tine.Addressbook.ListRoleMemberFilterModel;


/***/ },

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

	/*
	 * Tine 2.0
	 * contacts combo box and store
	 *
	 * @package     Addressbook
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiß <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2016 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	
	Ext.ns('Tine.Addressbook');
	
	Tine.Addressbook.ListSearchCombo = Ext.extend(Tine.Tinebase.widgets.form.RecordPickerComboBox, {
	
	    /**
	     * @cfg {Boolean} groupOnly
	     */
	    groupOnly: false,
	    departmentOnly: false,
	
	    //private
	    initComponent: function(){
	        this.app = Tine.Tinebase.appMgr.get('Addressbook');
	        this.recordClass = Tine.Addressbook.Model.List;
	
	        this.emptyText = this.emptyText || (this.groupOnly ?
	            this.app.i18n._('Search for system groups ...') :
	            this.app.i18n._('Search for groups ...')
	        );
	
	        this.supr().initComponent.call(this);
	    },
	
	    /**
	     * use beforequery to set query filter
	     *
	     * @param {Event} qevent
	     */
	    onBeforeQuery: function(qevent){
	        Tine.Addressbook.SearchCombo.superclass.onBeforeQuery.apply(this, arguments);
	
	        var contactFilter = {condition: 'AND', filters: this.store.baseParams.filter},
	            pathFilter = { field: 'path', operator: 'contains', value: qevent.query };
	
	        this.store.baseParams.filter = [{condition: "OR", filters: [
	            contactFilter,
	            pathFilter
	        ] }];
	
	        if (this.groupOnly) {
	            this.store.baseParams.filter.push({field: 'type', operator: 'equals', value: 'group'});
	        }
	        
	        if (this.departmentOnly) {
	            this.store.baseParams.filter.push({field: 'list_type', operator: 'equals', value: 'department'});
	        }
	    },
	
	    /**
	     * init template
	     * @private
	     */
	    initTemplate: function() {
	        if (! this.tpl) {
	            this.tpl = new Ext.XTemplate('<tpl for=".">',
	                    '<div class="x-combo-list-item">',
	                        '<table>',
	                            '<tr>',
	                                '<td style="min-width: 20px;">{[Tine.Addressbook.ListGridPanel.listTypeRenderer(null, null, values)]}</td>',
	                                '<td width="100%">{[Tine.Tinebase.EncodingHelper.encode(values.name)]}</td>',
	                            '</tr>',
	                        '</table>',
	                        '{[Tine.widgets.path.pathsRenderer(values.paths, this.getLastQuery())]}',
	                    '</div>',
	                '</tpl>', {
	                    getLastQuery: this.getLastQuery.createDelegate(this)
	                }
	            );
	        }
	    }
	});
	
	Tine.widgets.form.RecordPickerManager.register('Addressbook', 'List', Tine.Addressbook.ListSearchCombo);


/***/ },

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

	/*
	 * Tine 2.0
	 *
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Michael Spahn <m.spahn@metaways.de>
	 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Addressbook');
	
	/**
	 * Render given MailAddresss
	 *
	 * @namespace   Tine.Addressbook
	 * @author      Michael Spahn <m.spahn@metaways.de>
	 * @singleton
	 */
	Tine.Addressbook.mailAddressRenderer = function (email) {
	    if (!email) {
	        return '';
	    }
	
	    email = Tine.Tinebase.EncodingHelper.encode(email);
	    var link = (this.felamimail === true) ? '#' : 'mailto:' + email;
	    var id = Ext.id() + ':' + email;
	
	    return '<a href="' + link + '" class="tinebase-email-link" id="' + id + '">'
	        + Ext.util.Format.ellipsis(email, 18) + '</a>';
	};
	
	Tine.widgets.grid.RendererManager.register('Addressbook', 'Addressbook_Model_Contact', 'email', Tine.Addressbook.mailAddressRenderer, 'displayPanel');
	


/***/ },

/***/ 204:
/***/ 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-2008 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	
	/*global Ext, Tine*/
	
	Ext.ns('Tine.Addressbook');
	
	Tine.Addressbook.MapPanel = Ext.extend(Ext.Panel, {
	    
	    /**
	     * @property
	     */    
	    activeMapCard: null,
	    
	    record: null,
	    
	    layout: 'fit',
	    frame: true,
	    
	    /**
	     * Company address map panel
	     * @type {Tine.widgets.MapPanel}
	     */
	    companyMap: null,
	    
	    /**
	     * Private address map panel
	     * @type {Tine.widgets.MapPanel}
	     */
	    privateMap: null,
	    
	    initComponent: function () {
	        this.app = Tine.Tinebase.appMgr.get('Addressbook');
	        
	        this.title = this.app.i18n._('Map');
	
	        this.defaults = {
	            border: false
	        };
	        
	        this.mapCards = new Ext.Panel({
	            layout: 'card',
	            activeItem: 0,
	            items: []
	        });
	
	        this.idPrefix = Ext.id();
	        
	        this.tbar = [{
	            id: this.idPrefix + 'tglbtn' + 'companyMap',
	            enableToggle: true,
	            allowDepress: false,
	            text: this.app.i18n._('Company address'),
	            handler: this.onMapChange.createDelegate(this, ['companyMap']),
	            toggleGroup: this.idPrefix + 'maptglgroup'
	        }, ' ', {
	            id: this.idPrefix + 'tglbtn' + 'privateMap',
	            enableToggle: true,
	            allowDepress: false,
	            text: this.app.i18n._('Private address'),
	            handler: this.onMapChange.createDelegate(this, ['privateMap']),
	            toggleGroup: this.idPrefix + 'maptglgroup'
	        }];
	        
	        this.items = this.mapCards;
	        
	        Tine.Addressbook.MapPanel.superclass.initComponent.call(this);
	    },
	    
	    /**
	     * Change active map card
	     * 
	     * @param {String} map
	     */
	    onMapChange: function (map) {
	        this.mapCards.layout.setActiveItem(this[map]);
	        this.mapCards.layout.layout();
	        this.activeMapCard = this[map];
	    },
	    
	    /**
	     * Called after contact record is loaded to fill map panels
	     * 
	     * @param {Tine.Addressbook.Model.Contact} record
	     */
	    onRecordLoad: function (record) {
	        this.record = record;
	        
	        var adrOne = ! Ext.isEmpty(this.record.get('adr_one_lon')) && ! Ext.isEmpty(this.record.get('adr_one_lat')),
	            adrTwo = ! Ext.isEmpty(this.record.get('adr_two_lon')) && ! Ext.isEmpty(this.record.get('adr_two_lat')),
	            
	            btnOne = Ext.getCmp(this.idPrefix + 'tglbtn' + 'companyMap'),
	            btnTwo = Ext.getCmp(this.idPrefix + 'tglbtn' + 'privateMap');
	        
	           // if we have coordinates for company address add map panel
	        if (adrOne && ! this.companyMap) {
	            Tine.log.debug('Add company address map');
	            this.companyMap = new Tine.widgets.MapPanel({
	                map: 'companyMap',
	                layout: 'fit',
	                zoom: 15,
	                listeners: {
	                    scope: this,
	                    'mapAdded': function (p) {
	                        if (! p.center) {
	                            Tine.log.debug('Loading company address map coordinates: ' + this.record.get('adr_one_lon') + ', ' + this.record.get('adr_one_lat'));
	                            p.setCenter(this.record.get('adr_one_lon'), this.record.get('adr_one_lat'));
	                        }
	                    }
	                }
	            });
	            this.mapCards.add(this.companyMap);
	            this.mapCards.doLayout();
	        }
	        
	        // if we have coordinates for private address add map panel
	        if (adrTwo && ! this.privateMap) {
	            Tine.log.debug('Add private address map');
	            this.privateMap = new Tine.widgets.MapPanel({
	                map: 'privateMap',
	                layout: 'fit',
	                zoom: 15,
	                listeners: {
	                    scope: this,
	                    'mapAdded': function (p) {
	                        if (! p.center) {
	                            Tine.log.debug('Loading private address map coordinates: ' + this.record.get('adr_two_lon') + ', ' + this.record.get('adr_two_lat'));
	                            p.setCenter(this.record.get('adr_two_lon'), this.record.get('adr_two_lat'));
	                        }
	                    }
	                }
	            });
	            this.mapCards.add(this.privateMap);
	            this.mapCards.doLayout();
	        }
	            
	        btnOne.toggle(adrOne);
	        btnOne.setDisabled(! adrOne);
	        
	        btnTwo.toggle(! adrOne && adrTwo);
	        btnTwo.setDisabled(! adrTwo);
	    },
	    
	    onRecordUpdate: function (record) {
	    }
	});


/***/ },

/***/ 205:
/***/ 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)
	 */
	 
	/*global Ext, Tine*/
	 
	Ext.ns('Tine.Addressbook.Model');
	
	// TODO: move this into model definition and replace uscases (?) with getter fn
	Tine.Addressbook.Model.ContactArray = Tine.Tinebase.Model.genericFields.concat([
	    {name: 'id', omitDuplicateResolving: true},
	    {name: 'tid', omitDuplicateResolving: true},
	    {name: 'private', omitDuplicateResolving: true},
	    {name: 'cat_id', omitDuplicateResolving: true},
	    {name: 'n_family', label: 'Last Name', group: 'Name' },//_('Last Name') _('Name')
	    {name: 'n_given', label: 'First Name', group: 'Name' }, //_('First Name')
	    {name: 'n_middle', label: 'Middle Name', group: 'Name' }, //_('Middle Name')
	    {name: 'n_prefix', label: 'Title', group: 'Name' }, //_('Title')
	    {name: 'n_suffix', label: 'Suffix', group: 'Name'}, //_('Suffix')
	    {name: 'n_fn', label: 'Display Name', group: 'Name', omitDuplicateResolving: true }, //_('Display Name')
	    {name: 'n_fileas', group: 'Name', omitDuplicateResolving: true },
	    {name: 'bday', label: 'Birthday', type: 'date', dateFormat: Date.patterns.ISO8601Long }, //_('Birthday')
	    {name: 'org_name', label: 'Company', group: 'Company' }, //_('Company')
	    {name: 'org_unit', label: 'Unit', group: 'Company' }, //_('Unit')
	    {name: 'salutation', label: 'Salutation', group: 'Name' }, //_('Salutation')
	    {name: 'title', label: 'Job Title', group: 'Company' }, //_('Job Title')
	    {name: 'role', label: 'Job Role', group: 'Company' }, //_('Job Role')
	    {name: 'assistent', group: 'Company', omitDuplicateResolving: true},
	    {name: 'room', label: 'Room', group: 'Company' }, //_('Room')
	    {name: 'adr_one_street', label: 'Street (Company Address)', group: 'Company Address' }, //_('Street (Company Address)')  _('Company Address')
	    {name: 'adr_one_street2', label: 'Street 2 (Company Address)', group: 'Company Address' }, //_('Street 2 (Company Address)')
	    {name: 'adr_one_locality', label: 'City (Company Address)', group: 'Company Address' }, //_('City (Company Address)')
	    {name: 'adr_one_region', label: 'Region (Company Address)', group: 'Company Address' }, //_('Region (Company Address)')
	    {name: 'adr_one_postalcode', label: 'Postal Code (Company Address)', group: 'Company Address' }, //_('Postal Code (Company Address)')
	    {name: 'adr_one_countryname', label: 'Country (Company Address)', group: 'Company Address' }, //_('Country (Company Address)')
	    {name: 'adr_one_lon', label: 'Longitude (Company Address)', group: 'Company Address', omitDuplicateResolving: true }, //_('Longitude (Company Address)')
	    {name: 'adr_one_lat', label: 'Latitude (Company Address)', group: 'Company Address', omitDuplicateResolving: true }, //_('Latitude (Company Address)')
	    {name: 'label', omitDuplicateResolving: true},
	    {name: 'adr_two_street', label: 'Street (Private Address)', group: 'Private Address' }, //_('Street (Private Address)')  _('Private Address')
	    {name: 'adr_two_street2', label: 'Street 2 (Private Address)', group: 'Private Address' }, //_('Street 2 (Private Address)')
	    {name: 'adr_two_locality', label: 'City (Private Address)', group: 'Private Address' }, //_('City (Private Address)')
	    {name: 'adr_two_region', label: 'Region (Private Address)', group: 'Private Address' }, //_('Region (Private Address)')
	    {name: 'adr_two_postalcode', label: 'Postal Code (Private Address)', group: 'Private Address' }, //_('Postal Code (Private Address)')
	    {name: 'adr_two_countryname', label: 'Country (Private Address)', group: 'Private Address' }, //_('Country (Private Address)')
	    {name: 'adr_two_lon', group: 'Private Address', omitDuplicateResolving: true},
	    {name: 'adr_two_lat', group: 'Private Address', omitDuplicateResolving: true},
	    {name: 'preferred_address', group: 'Preferred Address', omitDuplicateResolving: true}, //_('Preferred Address')
	    {name: 'tel_work', label: 'Phone', group: 'Company Communication' }, //_('Phone') _('Company Communication')
	    {name: 'tel_cell', label: 'Mobile', group: 'Company Communication' }, //_('Mobile')
	    {name: 'tel_fax', label: 'Fax', group: 'Company Communication' }, //_('Fax')
	    {name: 'tel_assistent', group: 'contact_infos', omitDuplicateResolving: true },
	    {name: 'tel_car', group: 'contact_infos', omitDuplicateResolving: true },
	    {name: 'tel_pager', group: 'contact_infos', omitDuplicateResolving: true },
	    {name: 'tel_home', label: 'Phone (private)', group: 'Private Communication' }, //_('Phone (private)') _('Private Communication')
	    {name: 'tel_fax_home', label: 'Fax (private)', group: 'Private Communication' }, //_('Fax (private)')
	    {name: 'tel_cell_private', label: 'Mobile (private)', group: 'Private Communication' }, //_('Mobile (private)')
	    {name: 'tel_other', group: 'contact_infos', omitDuplicateResolving: true },
	    {name: 'tel_prefer', group: 'contact_infos', omitDuplicateResolving: true},
	    {name: 'email', label: 'E-Mail', group: 'Company Communication' }, //_('E-Mail')
	    {name: 'email_home', label: 'E-Mail (private)', group: 'Private Communication' }, //_('E-Mail (private)')
	    {name: 'url', label: 'Web', group: 'Company Communication' }, //_('Web')
	    {name: 'url_home', label: 'Web (private)', group: 'Private Communication' }, //_('Web (private)')
	    {name: 'freebusy_uri', omitDuplicateResolving: true},
	    {name: 'calendar_uri', omitDuplicateResolving: true},
	    {name: 'note', label: 'Description' }, //_('Description')
	    {name: 'tz', omitDuplicateResolving: true},
	    {name: 'pubkey', omitDuplicateResolving: true},
	    {name: 'jpegphoto', omitDuplicateResolving: true},
	    {name: 'account_id', omitDuplicateResolving: true},
	    {name: 'tags'},
	    {name: 'notes', omitDuplicateResolving: true},
	    {name: 'relations', omitDuplicateResolving: true},
	    {name: 'customfields', omitDuplicateResolving: true},
	    {name: 'attachments', omitDuplicateResolving: true},
	    {name: 'paths', omitDuplicateResolving: true},
	    {name: 'type', omitDuplicateResolving: true},
	    {name: 'memberroles', omitDuplicateResolving: true},
	    {name: 'industry', omitDuplicateResolving: true},
	    {name: 'groups', label: 'Groups'} //_('Groups')
	]);
	
	/**
	 * @namespace   Tine.Addressbook.Model
	 * @class       Tine.Addressbook.Model.Contact
	 * @extends     Tine.Tinebase.data.Record
	 * @constructor
	 * Model of a contact<br>
	 * 
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 */
	Tine.Addressbook.Model.Contact = Tine.Tinebase.data.Record.create(Tine.Addressbook.Model.ContactArray, {
	    appName: 'Addressbook',
	    modelName: 'Contact',
	    idProperty: 'id',
	    titleProperty: 'n_fn',
	    // ngettext('Contact', 'Contacts', n); gettext('Contacts');
	    recordName: 'Contact',
	    recordsName: 'Contacts',
	    containerProperty: 'container_id',
	    // ngettext('Addressbook', 'Addressbooks', n); gettext('Addressbooks');
	    containerName: 'Addressbook',
	    containersName: 'Addressbooks',
	    copyOmitFields: ['account_id', 'type'],
	    
	    /**
	     * returns true if record has an email address
	     * @return {Boolean}
	     */
	    hasEmail: function() {
	        return this.get('email') || this.get('email_home');
	    },
	    
	    /**
	     * returns true preferred email if available
	     * @return {String}
	     */
	    getPreferredEmail: function(preferred) {
	        var preferred = preferred || 'email',
	            other = preferred == 'email' ? 'email_home' : 'email';
	            
	        return (this.get(preferred) || this.get(other));
	    },
	
	    getTitle: function() {
	        var result = this.get('n_fn');
	
	        var tinebaseApp = new Tine.Tinebase.Application({
	            appName: 'Tinebase'
	        });
	        if (tinebaseApp.featureEnabled('featureShowAccountEmail')) {
	            var email = this.getPreferredEmail();
	            if (email) {
	                result += ' (' + email + ')';
	            }
	        }
	
	        return result;
	    }
	});
	
	/**
	 * Make resource model available in adb
	 */
	Tine.Addressbook.Model.Resource = Tine.Tinebase.data.Record.create(Tine.Tinebase.Model.genericFields.concat([
	    {name: 'id'},
	    {name: 'name'},
	    {name: 'description'},
	    {name: 'email'},
	    {name: 'max_number_of_people', type: 'int'},
	    {name: 'type', type: 'keyField', keyFieldConfigName: 'resourceTypes'},
	    {name: 'status', type: 'keyField', keyFieldConfigName: 'attendeeStatus'},
	    {name: 'busy_type', type: 'keyField', keyFieldConfigName: 'freebusyTypes'},
	    {name: 'suppress_notification', type: 'bool'},
	    {name: 'tags'},
	    {name: 'notes'},
	    {name: 'grants'},
	    { name: 'attachments'},
	    { name: 'relations',   omitDuplicateResolving: true},
	    { name: 'customfields', omitDuplicateResolving: true}
	]), {
	    appName: 'Calendar',
	    modelName: 'Resource',
	    idProperty: 'id',
	    titleProperty: 'name',
	    containerProperty: 'container_id',
	    // ngettext('Resource', 'Resources', n); gettext('Resources');
	    recordName: 'Resource',
	    recordsName: 'Resources'
	});
	
	/**
	 * get filtermodel of contact model
	 * 
	 * @namespace Tine.Addressbook.Model
	 * @static
	 * @return {Array} filterModel definition
	 */ 
	Tine.Addressbook.Model.Contact.getFilterModel = function() {
	    var app = Tine.Tinebase.appMgr.get('Addressbook');
	    
	    var typeStore = [['contact', app.i18n._('Contact')], ['user', app.i18n._('User Account')]];
	    
	    var filters = [
	        {label: i18n._('Quick Search'),                                                      field: 'query',              operators: ['contains']},
	        {filtertype: 'tine.widget.container.filtermodel', app: app, recordClass: Tine.Addressbook.Model.Contact},
	        {filtertype: 'addressbook.listMember', app: app},
	        {filtertype: 'addressbook.listRoleMember', app: app},
	        {label: app.i18n._('Title'),                                                    field: 'n_prefix' },
	        {label: app.i18n._('First Name'),                                               field: 'n_given' },
	        {label: app.i18n._('Last Name'),                                                field: 'n_family'},
	        {label: app.i18n._('Middle Name'),                                              field: 'n_middle'},
	        {label: app.i18n._('Company'),                                                  field: 'org_name'},
	        {label: app.i18n._('Unit'),                                                     field: 'org_unit'},
	        {label: app.i18n._('Phone'),                                                    field: 'telephone',          operators: ['contains']},
	        {label: app.i18n._('Job Title'),                                                field: 'title'},
	        {label: app.i18n._('Description'),                                              field: 'note'},
	        {label: app.i18n._('E-Mail'),                                                   field: 'email_query',        operators: ['contains']},
	        {filtertype: 'tinebase.tag', app: app},
	//        {label: app.i18n._('Job Role'),                                                 field: 'role'},
	//        {label: app.i18n._('Birthday'),    field: 'bday', valueType: 'date'},
	        {label: app.i18n._('Street') + ' (' + app.i18n._('Company Address') + ')',      field: 'adr_one_street',     defaultOperator: 'equals'},
	        {label: app.i18n._('Region') + ' (' + app.i18n._('Company Address') + ')',      field: 'adr_one_region',     defaultOperator: 'equals'},
	        {label: app.i18n._('Postal Code') + ' (' + app.i18n._('Company Address') + ')', field: 'adr_one_postalcode', defaultOperator: 'equals'},
	        {label: app.i18n._('City') + '  (' + app.i18n._('Company Address') + ')',       field: 'adr_one_locality'},
	        {label: app.i18n._('Country') + '  (' + app.i18n._('Company Address') + ')',    field: 'adr_one_countryname', valueType: 'country'},
	        {label: app.i18n._('Street') + ' (' + app.i18n._('Private Address') + ')',      field: 'adr_two_street',     defaultOperator: 'equals'},
	        {label: app.i18n._('Region') + ' (' + app.i18n._('Private Address') + ')',      field: 'adr_two_region',     defaultOperator: 'equals'},
	        {label: app.i18n._('Postal Code') + ' (' + app.i18n._('Private Address') + ')', field: 'adr_two_postalcode', defaultOperator: 'equals'},
	        {label: app.i18n._('City') + ' (' + app.i18n._('Private Address') + ')',        field: 'adr_two_locality'},
	        {label: app.i18n._('Country') + '  (' + app.i18n._('Private Address') + ')',    field: 'adr_two_countryname', valueType: 'country'},
	        {label: app.i18n._('Type'), defaultValue: 'contact', valueType: 'combo',        field: 'type',               store: typeStore},
	        {label: i18n._('Last Modified Time'),                                                field: 'last_modified_time', valueType: 'date'},
	        {label: i18n._('Last Modified By'),                                                  field: 'last_modified_by',   valueType: 'user'},
	        {label: i18n._('Creation Time'),                                                     field: 'creation_time',      valueType: 'date'},
	        {label: i18n._('Created By'),                                                        field: 'created_by',         valueType: 'user'},
	        {
	            label: app.i18n._('Salutation'),
	            field: 'salutation',
	            filtertype: 'tine.widget.keyfield.filter',
	            app: app,
	            keyfieldName: 'contactSalutation',
	            defaultOperator: 'in'
	        }
	    ];
	    
	    if (Tine.Tinebase.appMgr.get('Addressbook').featureEnabled('featureIndustry')) {
	        filters.push({filtertype: 'foreignrecord', 
	            app: app,
	            foreignRecordClass: Tine.Addressbook.Model.Industry,
	            ownField: 'industry'
	        });
	    }
	    return filters;
	};
	
	/**
	 * default timesheets backend
	 */
	Tine.Addressbook.contactBackend = new Tine.Tinebase.data.RecordProxy({
	    appName: 'Addressbook',
	    modelName: 'Contact',
	    recordClass: Tine.Addressbook.Model.Contact
	});
	
	/**
	 * list model
	 */
	Tine.Addressbook.Model.List = Tine.Tinebase.data.Record.create([
	    {name: 'id'},
	    {name: 'container_id'},
	    {name: 'created_by'},
	    {name: 'creation_time'},
	    {name: 'seq'},
	    {name: 'last_modified_by'},
	    {name: 'last_modified_time'},
	    {name: 'is_deleted'},
	    {name: 'deleted_time'},
	    {name: 'deleted_by'},
	    {name: 'name'},
	    {name: 'description'},
	    {name: 'members'},
	    {name: 'memberroles'},
	    {name: 'email'},
	    {name: 'type'},
	    {name: 'list_type'},
	    {name: 'group_id'},
	    {name: 'emails'},
	    {name: 'notes', omitDuplicateResolving: true},
	    {name: 'paths', omitDuplicateResolving: true},
	    {name: 'relations', omitDuplicateResolving: true},
	    {name: 'customfields', omitDuplicateResolving: true},
	    {name: 'tags'}
	], {
	    appName: 'Addressbook',
	    modelName: 'List',
	    idProperty: 'id',
	    titleProperty: 'name',
	    // ngettext('List', 'Lists', n); gettext('Lists');
	    recordName: 'List',
	    recordsName: 'Lists',
	    containerProperty: 'container_id',
	    // ngettext('Addressbook', 'Addressbooks', n); gettext('Addressbooks');
	    containerName: 'Addressbook',
	    containersName: 'Addressbooks',
	    copyOmitFields: ['group_id']
	});
	
	Tine.Addressbook.Model.List.getFilterModel = function() {
	    
	    var app = Tine.Tinebase.appMgr.get('Addressbook');
	    
	    var typeStore = [['list', app.i18n._('List')], ['user', app.i18n._('User Account')]];
	    
	    return [
	        {label: i18n._('Quick search'),                                                      field: 'query',              operators: ['contains']},
	        {filtertype: 'tine.widget.container.filtermodel', app: app, recordClass: Tine.Addressbook.Model.Contact},
	        {filtertype: 'addressbook.listMember', app: app, field: 'contact'},
	        {label: app.i18n._('Name'),                                               field: 'name' },
	        {label: app.i18n._('Description'),                                                field: 'description', operators: ['contains', 'notcontains']},
	        {label: i18n._('Last Modified Time'),                                                field: 'last_modified_time', valueType: 'date'},
	        {label: i18n._('Last Modified By'),                                                  field: 'last_modified_by',   valueType: 'user'},
	        {label: i18n._('Creation Time'),                                                     field: 'creation_time',      valueType: 'date'},
	        {label: i18n._('Created By'),                                                        field: 'created_by',         valueType: 'user'},
	        {filtertype: 'tinebase.tag', app: app}
	    ];
	};
	
	/**
	 * default list backend
	 */
	Tine.Addressbook.listBackend = new Tine.Tinebase.data.RecordProxy({
	    appName: 'Addressbook',
	    modelName: 'List',
	    recordClass: Tine.Addressbook.Model.List
	});
	
	/**
	 * email address model
	 */
	Tine.Addressbook.Model.EmailAddress = Tine.Tinebase.data.Record.create([
	   {name: 'n_fileas'},
	   {name: 'emails'},
	   {name: 'email'},
	   {name: 'email_home'}
	], {
	    appName: 'Addressbook',
	    modelName: 'EmailAddress',
	    titleProperty: 'name',
	    // ngettext('Email Address', 'Email Addresses', n); gettext('Email Addresses');
	    recordName: 'Email Address',
	    recordsName: 'Email Addresses',
	    containerProperty: 'container_id',
	    // ngettext('Addressbook', 'Addressbooks', n); gettext('Addressbooks');
	    containerName: 'Addressbook',
	    containersName: 'Addressbooks',
	    copyOmitFields: ['group_id'],
	
	    getPreferredEmail: function(preferred) {
	        var emails = this.get("emails");
	        if (! this.get("email") && ! this.get("email_home")) {
	            return this.get("emails");
	        } else {
	            var preferred = preferred || 'email',
	            other = preferred == 'email' ? 'email_home' : 'email';
	            return (this.get(preferred) || this.get(other));
	        }
	    }
	});
	
	
	/**
	 * get filtermodel of emailaddress model
	 * 
	 * @namespace Tine.Addressbook.Model
	 * @static
	 * @return {Array} filterModel definition
	 */ 
	Tine.Addressbook.Model.EmailAddress.getFilterModel = function() {
	    return [
	        {label: i18n._('Quick search'),       field: 'query',              operators: ['contains']}
	    ];
	};
	
	/**
	 * ListRole model
	 */
	Tine.Addressbook.Model.ListRole = Tine.Tinebase.data.Record.create([
	    {name: 'id'},
	    {name: 'name'},
	    {name: 'members'},
	    {name: 'description'}
	], {
	    appName: 'Addressbook',
	    modelName: 'ListRole',
	    titleProperty: 'name',
	    // ngettext('List Role', 'List Roles', n); gettext('List Roles');
	    recordName: 'List Role',
	    recordsName: 'List Roles'
	});
	
	/**
	 * get filtermodel of ListRole model
	 *
	 * @namespace Tine.Addressbook.Model
	 * @static
	 * @return {Array} filterModel definition
	 */
	Tine.Addressbook.Model.ListRole.getFilterModel = function() {
	    return [
	        {label: i18n._('Quick search'),       field: 'query',              operators: ['contains']}
	    ];
	};
	
	/**
	
	/**
	 * Industry model
	 */
	Tine.Addressbook.Model.Industry = Tine.Tinebase.data.Record.create([
	    {name: 'id'},
	    {name: 'name'},
	    {name: 'description'}
	], {
	    appName: 'Addressbook',
	    modelName: 'Industry',
	    titleProperty: 'name',
	    // ngettext('Industry', 'Industries', n); gettext('Industries');
	    recordName: 'Industry',
	    recordsName: 'Industries'
	});
	
	/**
	 * get filtermodel of Industry model
	 *
	 * @namespace Tine.Addressbook.Model
	 * @static
	 * @return {Array} filterModel definition
	 */
	Tine.Addressbook.Model.Industry.getFilterModel = function() {
	    return [
	        {label: i18n._('Quick search'),       field: 'query',              operators: ['contains']}
	    ];
	};


/***/ },

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

	Ext.ns('Tine.Addressbook.Printer');
	
	Tine.Addressbook.Printer.ContactRenderer = Ext.extend(Ext.ux.Printer.BaseRenderer, {
	    stylesheetPath: 'Tinebase/css/widgets/RecordPrinter.css',
	
	    generateBody: function(contact) {
	        var i18n = Tine.Tinebase.appMgr.get('Addressbook').i18n;
	
	        return new Promise(function (fulfill, reject) {
	            var bodyTpl = new Ext.XTemplate(
	                '<div class="rp-print-single">',
	                '{[Tine.widgets.printer.headerRenderer()]}',
	                '<table><tr><td>',
	                '<div class="rp-print-single-image">',
	                '<img src="{jpegphoto}">',
	                '</div>',
	                '</td><td>',
	                '<div class="rp-print-single-block">',
	                '<div class="rp-print-single-details-row">',
	                '<span class="rp-print-single-value">{salutation} {n_prefix}</span>',
	                '</div>',
	                '<div class="rp-print-single-summary">',
	                '<span class="adb-print-single-value">{n_fn}</span>',
	                '</div>',
	                '<div class="rp-print-single-details-row">',
	                '{[this.fieldRenderer(values.org_name, "Company")]}',
	                '</div>',
	                '<div class="rp-print-single-details-row">',
	                '{[this.fieldRenderer(values.org_unit, "Unit")]}',
	                '</div>',
	                '<div class="rp-print-single-details-row">',
	                '{[this.fieldRenderer(values.industry, "Industry")]}',
	                '</div>',
	                '<div class="rp-print-single-details-row">',
	                '{[this.fieldRenderer(values.title, "Job Title")]}',
	                '</div>',
	                '<div class="rp-print-single-details-row">',
	                '{[this.fieldRenderer(values.bday, "Birthday")]}',
	                '</div>',
	                '</div>',
	                '</td></tr></table></br>',
	                '<div class="cal-print-single-block-heading">', i18n._('Contact Information'), '</div>',
	                '<div class="rp-print-single-block">',
	                '<div class="rp-print-single-details-row">',
	                '{[this.fieldRenderer(values.tel_work, "Phone")]}',
	                '</div>',
	                '<div class="rp-print-single-details-row">',
	                '{[this.fieldRenderer(values.tel_cell, "Mobile")]}',
	                '</div>',
	                '<div class="rp-print-single-details-row">',
	                '{[this.fieldRenderer(values.tel_home, "Phone (private)")]}',
	                '</div>',
	                '<div class="rp-print-single-details-row">',
	                '{[this.fieldRenderer(values.tel_cell_private, "Mobile (private)")]}',
	                '</div>',
	                '<div class="rp-print-single-details-row">',
	                '{[this.fieldRenderer(values.email, "E-Mail")]}',
	                '</div>',
	                '<div class="rp-print-single-details-row">',
	                '{[this.fieldRenderer(values.email_home, "E-Mail (private)")]}',
	                '</div>',
	                '<div class="rp-print-single-details-row">',
	                '{[this.fieldRenderer(values.url, "Web")]}',
	                '</div>',
	                '</div>',
	                '</br>',
	                '<div class="cal-print-single-block-heading">', i18n._('Company Address'), '</div>',
	                '<div class="rp-print-single-block">',
	                "{[this.addressRenderer({'street': 'adr_one_street', 'street2': 'adr_one_street2', 'postalcode': 'adr_one_postalcode', 'locality': 'adr_one_locality', 'region': 'adr_one_region','country': 'adr_one_countryname'})]}",
	                '</div>',
	                '</br>',
	                '<div class="cal-print-single-block-heading">', i18n._('Private Address'), '</div>',
	                '<div class="rp-print-single-block">',
	                "{[this.addressRenderer({'street': 'adr_two_street', 'street2': 'adr_two_street2', 'postalcode': 'adr_two_postalcode', 'locality': 'adr_two_locality', 'region': 'adr_two_region','country': 'adr_two_countryname'})]}",
	                '</div>',
	                '</br>',
	                '{[this.customFieldRenderer(values.customfields)]}',
	                '</br>',
	                '<div class="cal-print-single-block-heading">', i18n._('Related to'), '</div>',
	                '<div class="rp-print-single-block">',
	                '{[this.relationRenderer(values.relations)]}',
	                '</div>',
	                '</div>',
	
	                {
	                    customFieldRenderer: function (values) {
	                        return Tine.widgets.customfields.Renderer.renderAll('Addressbook', Tine.Addressbook.Model.Contact, values);
	                    },
	                    fieldRenderer: function (fieldValue, label) {
	                        return Tine.widgets.printer.fieldRenderer('Addressbook', Tine.Addressbook.Model.Contact, fieldValue, label);
	                    },
	                    addressRenderer: function (config) {
	                        var renderer = Tine.widgets.grid.RendererManager.get('Addressbook', 'Addressbook_Model_Contact', 'addressblock', 'displayPanel');
	                        return renderer(null, null, contact, null, null, null, config);
	                    },
	                    relationRenderer: function (values) {
	                        return Tine.widgets.relation.Renderer.renderAll(values);
	
	                    }
	
	                });
	            fulfill(bodyTpl.apply(contact.data));
	        })
	    }
	});


/***/ },

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

	Ext.ns('Tine.Addressbook.Printer');
	
	Tine.Addressbook.Printer.ListRenderer = Ext.extend(Ext.ux.Printer.BaseRenderer, {
	
	    stylesheetPath: 'Tinebase/css/widgets/RecordPrinter.css',
	
	    generateMemberBody: function(component) {
	        var renderer = new Ext.ux.Printer.GridPanelRenderer();
	
	        return new Promise(function (fulfill, reject) {
	            var data = renderer.extractData(component, component.store.data.items);
	            renderer.generateBody(component).then(function(bodyHtml) {
	                fulfill(new Ext.XTemplate(
	                    bodyHtml
	                ).apply(data));
	            });
	        });
	    },
	
	    generateBody: function(component) {
	        var i18n = Tine.Tinebase.appMgr.get('Addressbook').i18n;
	        var me = this;
	
	        return new Promise(function (fulfill, reject) {
	            me.generateMemberBody(component.memberGridPanel).then(function(memberHtml) {
	                fulfill(new Ext.XTemplate(
	                    '<div class="rp-print-single">',
	                    '{[Tine.widgets.printer.headerRenderer()]}',
	                    '<div class="rp-print-single-summary">',
	                    '<span class="adb-print-single-value">{name}</span>',
	                    '</div>',
	                    '<div class="rp-print-single-details-row">',
	                    '{[this.fieldRenderer("", "List type")]}',
	                    '{[this.keyFieldRenderer("listType", values.list_type)]}',
	                    '</div>',
	                    '<div class="rp-print-single-details-row">',
	                    '{[this.fieldRenderer(values.description, "Description")]}',
	                    '</div>',
	                    '</br>',
	                    '<div class="rp-print-single-block-heading">', i18n._('Members'), '</div>',
	                    memberHtml,
	                    '</br>',
	                    '{[this.customFieldRenderer(values.customfields)]}',
	                    '{[this.relationRenderer(values.relations)]}',
	                    '</div>',
	
	                    {
	                        keyFieldRenderer: function (keyField, values) {
	                            return Tine.Tinebase.widgets.keyfield.Renderer.render('Addressbook', keyField, values);
	                        },
	                        customFieldRenderer: function (values) {
	                            var customFields = '';
	
	                            customFields = Tine.widgets.customfields.Renderer.renderAll('Addressbook', Tine.Addressbook.Model.List, values);
	                            if(customFields) {
	                                return '<div class="rp-print-single-block-heading">' + i18n._('Customfields') + '</div>' + customFields + '</br>';
	                            }
	                        },
	                        fieldRenderer: function (fieldValue, label) {
	                            return Tine.widgets.printer.fieldRenderer('Addressbook', Tine.Addressbook.Model.list, fieldValue, label);
	                        },
	                        relationRenderer: function (values) {
	                            var relations = '';
	
	                            relations = Tine.widgets.relation.Renderer.renderAll(values);
	                            if (relations) {
	                                return '<div class="rp-print-single-block-heading">' + i18n._('Related to') + '</div></div>' + relations  + '</br>';
	                            }
	                        }
	                    }).apply(component.record.data));
	            });
	        });
	
	
	
	
	    }
	});
	
	        /*
	        var i18n = Tine.Tinebase.appMgr.get('Addressbook').i18n;
	        var bodyTpl = new Ext.XTemplate(
	            '<div class="rp-print-single">',
	            '{[Tine.widgets.printer.headerRenderer()]}',
	            '<div class="rp-print-single-block">',
	                '<div class="rp-print-single-summary">',
	                    '<span class="adb-print-single-value">{name}</span>',
	                '</div>',
	                '<div class="rp-print-single-details-row">',
	                '{[this.fieldRenderer("", "List type")]}',
	                '{[this.keyFieldRenderer("listType", values.list_type)]}',
	                '</div>',
	                '<div class="rp-print-single-details-row">',
	                '{[this.fieldRenderer(values.description, "Description")]}',
	                '</div>',
	            '</div>',
	            '</br>',
	            '<div class="rp-print-single-block-heading">', i18n._('Members'), '</div>',
	            '<div class="rp-print-single-block">',
	            '{[this.memberRenderer()]}',
	            '</div>',
	            '</br>',
	            '{[this.customFieldRenderer(values.customfields)]}',
	            '<div class="rp-print-single-block-heading">', i18n._('Related to'), '</div>',
	            '<div class="rp-print-single-block">',
	            '{[this.relationRenderer(values.relations)]}',
	            '</div>',
	            '</div>',
	
	        {
	            keyFieldRenderer: function (keyField, values) {
	                return Tine.Tinebase.widgets.keyfield.Renderer.render('Addressbook', keyField, values);
	            },
	            customFieldRenderer: function(values) {
	                var html = '';
	
	                if (values) {
	                    html = '<div class="rp-print-single-block-heading">' + i18n._('Customfields') + '</div>' +
	                    Tine.widgets.customfields.Renderer.renderAll('Addressbook', Tine.Addressbook.Model.List, values) + '</br>';
	                }
	
	                return html
	            },
	            fieldRenderer: function(fieldValue, label) {
	                return Tine.widgets.printer.fieldRenderer('Addressbook', Tine.Addressbook.Model.list, fieldValue, label);
	            },
	            relationRenderer: function(values) {
	                return Tine.widgets.relation.Renderer.renderAll(values);
	
	            },
	            memberRenderer: function() {
	                this.generateMemberGrid(list.memberGridPanel).then(function(html) {
	                    return html;
	                });
	
	            },
	
	            generateMemberGrid: function(component) {
	                var renderer = new Ext.ux.Printer.GridPanelRenderer();
	
	                return new Promise(function (fulfill, reject) {
	                    renderer.prepareData(component).then(function(data) {
	                        fulfill(new Ext.XTemplate(
	
	                            renderer.generateBody(component)
	
	                        ).apply(data));
	                    });
	                });
	            }
	        });
	        return bodyTpl.apply(record.data);
	        */
	


/***/ },

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

	/*
	 * Tine 2.0
	 *
	 * @package     Addressbook
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Michael Spahn <m.spahn@metaways.de>
	 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	Ext.ns('Tine.Addressbook');
	
	Ext.onReady(function() {
	    Tine.Addressbook.ResourceGridPanel = Ext.extend(Tine.Calendar.ResourcesGridPanel, {
	        initLayout: function () {
	            return Tine.Calendar.ResourcesGridPanel.superclass.initLayout.apply(this, arguments)
	        }
	    });
	
	    Tine.Addressbook.ResourceTreePanel = Ext.extend(Ext.Panel, {
	        getFilterPlugin: function () {
	            return {
	                init: Ext.emptyFn
	            };
	        }
	    });
	});

/***/ },

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

	/*
	 * Tine 2.0
	 *
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Michael Spahn <m.spahn@metaways.de>
	 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Addressbook');
	
	/**
	 * Render given URL as html
	 *
	 * @namespace   Tine.Addressbook
	 * @author      Michael Spahn <m.spahn@metaways.de>
	 * @singleton
	 */
	Tine.Addressbook.urlRenderer = function (url) {
	    return '<a href=' + Tine.Tinebase.EncodingHelper.encode(url, 'href') + ' target="_blank">' + Tine.Tinebase.EncodingHelper.encode(url, 'shorttext') + '</a>';
	};
	
	Tine.widgets.grid.RendererManager.register('Addressbook', 'Addressbook_Model_Contact', 'url', Tine.Addressbook.urlRenderer, 'displayPanel');

/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Addressbook
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2016 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.ns('Tine.Addressbook');
	
	/**
	 * @namespace   Tine.Addressbook
	 * @class       Tine.Addressbook.ListRoleGridPanel
	 * @extends     Ext.grid.EditorGridPanel
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 */
	Tine.Addressbook.contactListsGridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
	
	    recordClass: Tine.Addressbook.Model.List,
	    usePagingToolbar: false,
	
	    autoExpandColumn: 'name',
	
	    // the list record
	    record: null,
	
	    // deactivate some fns
	    initActions: Ext.emptyFn,
	    initFilterPanel: Ext.emptyFn,
	
	    /**
	     * init component
	     */
	    initComponent: function() {
	        this.app = this.app ? this.app : Tine.Tinebase.appMgr.get('Addressbook');
	        this.store = new Ext.data.JsonStore({
	            fields: Tine.Addressbook.Model.List
	        });
	
	        this.gridConfig.cm = new Ext.grid.ColumnModel({
	            defaults: {
	                resizable: true
	            },
	            columns: this.getColumns()
	        });
	
	        Tine.Addressbook.contactListsGridPanel.superclass.initComponent.call(this);
	    },
	
	
	    getColumns: function() {
	        return [
	            { id: 'type', header: this.app.i18n._('Type'), dataIndex: 'type', width: 30, renderer: Tine.Addressbook.ListGridPanel.listTypeRenderer, hidden: false },
	            {id: 'name', header: this.app.i18n._("Name"), width: 100, sortable: true, dataIndex: 'name'
	        }];
	    },
	
	
	
	});


/***/ },

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

	exports = module.exports = __webpack_require__(1)();
	// imports
	
	
	// module
	exports.push([module.id, ".action_addList{background-image:url(" + __webpack_require__(3) + ")!important}.x-btn-medium .action_addList{background-image:url(" + __webpack_require__(4) + ")!important}.x-btn-large .action_addList{background-image:url(" + __webpack_require__(5) + ")!important}.AddressbookContact,.AddressbookIconCls{background-image:url(" + __webpack_require__(825) + ")!important}.x-btn-medium .AddressbookIconCls{background-image:url(" + __webpack_require__(1190) + ")!important}.x-btn-large .AddressbookIconCls{background-image:url(" + __webpack_require__(1551) + ")!important}.action_parseAddress{background-image:url(" + __webpack_require__(757) + ")!important}.x-form-item-float-left{float:left;margin-right:5px}.renderer_typeAccountIcon{background-image:url(" + __webpack_require__(22) + ")!important}.renderer_typeAccountIcon,.renderer_typeContactIcon{background-repeat:no-repeat;background-position:2px 2px;height:16px}.renderer_typeContactIcon{background-image:url(" + __webpack_require__(60) + ")!important}.AddressbookList,.renderer_typeGroupIcon{background-image:url(" + __webpack_require__(3) + ")!important;background-repeat:no-repeat}.renderer_typeListIcon{background-image:url(" + __webpack_require__(747) + ")!important;background-repeat:no-repeat}.x-grid3-cell-inner .renderer_typeAccountIcon,.x-grid3-cell-inner .renderer_typeContactIcon{margin-bottom:-2px;margin-top:-2px}.renderer_displayNameRenderer_noName{font-style:italic}.addressbook-search-combo table{width:100%;font-size:11px;border:none}.addressbook-search-combo td{vertical-align:top;padding-top:4px}", ""]);
	
	// exports


/***/ },

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

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAlwSFlzAAABsQAAAbEBYZgoDgAAActpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+d3d3Lmlua3NjYXBlLm9yZzwveG1wOkNyZWF0b3JUb29sPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KGMtVWAAAAhtJREFUOBHt0TtsUlEYB/DvwC2PwoV7URoplCpIU5aaaomDE47WxYG1tXFxNZ3sxKSbMXHQmEYTTUx0V+OiRhMTTRxc0FSFKqEW+rw87uPcx+c5CEhinFw9w7lfznf+v3NyD8D/8c9/gAwLL+4WJUTPAhD4cnpp5clw72/1AHh24/K0is6bYECUY5Np1Klxf+7M+UUeZLCPwScJgXp+aeXTMPYbuF1cncpmL1CXHyQ5AtXymlFeezoeFI66dbQfisFQPpZMNXVqLs/NL672EVe/mDgcj0ykUpDKzsBYMg2JI2khHjgkE593fvb4iXxyegai8WQI0L706FrB388J/UKSpVeUGucEjwHguEAMiTU6daA2aSbCHEZ/FASPFxBtiW4mOKDx7OAG47nC9Y6y2xCsJuj7P6CxWbuTzxd1WQ5/MKmhoc1hE4Ki+NpIh5v9gwcAXzBJYL1e34L1SgWabe0tX4vlCi/byt7zHozb9do9Blu8x0cXKFWrmY26cnM0fmzW8hyE0WgGMrmzt3TdvoiIAiX+Ug82lJb29Ve0N3/8vHFle7dNTQuRmg52VAM13WQ5RNOysdUx9vZ3dsrV0jv8VnrvqG31gaqap1i7ezipfN/CsagEboKADOXvyr98EPbwIyMCaBplNbuuywU+rwCW7ViUWo91rb1AKtWG5fd53REp1N3kOCzON7OEbTugtDpdMSz6/oCVZufqT1aC+bhMP8YTAAAAAElFTkSuQmCC"

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJnSURBVHjapZBNSFRRGIafc++Zq82MOlSSP8HoWC6GEn+wxFokraxt0MJFUAhtWhSt27WRIGrhsgiKFhIYBC0ibGEophFFQ/6ESjpWJv5gOXPPved05yoDRougl/PCOd93npfzHf5Z9+hNP0nP9Qz35NID6TnucxnA3nEn0ADU/dXXudJ+rP1md7I70d/WL7MsJHJO/ky2M/tdFOBcLvfCljIqEIRLhDtAYIyhceAwbrlLSsd5dTZDz8s0k2wyMfllQQKODOClNYWnDUBRUcdibzzC4o9Fts5vFeuPTme24zOiUrK95VfeZ31jE/vrBFgSJ9mBQKK1TU1dDfKBoAV4c8HQ+1Tw1gAVrFghLkB5mulMhlRtjPr6WqamZvF8g68NF6suYeIWWZtQ74EPxoJ5Hu8ECFThspNAKcNmHkrLEkGAxnV9rqavcbv5DqXJFLHBGMsVKW413YUbPBPAKa310LvZDZZXN4nMDLKWM5Q1neNgZYyqcit4zSci0kZYNnnXI5msJx4toSwe7ZJA+NPjz4domx/nQMQHx2F2/iGZoyfZ33WEZH0j0jJ4ysUJetpoLEGoYkBq4SMlK99YXV1FRvdQXVONWc/i+2lmZqZRARyREjsgpROhIXUIgHAEpbwh5XlhUGht0MYQ1FEaLKGxAOWD6/lhryIeZV8iXhwhmHMqANR2QNFhE00YGp7zhRQEba1Nf4yQShVBbUJg93m7FgRolF/8AyzADfRTa4NyVb61pbnv9fDwmC6AWhc9OjIydqLzeJ8t/HyJhAIDuAKwgQ4gAhjgM1ANxNitArAENAACUMAo/6vfESlDN0Fo1D0AAAAASUVORK5CYII="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIMSURBVDiNpZOxa5NhEMZ/936pxUTFGCiFFKFBcBRcBKeCq6BmMrgW9F/oH+DQLauCdJJOighSxckOFV3aYAf9VIzVoYWK1q/pl+/Le+85pEnTbtKD47h77x6ee15OzIzjmABXgcn9PADuSM/R2mi+BVBXVfPeh0aj8TCEYANfX1//tLCw8CLPc+t2u5amqTWbzWdxHG8kSWKVSuUOQL3X69nq6moLuNFqtT6oqoUQbH5+/vHU1NRslmWp996yLPO1Wu3u3NzcozRNDwDyPLckSXYWFxdfJUnyx3tv3ntrt9tfl5aW3oyyWl5efh/HcZznuZXL5YYA9SzLngCICL+SHi4SzpXGEBEG9aMxhEC5XL7tAEIImBk7qfLg9U+az9t0Uo+ZYWbD99EoIogIhQGAiNDt9uhkHlVD6Td66/F24yXOCV49TiJmajcBUNX+d6gqqsrZYoQT4UTBURwTzAwxYSffppMnTJbOM3GqSvv3R3qao6p2iMFebghGMEhST2ncYRjjcpLS2Bm2OhuMF4rE22tMlKoAByu8+9Jh5XNCmgd6atx/+o3rlytcmnZs7v6genqamen6cPd95n0GzjnWvu+ReUMAw9jtBlbiv1y5UOXWxXtEEqGqQwARQVX7DKIoYvba5FDlvtKGc/2mSAoIckj9AYshQNG54fCoD0BHh0YY6NFj+l/blOOe8z+ZtmzGca0jawAAAABJRU5ErkJggg=="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAMxSURBVDiNtZW9bxxVFMV/9816N44MxmBkUxC5QInoEAEhEVHwDwAKhaEGSoMRgsIFNEhUqyArpsEIKhSLIsIUpvAiFw4BZJEPy87G2FtZG4iR11+7M/Nm3rsU9gwbe0FJ4Sdd6c6ZN+eeOfe+GVFVjmOZY2EFBDgHDLRhFih22KtA8h/3EqBwwAfwJ8BwkiRJmqYujmMLfGCttd579d6rc07TNNX5+fmFsbGxr621GsexRlGkYRhqq9XS0dHRL+fm5q7t7e1po9GwwHkDICIFwCwtLS0DyxMTE5cz70UEYwyVSuVmuVz+rlqtLhljyMJauz09PX11ZGTkqyRJ9oIgAA48VlVUlZmZmRvAzUqlstiOO+eS8fHxn+I4Xl5dXa0HQUAWKysrtVqtdmNxcXExDMM9Y0w+DcPWWrXWar1eXy+Xy99Wq9XbaZpqFs45XVhY+H1ycvJys9nczmzy3qu1Npqamvpxdnb2irVWwzCMgfMCDMdxfEkk833/9R8kz7urSpqmcalUerOQgdXNJdp9vV+yw/hTvWfgYETw3uO953Tf0/kmBcx9FsiuVxq3cnE5sarivWezqXz/212aNuX1FwY51X9i/2EE62KKQQlBiNOQUqH7SJEjxBn59doOdxoxUeK4Um3w5LlBRARV5eKvHxGlLXq6HiZ2EYry/oufUwxKnYmzscoKJE5BBH+AiQgiwtvPfsLfrTs88dAQJwonaUQb7Mab9HUPYMRkPNrRioFHinhVROGxnq68qIjwzfXPaNkd+k4+zvr2GoM9p2jaXQT48KUv8r0drejtBlVw6unvCfDe5w1665mPAQhMga6gmOOZVW2KtdDe1f3mebyC87Cxa3MrVJULv7yHiPDq6Xc40382xw+T54qNMexEnh/WtlleD/dtUZi5tsVKPeK15x9loLfIu89dQEToCor3eJ+RZ+IANRnx1T92uVUPcbr/7TOAGFj9K+LSzxt47ymYLgIpHGn24fwexVstTyw1UvGkRnEoqVdSUdZ2Dbe3GkcORaayPffe/+uxMYZPX3k5r9bWiI7Y/5FbayVTvD40NPQGD7Cccx3xIMin6K4c18/0H+kPUaU8APiuAAAAAElFTkSuQmCC"

/***/ },

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

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

/***/ }

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