(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__(508);
	__webpack_require__(509);
	__webpack_require__(523);
	__webpack_require__(515);
	__webpack_require__(522);
	__webpack_require__(519);
	__webpack_require__(517);
	__webpack_require__(513);
	__webpack_require__(510);
	__webpack_require__(511);
	__webpack_require__(518);
	__webpack_require__(516);
	__webpack_require__(512);
	__webpack_require__(514);
	__webpack_require__(521);
	__webpack_require__(520);
	__webpack_require__(680);


/***/ },

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


/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJBSURBVDiNfZNNSFRhFIaf715/CmsWVkxFaoz2R00RRGFBCGULQQokWrQJ2rSPoqIobRcSMUolmOKmRdHCDIl+Fm2kjKzGyBA1KLzNOI5/M+Md78w3p4UzNTNpB97ded/zvuc7nxIRlFIlgIflqsRdzIFzp1BFZej5H3zsfMys9VVEYgXpFo+I+JfifrGinL7zhrrqKva7oT8Ivf2HLvhfPTkDdCEiAF4RkV+BgAQnQjIZDsvU9LRYE2FxnWyTnsGQzC840tLaKlMzc3LrYZ8Y9S1Rjt5bYWRPM00T0zQwlEIpha97AJdnCzWVLpIJh8lQCCswTsPBTWzYvqMEc/ZyjoBhGIswTQyl8H8PUutdD2gi0Rg+n4+G4yc4UnOYWq8btLO3IN+BUgrDMFDAxnWr6Plk0VxfxnwsRntnB6Wla6is2sa+234o1ONLO1AK0zQ5X7eLmfg0d1+PoQXKyysodlfQ9S7IRCSc4POj5hwHmewZIc/mMi7ufM/Ntz/xPY9ybGspL0dGmV1dDH0d7VhDYzkOVMZBFq6dbeBp7Ur2rJ3igzVKtfGNZ3UuGHxxX0REpQ/JKyJ+27b/7iDtJoN035+oSqndIjKYEyGflA+tNVqnsJ1ECtAASwrkiwHYtk0gEKCgqJC2B529wBBAziXG43FxHEcSiYQkk0nRWksqlRLHcWR4eFgcZ0GuNjUNAEpEFrnZAhlyvsBcJCIjY6NypbExh/yPwHIVDM/oS9dvdOeTRYTMK/z/Oy8ubEjS07LrN1fPaGr+EJOSAAAAAElFTkSuQmCC"

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH2AEDFCQGHsj9gwAAA8NJREFUOMudlUtMXFUYx3/nzL1wYWB4DLR0TA0DGA2hGwEfYFzppqkxaahBXbsyuhCjsaZpXNbwUBLS7jSNphrfUYJdaGm1FuUlTIsob4LlNcwwMzCPy9w5LmDozDCtxi/5cs49Ofmd//3f+51PcCc0wMZ/Cc2QPHHaTU5+FUrF8M96GDq/CcT3EpHc29bW9nxLS8vLKrkoRPq4F32D85zrW3Q119dW2nfWhKPMxdCMzwzenr15TJvu+v7zDz5KqgSgpqam1F1V1ayUQkqJECI9gcvDC1wYMul47SRP1x3CkBYKyUpoJ6e7b/Lhj7+zv0XT65f5pX1dpr6hFBIps6cvGObVD0d56dkGTjW6OFJoY21xlrBvmUoHtB1/kIaG2lrsh98FZBpYSLGvVqakAC71/4Ve7OS5RheGTREORxgc/I2p6SlCoSBHCgSnmiqxFRa3cqz1Pi1NsZRkWiGFIG5ZDEx5eeB+F4cKbESiUfybfsbGxpiZncEz7iEcDlP5+AnyixxGqOjoo/vgTE+lEIi9AxKmyXYCjFwNVIJYLEYgEKD/6lUikQhGbi6mafLKQ49hyzNAE0XpioVA7Y1Cyt1RCGw2Gy5nLsO+MN5QDLuwUErR1f0+JcUlVByuoNDh4CuPn/BPo4rA3O10j1OUJqFCSnRd56kaO/Ob23w2tIyVgAJ7Aa4KF+Vl5eTl5+Pdtrh4YxHTDMwz9uWklglOtSXptU3XebKukqabw3QP/I1lxjhR58RZmIPUc5hcidD5wxzXV4Jx/ui7QMJazQpO9TeZLpeLM81LvP3zMufGNS6Nr1FZqBNLCP7cstjOkThufdHru/HJp0DkIDj146Wkrus80thAp+Hhm189XPPrLAQ1NAmN+SbPHM3F480b6IElQN3TimQm1wzDoL6+nurqal5YWWFzcxNN0ygvL6eiooKL24EtwEoraVLuhVRg5oGaplFWVobT6cSydv+O/f1CqNQb7Q4gA5oNDqCUIh6PE4vFiEajWJaFTdPxB4JmVjB7Hmfak3qQUgrTNAkGg6yuruH3+zEMg+XV1R+7Otq/3q+JA4oz1GUqtiyLUCjEzMwsoHBXuQmHtwbfOXvmxQ2vdz0rOBsoNZRS7Ozs4PP52PBt4K5yMz83e6u9s+Pk6OjvK2lVnIV4V3gSHAyGKC0pZWRkeKTnfM/x3m97lw40mQPcf+lKSimQEu/G+rX3urpar1zpX87avZKTqampjYmJievZlCafE0oRjkSZnl+YPnv6zTcWFxbX7mrl/2qmu0UQv9eGfwCQ44K8JiwxUwAAAABJRU5ErkJggg=="

/***/ },

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

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

/***/ },

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

	/**
	 * Tine 2.0
	 * 
	 * @package     Timetracker
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2007-2015 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.ns('Tine.Timetracker');
	
	/**
	 * handles minutes to time conversions
	 * @class Tine.Timetracker.DurationSpinner
	 * @extends Ext.ux.form.Spinner
	 */
	Tine.Timetracker.DurationSpinner = Ext.extend(Ext.ux.form.Spinner,  {
	    
	    /**
	     * Set to empty value if value equals 0
	     * @cfg emptyOnZero
	     */
	    emptyOnZero: null,
	    
	    initComponent: function() {
	        this.preventMark = false;
	        this.strategy = new Ext.ux.form.Spinner.TimeStrategy({
	            incrementValue : 15
	        });
	        this.format = this.strategy.format;
	
	        this.on('focus', function(field) {field.focus(true, 10)});
	    },
	
	    setValue: function(value) {
	        if(! value || value == '00:00') {
	            value = this.emptyOnZero ? '' : '00:00';
	        } else if(! value.toString().match(/:/)) {
	            var hours = Math.floor(value / 60),
	                minutes = value - hours * 60;
	
	            if (hours < 10) {
	               hours = '0' + hours;
	            }
	
	            if (minutes < 10) {
	                minutes = '0' + minutes;
	            }
	
	            if (minutes !== 0) {
	                value = hours + ':' + minutes;
	            } else {
	                value = hours + ':00';
	            }
	        }
	        
	        Tine.Timetracker.DurationSpinner.superclass.setValue.call(this, value);
	    },
	    
	    validateValue: function(value) {
	        if (value.search(/:/) != -1) {
	            var parts = value.split(':'),
	                hours = parseInt(parts[0]),
	                minutes = parseInt(parts[1]);
	
	            return 'NaN' != hours && 'NaN' != minutes;
	        }
	    },
	
	    getValue: function() {
	        var value = Tine.Timetracker.DurationSpinner.superclass.getValue.call(this);
	        value = value.replace(',', '.');
	
	        if(value && typeof value == 'string') {
	            if (value.search(/:/) != -1) {
	                var parts = value.split(':'),
	                    hours = parseInt(parts[0]),
	                    minutes = parseInt(parts[1]);
	
	                if (0 > hours) {
	                    hours = 0;
	                }
	
	                if (0 > minutes) {
	                    minutes = 0;
	                }
	
	                if (minutes > 0) {
	                    value = hours * 60 + minutes;
	                } else {
	                    value = hours * 60;
	                }
	            } else if (value > 0) {
	                    value = value * 60;
	            } else {
	                this.markInvalid(i18n._('Not a valid time'));
	                return;
	            }
	        }
	
	        this.setValue(value);
	        return value;
	    }
	});
	
	Ext.reg('tinedurationspinner', Tine.Timetracker.DurationSpinner);


/***/ },

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

	/**
	 * Tine 2.0
	 * 
	 * @package     Timetracker
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2007-2016 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	
	Ext.ns('Tine.Timetracker.Model');
	
	/**
	 * Model of a grant
	 */
	Tine.Timetracker.Model.TimeaccountGrant = Ext.data.Record.create([
	    {name: 'id'},
	    {name: 'account_id'},
	    {name: 'account_type'},
	    {name: 'account_name'},
	    {name: 'bookOwnGrant',        type: 'boolean'},
	    {name: 'viewAllGrant',        type: 'boolean'},
	    {name: 'bookAllGrant',        type: 'boolean'},
	    {name: 'manageBillableGrant', type: 'boolean'},
	    {name: 'exportGrant',         type: 'boolean'},
	    {name: 'adminGrant',          type: 'boolean'}
	]);


/***/ },

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

	/**
	 * Tine 2.0
	 * 
	 * @package     Timetracker
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	 
	Ext.ns('Tine.Timetracker');
	
	Tine.Timetracker.TimeAccountBilledFilterModel = Ext.extend(Tine.widgets.grid.FilterModel, {
	    field: 'timeaccount_status',
	    valueType: 'string',
	    defaultValue: 'to bill',
	    
	    /**
	     * @private
	     */
	    initComponent: function() {
	        Tine.Timetracker.TimeAccountBilledFilterModel.superclass.initComponent.call(this);
	        
	        this.app = Tine.Tinebase.appMgr.get('Timetracker');
	        this.label = this.label ? this.label : this.app.i18n._("Time Account - Billed");
	        this.operators = ['equals'];
	    },
	   
	    /**
	     * value renderer
	     * 
	     * @param {Ext.data.Record} filter line
	     * @param {Ext.Element} element to render to 
	     */
	    valueRenderer: function(filter, el) {
	        var value = new Ext.form.ComboBox({
	            filter: filter,
	            width: this.filterValueWidth,
	            id: 'tw-ftb-frow-valuefield-' + filter.id,
	            value: filter.data.value ? filter.data.value : this.defaultValue,
	            renderTo: el,
	            mode: 'local',
	            forceSelection: true,
	            blurOnSelect: true,
	            triggerAction: 'all',
	            store: [
	                ['not yet billed', this.app.i18n._('not yet billed')], 
	                ['to bill', this.app.i18n._('to bill')],
	                ['billed', this.app.i18n._('billed')]
	            ]
	        });
	        value.on('specialkey', function(field, e){
	             if(e.getKey() == e.ENTER){
	                 this.onFiltertrigger();
	             }
	        }, this);
	        
	        return value;
	    }
	});
	Tine.widgets.grid.FilterToolbar.FILTERS['timetracker.timeaccountbilled'] = Tine.Timetracker.TimeAccountBilledFilterModel;


/***/ },

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

	/**
	 * Tine 2.0
	 * 
	 * @package     Timetracker
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Alexander Stintzing <a.stintzing@metaways.de>
	 * @copyright   Copyright (c) 2012 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	 
	Ext.ns('Tine.Timetracker');
	
	/**
	 * @namespace   Tine.Timetracker
	 * @class       Tine.Timetracker.TimeaccountContractFilterModel
	 * @extends     Tine.widgets.grid.ForeignRecordFilter
	 * 
	 * @author      Alexander Stintzing <a.stintzing@metaways.de>
	 */
	Tine.Timetracker.TimeaccountContractFilterModel = Ext.extend(Tine.widgets.grid.ForeignRecordFilter, {
	    
	    // private
	    field: 'contract',
	    valueType: 'relation',
	    
	    /**
	     * @private
	     */
	    initComponent: function() {
	        this.app = Tine.Tinebase.appMgr.get('Timetracker');
	        this.label = this.app.i18n._('Contract');
	        this.foreignRecordClass = 'Sales.Contract',
	        this.pickerConfig = {emptyText: this.app.i18n._('without contract'), allowBlank: true};
	
	        Tine.Timetracker.TimeaccountContractFilterModel.superclass.initComponent.call(this);
	    }
	});
	
	Tine.widgets.grid.FilterToolbar.FILTERS['timetracker.timeaccountcontract'] = Tine.Timetracker.TimeaccountContractFilterModel;

/***/ },

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

	/**
	 * Tine 2.0
	 * 
	 * @package     Timetracker
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2007-2016 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	 
	Ext.ns('Tine.Timetracker');
	
	Tine.Timetracker.TimeAccountFilterModel = Ext.extend(Tine.widgets.grid.ForeignRecordFilter, {
	    
	    /**
	     * @cfg {Record} foreignRecordClass needed for explicit defined filters
	     */
	    foreignRecordClass : 'Timetracker.Timeaccount',
	    
	    /**
	     * @cfg {String} linkType {relation|foreignId} needed for explicit defined filters
	     */
	    linkType: 'foreignId',
	    
	    /**
	     * @cfg {String} filterName server side filterGroup Name, needed for explicit defined filters
	     */
	    filterName: 'TimeaccountFilter',
	    
	    /**
	     * @cfg {String} ownField for explicit filterRow
	     */
	    ownField: 'timeaccount_id',
	    
	    /**
	     * @private
	     */
	    initComponent: function() {
	        this.app = Tine.Tinebase.appMgr.get('Timetracker');
	        this.label = this.app.i18n.n_('Timeaccount', 'Timeaccounts', 1);
	        
	        this.pickerConfig = this.pickerConfig || {};
	        
	        Tine.Timetracker.TimeAccountFilterModel.superclass.initComponent.call(this);
	    }
	});
	
	Tine.widgets.grid.FilterToolbar.FILTERS['timetracker.timeaccount'] = Tine.Timetracker.TimeAccountFilterModel;

/***/ },

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

	/**
	 * Tine 2.0
	 * 
	 * @package     Timetracker
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	 
	Ext.ns('Tine.Timetracker');
	
	Tine.Timetracker.TimeAccountStatusFilterModel = Ext.extend(Tine.widgets.grid.FilterModel, {
	    field: 'is_open',
	    valueType: 'bool',
	    defaultValue: 1,
	    
	    /**
	     * @private
	     */
	    initComponent: function() {
	        Tine.Timetracker.TimeAccountStatusFilterModel.superclass.initComponent.call(this);
	        
	        this.app = Tine.Tinebase.appMgr.get('Timetracker');
	        this.label = this.label ? this.label : this.app.i18n._("Time Account - Status");
	        this.operators = ['equals'];
	    },
	   
	    /**
	     * value renderer
	     * 
	     * @param {Ext.data.Record} filter line
	     * @param {Ext.Element} element to render to 
	     */
	    valueRenderer: function(filter, el) {
	        // value
	        var value = new Ext.form.ComboBox({
	            filter: filter,
	            width: this.filterValueWidth,
	            id: 'tw-ftb-frow-valuefield-' + filter.id,
	            value: filter.data.value ? filter.data.value : this.defaultValue,
	            renderTo: el,
	            mode: 'local',
	            forceSelection: true,
	            blurOnSelect: true,
	            triggerAction: 'all',
	            store: [[0, this.app.i18n._('closed')], [1, this.app.i18n._('open')]]
	        });
	        value.on('specialkey', function(field, e){
	             if(e.getKey() == e.ENTER){
	                 this.onFiltertrigger();
	             }
	        }, this);
	        
	        return value;
	    }
	});
	Tine.widgets.grid.FilterToolbar.FILTERS['timetracker.timeaccountstatus'] = Tine.Timetracker.TimeAccountStatusFilterModel;


/***/ },

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

	/**
	 * Tine 2.0
	 * 
	 * @package     Timetracker
	 * @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.namespace('Tine.Timetracker');
	
	Tine.Timetracker.TimeaccountEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog, {
	    
	    /**
	     * @private
	     */
	    windowNamePrefix: 'TimeaccountEditWindow_',
	    appName: 'Timetracker',
	    recordClass: Tine.Timetracker.Model.Timeaccount,
	    recordProxy: Tine.Timetracker.timeaccountBackend,
	    useInvoice: false,
	    displayNotes: true,
	
	    windowWidth: 800,
	    windowHeight: 500,
	
	    /**
	     * don't eval grants as TAs have very special grants and we only show the dialog to users with MANAGE right
	     */
	    evalGrants: false,
	    
	    /**
	     * overwrite update toolbars function (we don't have record grants yet)
	     */
	    updateToolbars: function() {
	    },
	    
	    initComponent: function() {
	        var salesApp = Tine.Tinebase.appMgr.get('Sales');
	        this.useInvoice = salesApp
	            && salesApp.featureEnabled('invoicesModule')
	            && Tine.Tinebase.common.hasRight('manage', 'Sales', 'invoices')
	            && Tine.Sales.Model.Invoice;
	        Tine.Timetracker.TimeaccountEditDialog.superclass.initComponent.call(this);
	    },
	
	    isMultipleValid: function() {
	        return true;
	    },
	
	    /**
	     * containerProperty (all contracts in one container) exists, so overwrite creating selector here
	     */
	    initContainerSelector: Ext.emptyFn,
	    
	    onRecordLoad: function() {
	        // make sure grants grid is initialized
	        this.getGrantsGrid();
	        
	        var grants = this.record.get('grants') || [];
	        this.grantsStore.loadData({results: grants});
	        Tine.Timetracker.TimeaccountEditDialog.superclass.onRecordLoad.call(this);
	        
	        if (! this.copyRecord && ! this.record.id) {
	            this.window.setTitle(this.app.i18n._('Add New Timeaccount'));
	        }
	    },
	    
	    onRecordUpdate: function() {
	        Tine.Timetracker.TimeaccountEditDialog.superclass.onRecordUpdate.call(this);
	        this.record.set('grants', '');
	        
	        var grants = [];
	        this.grantsStore.each(function(_record){
	            grants.push(_record.data);
	        });
	        
	        this.record.set('grants', grants);
	    },
	    
	    /**
	     * returns dialog
	     * 
	     * NOTE: when this method gets called, all initalisation is done.
	     */
	    getFormItems: function() {
	        
	        var secondRow = [{
	            fieldLabel: this.app.i18n._('Unit'),
	            name: 'price_unit'
	        }, {
	            xtype: 'extuxmoneyfield',
	            fieldLabel: this.app.i18n._('Unit Price'),
	            name: 'price',
	            allowNegative: false
	        }, {
	            xtype: 'numberfield',
	            fieldLabel: this.app.i18n._('Budget'),
	            name: 'budget',
	            allowNegative: false,
	            value: 0
	        }, {
	            fieldLabel: this.app.i18n._('Status'),
	            name: 'is_open',
	            xtype: 'combo',
	            mode: 'local',
	            forceSelection: true,
	            triggerAction: 'all',
	            store: [[0, this.app.i18n._('closed')], [1, this.app.i18n._('open')]]
	        }, {
	            fieldLabel: this.app.i18n._('Billed'),
	            name: 'status',
	            xtype: 'combo',
	            mode: 'local',
	            forceSelection: true,
	            triggerAction: 'all',
	            value: 'not yet billed',
	            store: [
	                ['not yet billed', this.app.i18n._('not yet billed')], 
	                ['to bill', this.app.i18n._('to bill')],
	                ['billed', this.app.i18n._('billed')]
	            ],
	            listeners: {
	                scope: this,
	                select: this.onBilledChange.createDelegate(this)
	            }
	        }];
	        
	        secondRow.push({
	            columnWidth: 1/3,
	            disabled: false,
	            fieldLabel: this.app.i18n._('Cleared In'),
	            name: 'billed_in'
	        });
	        
	        secondRow.push({
	            fieldLabel: this.app.i18n._('Booking deadline'),
	            name: 'deadline',
	            xtype: 'combo',
	            mode: 'local',
	            forceSelection: true,
	            triggerAction: 'all',
	            value: 'none',
	            store: [
	                ['none', this.app.i18n._('none')], 
	                ['lastweek', this.app.i18n._('last week')]
	            ]
	        });
	        
	        secondRow.push({
	            xtype: 'extuxclearabledatefield',
	            name: 'cleared_at',
	            fieldLabel: this.app.i18n._('Cleared at')
	        });
	        
	        if (Tine.Tinebase.appMgr.get('Sales')) {
	            secondRow.push({
	                xtype: 'tinerelationpickercombo',
	                fieldLabel: this.app.i18n._('Cost Center'),
	                editDialog: this,
	                allowBlank: true,
	                app: 'Sales',
	                recordClass: Tine.Sales.Model.CostCenter,
	                relationType: 'COST_CENTER',
	                relationDegree: 'sibling',
	                modelUnique: true
	            });
	        }
	        
	        var lastRow = [{
	            columnWidth: 1/3,
	            editDialog: this,
	            xtype: 'tinerelationpickercombo',
	            fieldLabel: this.app.i18n._('Responsible Person'),
	            allowBlank: true,
	            app: 'Addressbook',
	            recordClass: Tine.Addressbook.Model.Contact,
	            relationType: 'RESPONSIBLE',
	            relationDegree: 'sibling',
	            modelUnique: true
	        }, {
	            hideLabel: true,
	            boxLabel: this.app.i18n._('Timesheets are billable'),
	            name: 'is_billable',
	            xtype: 'checkbox',
	            columnWidth: 1/3
	        }];
	        
	        if (this.useInvoice) {
	            lastRow.push(Tine.widgets.form.RecordPickerManager.get('Sales', 'Invoice', {
	                columnWidth: 1/3,
	                disabled: true,
	                fieldLabel: this.app.i18n._('Invoice'),
	                name: 'invoice_id'
	            }));
	        }
	        return {
	            xtype: 'tabpanel',
	            border: false,
	            plain:true,
	            activeTab: 0,
	            plugins: [{
	                ptype : 'ux.tabpanelkeyplugin'
	            }],
	            defaults: {
	                hideMode: 'offsets'
	            },
	            items:[{
	                title: this.app.i18n.ngettext('Time Account', 'Time Accounts', 1),
	                autoScroll: true,
	                border: false,
	                frame: true,
	                layout: 'border',
	                items: [{
	                    region: 'center',
	                    xtype: 'columnform',
	                    labelAlign: 'top',
	                    formDefaults: {
	                        xtype:'textfield',
	                        anchor: '100%',
	                        labelSeparator: '',
	                        columnWidth: .333
	                    },
	                    items: [[{
	                        fieldLabel: this.app.i18n._('Number'),
	                        name: 'number',
	                        allowBlank: false,
	                        maxLength: 127
	                        }, {
	                        columnWidth: .666,
	                        fieldLabel: this.app.i18n._('Title'),
	                        name: 'title',
	                        maxLength: 255,
	                        allowBlank: false
	                        }], [{
	                        columnWidth: 1,
	                        fieldLabel: this.app.i18n._('Description'),
	                        xtype: 'textarea',
	                        name: 'description',
	                        height: 150
	                        }], secondRow, lastRow] 
	                }, {
	                    // activities and tags
	                    layout: 'accordion',
	                    animate: true,
	                    region: 'east',
	                    width: 210,
	                    split: true,
	                    collapsible: true,
	                    collapseMode: 'mini',
	                    header: false,
	                    margins: '0 5 0 5',
	                    border: true,
	                    items: [
	                    new Tine.widgets.tags.TagPanel({
	                        app: 'Timetracker',
	                        border: false,
	                        bodyStyle: 'border:1px solid #B5B8C8;'
	                    })]
	                }]
	            },{
	                title: this.app.i18n._('Access'),
	                layout: 'fit',
	                items: [this.getGrantsGrid()]
	            }, new Tine.widgets.activities.ActivitiesTabPanel({
	                app: this.appName,
	                record_id: (! this.copyRecord) ? this.record.id : null,
	                record_model: this.appName + '_Model_' + this.recordClass.getMeta('modelName')
	            })]
	        };
	    },
	
	    getGrantsGrid: function() {
	        if (! this.grantsGrid) {
	            this.grantsStore =  new Ext.data.JsonStore({
	                root: 'results',
	                totalProperty: 'totalcount',
	                // use account_id here because that simplifies the adding of new records with the search comboboxes
	                id: 'account_id',
	                fields: Tine.Timetracker.Model.TimeaccountGrant
	            });
	            
	            var columns = [
	                new Ext.ux.grid.CheckColumn({
	                    header: this.app.i18n._('Book Own'),
	                    dataIndex: 'bookOwnGrant',
	                    tooltip: i18n._('The grant to add Timesheets to this Timeaccount'),
	                    width: 55
	                }),
	                new Ext.ux.grid.CheckColumn({
	                    header: this.app.i18n._('View All'),
	                    tooltip: i18n._('The grant to view Timesheets of other users'),
	                    dataIndex: 'viewAllGrant',
	                    width: 55
	                }),
	                new Ext.ux.grid.CheckColumn({
	                    header: this.app.i18n._('Book All'),
	                    tooltip: i18n._('The grant to add Timesheets for other users'),
	                    dataIndex: 'bookAllGrant',
	                    width: 55
	                }),
	                new Ext.ux.grid.CheckColumn({
	                    header:this.app.i18n._('Manage Clearing'),
	                    tooltip: i18n._('The grant to manage clearing of Timesheets'),
	                    dataIndex: 'manageBillableGrant',
	                    width: 55
	                }),
	                new Ext.ux.grid.CheckColumn({
	                    header:this.app.i18n._('Export'),
	                    tooltip: i18n._('The grant to export Timesheets of Timeaccount'),
	                    dataIndex: 'exportGrant',
	                    width: 55
	                }),
	                new Ext.ux.grid.CheckColumn({
	                    header: this.app.i18n._('Manage All'),
	                    tooltip: i18n._('Includes all other grants'),
	                    dataIndex: 'adminGrant',
	                    width: 55
	                })
	            ];
	            
	            this.grantsGrid = new Tine.widgets.account.PickerGridPanel({
	                selectType: 'both',
	                title:  this.app.i18n._('Permissions'),
	                store: this.grantsStore,
	                hasAccountPrefix: true,
	                configColumns: columns,
	                selectAnyone: false,
	                selectTypeDefault: 'group',
	                recordClass: Tine.Tinebase.Model.Grant
	            });
	        }
	        return this.grantsGrid;
	    },
	    
	    /**
	     * is called is billed field changes
	     */
	    onBilledChange: function(combo, record, index) {
	        if (combo.getValue() == 'billed') {
	            if (! this.getForm().findField('cleared_at').getValue()) {
	                this.getForm().findField('cleared_at').setValue(new Date());
	            }
	        }
	    },
	    
	    doCopyRecord: function() {
	        Tine.Timetracker.TimeaccountEditDialog.superclass.doCopyRecord.call(this);
	        
	        this.record.set('status', 'not yet billed');
	    }
	});


/***/ },

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

	/**
	 * Tine 2.0
	 *
	 * @package     Timetracker
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Michael Spahn <M.Spahn@bitExpert.de>
	 * @copyright   Copyright (c) 2016 Metaways Infosystems GmbH (http://www.metaways.de)
	 * @copyright   Copyright (c) 2016 bitExpert AG (http://bitexpert.de)
	 *
	 */
	
	Ext.ns('Tine', 'Tine.Timetracker');
	
	/**
	 * @namespace   Tine.Timetracker
	 * @class       Tine.Timetracker.TreePanel
	 * @extends     Tine.Tinebase.Application
	 * Timetracker TreePanel<br>
	 *
	 * @author Michael Spahn <M.Spahn@bitExpert.de>
	 *
	 */
	Tine.Timetracker.TimeaccountFavoritesPanel = function (config) {
	    Ext.apply(this, config);
	    Tine.Timetracker.TimeaccountFavoritesPanel.superclass.constructor.call(this);
	};
	
	Ext.extend(Tine.Timetracker.TimeaccountFavoritesPanel, Ext.tree.TreePanel, {
	    /**
	     * Autoscrolling
	     */
	    autoScroll: true,
	
	    /**
	     * Border
	     */
	    border: false,
	
	    /**
	     * Context menu for leaf
	     */
	    contextMenuLeaf: null,
	
	    /**
	     * Delete fav action
	     */
	    action_delete: null,
	
	    /**
	     * The current node of context menu
	     */
	    ctxNode: null,
	
	    /**
	     * init this treePanel
	     */
	    initComponent: function () {
	        if (!this.app) {
	            this.app = Tine.Tinebase.appMgr.get('Timetracker');
	        }
	
	        var favorites = this.getTimetrackerNodes();
	
	        this.root = {
	            path: '/',
	            cls: 'tinebase-tree-hide-collapsetool',
	            text: this.app.i18n._('Timeaccount Favorites'),
	            iconCls: 'folder',
	            expanded: true,
	            children: favorites
	        };
	
	        this.initContextMenu();
	
	        this.on('dblclick', this.onDoubleClick, this);
	        this.on('contextmenu', this.onContextMenu, this);
	
	        Tine.Timetracker.TimeaccountFavoritesPanel.superclass.initComponent.call(this);
	    },
	
	    /**
	     * Set up context menu
	     */
	    initContextMenu: function () {
	        this.action_delete = new Ext.Action({
	            text: String.format(i18n.ngettext('Delete {0}', 'Delete {0}', 1), this.app.i18n._('Favorite')),
	            iconCls: 'action_delete',
	            handler: this.deleteNode,
	            scope: this,
	            allowMultiple: false
	        });
	
	        this.contextMenuLeaf = new Ext.menu.Menu({
	            items: [
	                this.action_delete
	            ]
	        });
	    },
	
	    /**
	     * Delete selected favorite
	     *
	     * @returns {boolean}
	     */
	    deleteNode: function() {
	        if (!this.ctxNode.attributes && !this.ctxNode.attributes.favId) {
	            return false;
	        }
	
	        Ext.Ajax.request({
	            url: 'index.php',
	            scope: this,
	            params: {
	                method: 'Timetracker.deleteTimeAccountFavorite',
	                favId: this.ctxNode.attributes.favId
	            },
	            success : function(_result, _request) {
	                if (_result.responseText) {
	                    Tine.Timetracker.registry.set('timeaccountFavorites', JSON.parse(_result.responseText).timeaccountFavorites);
	
	                    var rootNode = Ext.getCmp('TimeaccountFavoritesPanel').getRootNode();
	
	                    if (!rootNode.hasChildNodes()) {
	                        rootNode.removeAll();
	                    }
	
	                    rootNode.removeAll();
	                    rootNode.appendChild(Tine.Timetracker.registry.get('timeaccountFavorites'));
	
	                    rootNode.expand();
	                }
	            },
	            failure: function(result) {
	                Tine.Tinebase.ExceptionHandler.handleRequestException(result);
	            }
	        });
	    },
	
	    /**
	     * @param node
	     * @param event
	     * @returns {boolean}
	     */
	    onContextMenu: function (node, event) {
	        if (!node.leaf) {
	            return false;
	        }
	
	        this.ctxNode = node;
	
	        this.contextMenuLeaf.showAt(event.getXY());
	    },
	
	    /**
	     * get core data nodes
	     ** @returns Array
	     */
	    getTimetrackerNodes: function () {
	        if (!Tine.Timetracker.registry.get('timeaccountFavorites')) {
	            return [];
	        }
	
	        return Tine.Timetracker.registry.get('timeaccountFavorites');
	    },
	
	    /**
	     * @param node
	     * @param e
	     * @returns {boolean}
	     */
	    onDoubleClick: function (node, e) {
	        if (!node.leaf) {
	            return false;
	        }
	
	        var record = new Tine.Timetracker.Model.Timesheet(Tine.Timetracker.Model.Timesheet.getDefaultData(), 0);
	        record.set('timeaccount_id', node.attributes.timeaccount);
	
	        var popupWindow = Tine.Timetracker.TimesheetEditDialog.openWindow({
	                plugins: null,
	                record: record,
	                recordId: null
	            }
	        );
	    }
	});


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Timetracker
	 * @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.namespace('Tine.Timetracker');
	
	/**
	 * Timeaccount grid panel
	 * 
	 * @namespace   Tine.Timetracker
	 * @class       Tine.Timetracker.TimeaccountGridPanel
	 * @extends     Tine.widgets.grid.GridPanel
	 * 
	 * <p>Timeaccount Grid Panel</p>
	 * <p><pre>
	 * TODO         copy action needs to copy the acl too
	 * </pre></p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2007-2009 Metaways Infosystems GmbH (http://www.metaways.de)
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Timetracker.TimeaccountGridPanel
	 */
	Tine.Timetracker.TimeaccountGridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
	    defaultSortInfo: {field: 'creation_time', direction: 'DESC'},
	    gridConfig: {
	        autoExpandColumn: 'title'
	    },
	    copyEditAction: true,
	    defaultFilters: [{
	        field: 'query',
	        operator: 'contains',
	        value: ''
	    }, {
	        field: 'is_open',
	        operator: 'equals',
	        value: true
	    }],
	    action_bookmark: null,
	
	    initComponent: function() {
	        Tine.Timetracker.TimeaccountGridPanel.superclass.initComponent.call(this);
	
	        this.action_addInNewWindow.setDisabled(! Tine.Tinebase.common.hasRight('manage', 'Timetracker', 'timeaccounts'));
	        this.action_editInNewWindow.requiredGrant = 'editGrant';
	    },
	
	    /**
	     * @private
	     */
	    initActions: function() {
	        Tine.Timetracker.TimesheetGridPanel.superclass.initActions.call(this);
	
	        this.action_bookmark = new Ext.Action({
	            text: i18n._('Bookmark Timeaccount'),
	            iconCls: 'action_add',
	            requiredGrant: 'readGrant',
	            scope: this,
	            disabled: true,
	            allowMultiple: false,
	            visible: false,
	            handler: this.addBookmark
	        });
	
	        // register actions in updater
	        this.actionUpdater.addActions([
	            this.action_bookmark
	        ]);
	    },
	
	    addBookmark: function () {
	        var grid = this,
	            app = this.app,
	            selectionModel = grid.selectionModel;
	
	        Ext.each(selectionModel.getSelections(), function (record) {
	            Ext.Ajax.request({
	                url: 'index.php',
	                scope: this,
	                params: {
	                    method: 'Timetracker.addTimeAccountFavorite',
	                    timeaccountId: record.get('id')
	                },
	                success : function(_result, _request) {
	                    if (_result.responseText) {
	                        Tine.Timetracker.registry.set('timeaccountFavorites', JSON.parse(_result.responseText).timeaccountFavorites);
	
	                        var rootNode = Ext.getCmp('TimeaccountFavoritesPanel').getRootNode();
	
	                        if (!rootNode.hasChildNodes()) {
	                            rootNode.removeAll();
	                        }
	
	                        rootNode.removeAll();
	                        rootNode.appendChild(Tine.Timetracker.registry.get('timeaccountFavorites'));
	
	                        rootNode.expand();
	                    }
	                },
	                failure: function(result) {
	                    Tine.Tinebase.ExceptionHandler.handleRequestException(result);
	                }
	            });
	        });
	    },
	
	    /**
	     * add custom items to context menu
	     *
	     * @return {Array}
	     */
	    getContextMenuItems: function() {
	        var items = [
	            '-', {
	                text: Tine.Tinebase.appMgr.get('Timetracker').i18n._('Close Timeaccount'),
	                iconCls: 'action_close',
	                scope: this,
	                disabled: !Tine.Tinebase.common.hasRight('manage', 'Timetracker', 'timeaccounts'),
	                itemId: 'closeAccount',
	                handler: this.onCloseTimeaccount.createDelegate(this)
	            }
	        ];
	
	        if (this.app.featureEnabled('featureTimeaccountBookmark')) {
	            items.push(this.action_bookmark);
	        }
	
	        return items;
	    },
	
	    /**
	     * Closes selected timeaccount
	     */
	    onCloseTimeaccount: function () {
	        var grid = this,
	            recordProxy = this.recordProxy,
	            selectionModel = grid.selectionModel;
	
	        Ext.each(selectionModel.getSelections(), function (record) {
	            recordProxy.loadRecord(record, {
	                success: function (record) {
	                    record.set('is_open', false);
	                    recordProxy.saveRecord(record, {
	                        success: function () {
	                            grid.store.reload();
	                            grid.store.remove(record);
	                        }
	                    });
	                }
	            });
	        });
	    }
	});


/***/ },

/***/ 517:
/***/ 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) 2012 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	
	Ext.ns('Tine.Timetracker');
	
	/**
	 * @namespace   Tine.Timetracker
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @class       Tine.Timetracker.TimeaccountPickerCombo
	 * @extends     Tine.Tinebase.widgets.form.RecordPickerComboBox
	 * 
	 * adds show closed handling
	 */
	
	Tine.Timetracker.TimeaccountPickerCombo = Ext.extend(Tine.Tinebase.widgets.form.RecordPickerComboBox, {
	    /**
	     * @cfg {Bool} showClosed
	     */
	    showClosed: false,
	    
	    /**
	     * @property showClosedBtn
	     * @type Ext.Button
	     */
	    showClosedBtn: null,
	    
	    sortBy: 'number',
	    
	    initComponent: function() {
	        this.recordProxy = Tine.Timetracker.timeaccountBackend;
	        this.recordClass = Tine.Timetracker.Model.Timeaccount;
	        
	        Tine.Timetracker.TimeaccountPickerCombo.superclass.initComponent.apply(this, arguments);
	    },
	    
	    initList: function() {
	        Tine.Timetracker.TimeaccountPickerCombo.superclass.initList.apply(this, arguments);
	        
	        if (this.pageTb && ! this.showClosedBtn) {
	            this.showClosedBtn = new Tine.widgets.grid.FilterButton({
	                text: this.app.i18n._('Show closed'),
	                iconCls: 'action_showArchived',
	                field: 'is_open',
	                invert: true,
	                pressed: this.showClosed,
	                scope: this,
	                handler: function() {
	                    this.showClosed = this.showClosedBtn.pressed;
	                    this.store.load();
	                }
	                
	            });
	            
	            this.pageTb.add('-', this.showClosedBtn);
	            this.pageTb.doLayout();
	        }
	    },
	    
	    /**
	     * apply showClosed value
	     */
	    onStoreBeforeLoadRecords: function(o, options, success, store) {
	        if (Tine.Timetracker.TimeaccountPickerCombo.superclass.onStoreBeforeLoadRecords.apply(this, arguments) !== false) {
	            if (this.showClosedBtn) {
	                this.showClosedBtn.setValue(options.params.filter);
	            }
	        }
	    },
	    
	    /**
	     * append showClosed value
	     */
	    onBeforeLoad: function (store, options) {
	        Tine.Timetracker.TimeaccountPickerCombo.superclass.onBeforeLoad.apply(this, arguments);
	
	        if (this.showClosedBtn) {
	            Ext.each(store.baseParams.filter, function(filter, idx) {
	                if (filter.field == 'is_open'){
	                    store.baseParams.filter.remove(filter);
	                }
	            }, this);
	            
	            if (this.showClosedBtn.getValue().value === true) {
	                store.baseParams.filter.push(this.showClosedBtn.getValue());
	            }
	        }
	    }
	});
	
	Tine.widgets.form.RecordPickerManager.register('Timetracker', 'Timeaccount', Tine.Timetracker.TimeaccountPickerCombo);

/***/ },

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

	/**
	 * Tine 2.0
	 *
	 * @package     Timetracker
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Alexander Stintzing <a.stintzing@metaways.de>
	 * @copyright   Copyright (c) 2014 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	
	Ext.ns('Tine.Timetracker');
	
	/**
	 * @namespace   Tine.Timetracker
	 * @class       Tine.Timetracker.TimeaccountResponsibleFilterModel
	 * @extends     Tine.widgets.grid.ForeignRecordFilter
	 *
	 * @author      Alexander Stintzing <a.stintzing@metaways.de>
	 */
	Tine.Timetracker.TimeaccountResponsibleFilterModel = Ext.extend(Tine.widgets.grid.ForeignRecordFilter, {
	
	    // private
	    field: 'responsible',
	    valueType: 'relation',
	
	    /**
	     * @private
	     */
	    initComponent: function() {
	        this.app = Tine.Tinebase.appMgr.get('Timetracker');
	        this.label = this.app.i18n._('Responsible');
	        this.foreignRecordClass = 'Addressbook.Contact',
	            this.pickerConfig = {emptyText: this.app.i18n._('without responsible'), allowBlank: true};
	
	        Tine.Timetracker.TimeaccountResponsibleFilterModel.superclass.initComponent.call(this);
	    }
	});
	
	Tine.widgets.grid.FilterToolbar.FILTERS['timetracker.timeaccountresponsible'] = Tine.Timetracker.TimeaccountResponsibleFilterModel;

/***/ },

/***/ 519:
/***/ 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) 216 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	
	Ext.ns('Tine.Timetracker');
	
	/**
	 * CoreData west panel
	 *
	 * @namespace   Tine.Timetracker
	 * @class       Tine.Timetracker.TimeaccountWestPanel
	 * @extends     Tine.widgets.mainscreen.TimeaccountWestPanel
	 *
	 * @author      Michael Spahn <M.Spahn@bitExpert.de>
	 *
	 * @constructor
	 * @xtype       tine.timetracker.TimeaccountWestPanel
	 */
	Tine.Timetracker.TimeaccountWestPanel = Ext.extend(Tine.widgets.mainscreen.WestPanel, {
	    hasContainerTreePanel: false,
	
	    getAdditionalItems: function () {
	        var items = [];
	
	        // if (this.app.featureEnabled('featureTimeaccountBookmark')) {
	        //     items.push(new Tine.Timetracker.TimeaccountFavoritesPanel({
	        //         height: 'auto',
	        //         id: 'TimeaccountFavoritesPanel'
	        //     }));
	        // }
	
	        return items;
	    }
	});


/***/ },

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

	/**
	 * Tine 2.0
	 * 
	 * @package     Timetracker
	 * @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.namespace('Tine.Timetracker');
	
	/**
	 * Timetracker Edit Dialog
	 */
	Tine.Timetracker.TimesheetEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog, {
	
	    /**
	     * @private
	     */
	    windowNamePrefix: 'TimesheetEditWindow_',
	    appName: 'Timetracker',
	    recordClass: Tine.Timetracker.Model.Timesheet,
	    recordProxy: Tine.Timetracker.timesheetBackend,
	    tbarItems: null,
	    evalGrants: false,
	    useInvoice: false,
	    displayNotes: true,
	    context: { 'skipClosedCheck': false },
	
	    windowWidth: 800,
	    windowHeight: 500,
	
	    
	    /**
	     * overwrite update toolbars function (we don't have record grants yet)
	     */
	    updateToolbars: function(record) {
	        this.onTimeaccountUpdate();
	        Tine.Timetracker.TimesheetEditDialog.superclass.updateToolbars.call(this, record, 'timeaccount_id');
	    },
	
	    onRecordLoad: function() {
	        // interrupt process flow until dialog is rendered
	        if (! this.rendered) {
	            this.onRecordLoad.defer(250, this);
	            return;
	        }
	
	        if (! this.record.id) {
	            // @todo: this should be handled by default values
	            this.record.set('account_id', Tine.Tinebase.registry.get('currentAccount'));
	            this.record.set('start_date', new Date());
	        }
	
	        Tine.Timetracker.TimesheetEditDialog.superclass.onRecordLoad.call(this);
	
	        // TODO get timeaccount from filter if set
	        var timeaccount = this.record.get('timeaccount_id');
	        if (timeaccount) {
	            this.onTimeaccountUpdate(null, new Tine.Timetracker.Model.Timeaccount(timeaccount));
	        }
	    },
	
	    /**
	     * this gets called when initializing and if a new timeaccount is chosen
	     * 
	     * @param {} field
	     * @param {} timeaccount
	     */
	    onTimeaccountUpdate: function(field, timeaccount) {
	        // check for manage_timeaccounts right
	        var manageRight = Tine.Tinebase.common.hasRight('manage', 'Timetracker', 'timeaccounts');
	        
	        var notBillable = false;
	        var notClearable = false;
	
	        // TODO timeaccount.get('account_grants') contains [Object object] -> why is that so? this should be fixed
	        var grants = this.record.get('timeaccount_id')
	            ? this.record.get('timeaccount_id').account_grants
	            : (timeaccount && timeaccount.get('container_id') && timeaccount.get('container_id').account_grants
	                ? timeaccount.get('container_id').account_grants
	                :  {});
	        
	        if (grants) {
	            var setDisabled = ! (grants.bookAllGrant || grants.adminGrant || manageRight);
	            var accountField = this.getForm().findField('account_id');
	            accountField.setDisabled(setDisabled);
	            // set account id to the current user, if he doesn't have the right to edit other users timesheets
	            if (setDisabled) {
	                if (this.copyRecord && (this.record.get('account_id') != Tine.Tinebase.registry.get('currentAccount').accountId)) {
	                    accountField.setValue(Tine.Tinebase.registry.get('currentAccount'));
	                }
	            }
	            notBillable = ! (grants.manageBillableGrant || grants.adminGrant || manageRight);
	            notClearable = ! (grants.adminGrant || manageRight);
	            this.getForm().findField('billed_in').setDisabled(! (grants.adminGrant || manageRight));
	        }
	
	        if (timeaccount && timeaccount.data) {
	            notBillable = notBillable || timeaccount.data.is_billable == "0" || timeaccount.get('is_billable') == "0";
	            
	            // clearable depends on timeaccount is_billable as well (changed by ps / 2009-09-01, behaviour was inconsistent)
	            notClearable = notClearable || timeaccount.data.is_billable == "0" || timeaccount.get('is_billable') == "0";
	
	            if (timeaccount.data.is_billable == "0" || timeaccount.get('is_billable') == "0") {
	                this.getForm().findField('is_billable').setValue(false);
	            }
	        }
	
	        this.getForm().findField('is_billable').setDisabled(notBillable);
	        this.getForm().findField('is_cleared').setDisabled(notClearable);
	        
	        if (this.record.id == 0 && timeaccount) {
	            // set is_billable for new records according to the timeaccount setting
	            this.getForm().findField('is_billable').setValue(timeaccount.data.is_billable);
	        }
	    },
	    
	    /**
	     * Always set is_billable if timeaccount is billable. This is needed for copied sheets where the
	     * original is set to not billable
	     */
	    onAfterRecordLoad: function() {
	        Tine.Timetracker.TimesheetEditDialog.superclass.onAfterRecordLoad.call(this);
	        if (this.record.id == 0 && this.record.get('timeaccount_id') && this.record.get('timeaccount_id').is_billable) {
	            this.getForm().findField('is_billable').setValue(this.record.get('timeaccount_id').is_billable);
	        }
	
	        var focusFieldName = this.record.get('timeaccount_id') ? 'duration' : 'timeaccount_id',
	            focusField = this.getForm().findField(focusFieldName);
	
	        focusField.focus(true, 250);
	    },
	
	    /**
	     * this gets called when initializing and if cleared checkbox is changed
	     *
	     * @param {} field
	     * @param {} newValue
	     *
	     * @todo    add prompt later?
	     */
	    onClearedUpdate: function(field, checked) {
	        if (!this.useMultiple) {
	            this.getForm().findField('billed_in').setDisabled(! checked);
	        }
	    },
	
	    initComponent: function() {
	        var salesApp = Tine.Tinebase.appMgr.get('Sales');
	        this.useInvoice = Tine.Tinebase.appMgr.get('Sales')
	            && salesApp.featureEnabled('invoicesModule')
	            && Tine.Tinebase.common.hasRight('manage', 'Sales', 'invoices')
	            && Tine.Sales.Model.Invoice;
	        
	        Tine.Timetracker.TimesheetEditDialog.superclass.initComponent.call(this);
	    },
	
	    /**
	     * overwrites the isValid method on multipleEdit
	     */
	    isMultipleValid: function() {
	        var valid = true;
	        var keys = ['timeaccount_id', 'description', 'account_id'];
	        Ext.each(keys, function(key) {
	            var field = this.getForm().findField(key);
	            if(field.edited && ! field.validate()) {
	                field.markInvalid();
	                valid = false;
	            }
	        }, this);
	        return valid;
	    },
	
	    /**
	     * returns dialog
	     * 
	     * NOTE: when this method gets called, all initialization is done.
	     */
	    getFormItems: function() {
	        var lastRow = [new Tine.Addressbook.SearchCombo({
	            allowBlank: false,
	            forceSelection: true,
	            columnWidth: 1,
	            disabled: true,
	            useAccountRecord: true,
	            userOnly: true,
	            nameField: 'n_fileas',
	            fieldLabel: this.app.i18n._('Account'),
	            name: 'account_id'
	        }), {
	            columnWidth: .25,
	            disabled: (this.useMultiple) ? false : true,
	            boxLabel: this.app.i18n._('Billable'),
	            name: 'is_billable',
	            xtype: 'checkbox'
	        }, {
	            columnWidth: .25,
	            disabled: (this.useMultiple) ? false : true,
	            boxLabel: this.app.i18n._('Cleared'),
	            name: 'is_cleared',
	            xtype: 'checkbox',
	            listeners: {
	                scope: this,
	                check: this.onClearedUpdate
	            }
	        }, {
	                columnWidth: .5,
	                disabled: true,
	                fieldLabel: this.app.i18n._('Cleared In'),
	                name: 'billed_in'
	            }];
	        
	        if (this.useInvoice) {
	            lastRow.push(Tine.widgets.form.RecordPickerManager.get('Sales', 'Invoice', {
	                columnWidth: .5,
	                disabled: true,
	                fieldLabel: this.app.i18n._('Invoice'),
	                name: 'invoice_id'
	            }));
	        }
	        
	        
	        return {
	            xtype: 'tabpanel',
	            border: false,
	            plain:true,
	            activeTab: 0,
	            plugins: [{
	                ptype : 'ux.tabpanelkeyplugin'
	            }],
	            defaults: {
	                hideMode: 'offsets'
	            },
	            items:[
	                {
	                title: this.app.i18n.ngettext('Timesheet', 'Timesheets', 1),
	                autoScroll: true,
	                border: false,
	                frame: true,
	                layout: 'border',
	                items: [{
	                    region: 'center',
	                    xtype: 'columnform',
	                    labelAlign: 'top',
	                    formDefaults: {
	                        xtype:'textfield',
	                        anchor: '100%',
	                        labelSeparator: '',
	                        columnWidth: .333
	                    },
	                    items: [[Tine.widgets.form.RecordPickerManager.get('Timetracker', 'Timeaccount', {
	                        columnWidth: 1,
	                        fieldLabel: this.app.i18n.ngettext('Time Account', 'Time Accounts', 1),
	                        emptyText: this.app.i18n._('Select Time Account...'),
	                        allowBlank: false,
	                        forceSelection: true,
	                        name: 'timeaccount_id',
	                        listeners: {
	                            scope: this,
	                            select: this.onTimeaccountUpdate
	                        },
	                        lazyInit: false
	                    })], [{
	                        fieldLabel: this.app.i18n._('Duration'),
	                        name: 'duration',
	                        selectOnFocus: true,
	                        allowBlank: false,
	                        xtype: 'tinedurationspinner'
	                        }, {
	                        fieldLabel: this.app.i18n._('Date'),
	                        name: 'start_date',
	                        allowBlank: false,
	                        xtype: 'datefield'
	                        }, {
	                        fieldLabel: this.app.i18n._('Start'),
	                        emptyText: this.app.i18n._('not set'),
	                        name: 'start_time',
	                        xtype: 'timefield'
	                    }], [{
	                        columnWidth: 1,
	                        fieldLabel: this.app.i18n._('Description'),
	                        emptyText: this.app.i18n._('Enter description...'),
	                        name: 'description',
	                        allowBlank: false,
	                        xtype: 'textarea',
	                        height: 150
	                    }], lastRow] 
	                }, {
	                    // activities and tags
	                    layout: 'accordion',
	                    animate: true,
	                    region: 'east',
	                    width: 210,
	                    split: true,
	                    collapsible: true,
	                    collapseMode: 'mini',
	                    header: false,
	                    margins: '0 5 0 5',
	                    border: true,
	                    items: [
	                        new Tine.widgets.tags.TagPanel({
	                            app: 'Timetracker',
	                            border: false,
	                            bodyStyle: 'border:1px solid #B5B8C8;'
	                        })
	                    ]
	                }]
	            }, new Tine.widgets.activities.ActivitiesTabPanel({
	                app: this.appName,
	                record_id: (! this.copyRecord) ? this.record.id : null,
	                record_model: this.appName + '_Model_' + this.recordClass.getMeta('modelName')
	            })]
	        };
	    },
	    
	    /**
	     * returns additional save params
	     *
	     * @returns {{checkBusyConflicts: boolean}}
	     */
	    getAdditionalSaveParams: function() {
	        return {
	            context: this.context
	        };
	    },
	    
	    /**
	     * show error if request fails
	     * 
	     * @param {} response
	     * @param {} request
	     * @private
	     */
	    onRequestFailed: function(response, request) {
	        this.saving = false;
	        
	        if (response.code && response.code == 902) {
	            // deadline exception
	            Ext.MessageBox.alert(
	                this.app.i18n._('Failed'), 
	                String.format(this.app.i18n._('Could not save {0}.'), this.i18nRecordName) 
	                    + ' ( ' + this.app.i18n._('Booking deadline for this Timeaccount has been exceeded.') /* + ' ' + response.message  */ + ')'
	            );
	        } else if (response.code && response.code == 444) {
	            //Time Account is closed
	            if(Tine.Tinebase.common.hasRight('manage', 'Timetracker', 'timeaccounts')) {
	                this.onClosedWarning.apply(this, arguments);
	            } else {
	                Ext.MessageBox.alert(
	                    this.app.i18n._('Closed Timeaccount Warning!'), 
	                    String.format(this.app.i18n._('The selected Time Account is already closed.'))
	                );
	            }
	        } else {
	            // call default exception handler
	            Tine.Tinebase.ExceptionHandler.handleRequestException(response);
	        }
	        this.loadMask.hide();
	    },
	    
	    onClosedWarning: function() {
	        Ext.Msg.confirm(this.app.i18n._('Closed Timeaccount Warning!'),
	            this.app.i18n._('The selected Time Account is already closed. Do you wish to continue anyway?'),
	            function(btn) {
	                if (btn == 'yes') {
	                    this.context = { 'skipClosedCheck': true };
	                    this.onApplyChanges(true);
	                }
	            }, this);
	    }
	});


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Timetracker
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.namespace('Tine.Timetracker');
	
	/**
	 * Timesheet grid panel
	 * 
	 * @namespace   Tine.Timetracker
	 * @class       Tine.Timetracker.TimesheetGridPanel
	 * @extends     Tine.widgets.grid.GridPanel
	 * 
	 * <p>Timesheet Grid Panel</p>
	 * <p><pre>
	 * </pre></p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Timetracker.TimesheetGridPanel
	 */
	Tine.Timetracker.TimesheetGridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
	    /**
	     * record class
	     * @cfg {Tine.Timetracker.Model.Timesheet} recordClass
	     */
	    recordClass: Tine.Timetracker.Model.Timesheet,
	
	    /**
	     * @private grid cfg
	     */
	    defaultSortInfo: {field: 'start_date', direction: 'DESC'},
	    gridConfig: {
	        autoExpandColumn: 'description'
	    },
	    copyEditAction: true,
	    multipleEdit: true,
	
	    /**
	     * @private
	     */
	
	    /**
	     * activates copy action
	     */
	    copyEditAction: true,
	
	    /**
	     * only allow multi edit with manage_timeaccounts right (because of timeaccount handling in edit dlg)
	     */
	    multipleEditRequiredRight: 'manage_timeaccounts',
	
	    initComponent: function() {
	        this.defaultFilters = [
	            {field: 'start_date', operator: 'within', value: 'weekThis'},
	            {field: 'account_id', operator: 'equals', value: Tine.Tinebase.registry.get('currentAccount')}
	        ];
	
	        this.initDetailsPanel();
	        
	        // only eval grants in action updater if user does not have the right to manage timeaccounts
	        this.evalGrants = ! Tine.Tinebase.common.hasRight('manage', 'Timetracker', 'timeaccounts');
	
	
	        Tine.Timetracker.TimesheetGridPanel.superclass.initComponent.call(this);
	    },
	
	    /**
	     * @private
	     */
	    initDetailsPanel: function() {
	        this.detailsPanel = new Tine.widgets.grid.DetailsPanel({
	            gridpanel: this,
	            
	            // use default Tpl for default and multi view
	            defaultTpl: new Ext.XTemplate(
	                '<div class="preview-panel-timesheet-nobreak">',
	                    '<!-- Preview timeframe -->',           
	                    '<div class="preview-panel preview-panel-timesheet-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.app.i18n._('timeframe')*/ + '</div>',
	                        '<div class="preview-panel-timesheet-leftside preview-panel-left">',
	                            '<span class="preview-panel-bold">',
	                            /*'First Entry'*/'<br/>',
	                            /*'Last Entry*/'<br/>',
	                            /*'Duration*/'<br/>',
	                            '<br/>',
	                            '</span>',
	                        '</div>',
	                        '<div class="preview-panel-timesheet-rightside preview-panel-left">',
	                            '<span class="preview-panel-nonbold">',
	                            '<br/>',
	                            '<br/>',
	                            '<br/>',
	                            '<br/>',
	                            '</span>',
	                        '</div>',
	                    '</div>',
	                    '<!-- Preview summary -->',
	                    '<div class="preview-panel-timesheet-right">',
	                        '<div class="bordercorner_gray_1"></div>',
	                        '<div class="bordercorner_gray_2"></div>',
	                        '<div class="bordercorner_gray_3"></div>',
	                        '<div class="bordercorner_gray_4"></div>',
	                        '<div class="preview-panel-declaration">'/* + this.app.i18n._('summary')*/ + '</div>',
	                        '<div class="preview-panel-timesheet-leftside preview-panel-left">',
	                            '<span class="preview-panel-bold">',
	                            this.app.i18n._('Total Timesheets') + '<br/>',
	                            this.app.i18n._('Billable Timesheets') + '<br/>',
	                            this.app.i18n._('Total Time') + '<br/>',
	                            this.app.i18n._('Time of Billable Timesheets') + '<br/>',
	                            '</span>',
	                        '</div>',
	                        '<div class="preview-panel-timesheet-rightside preview-panel-left">',
	                            '<span class="preview-panel-nonbold">',
	                            '{count}<br/>',
	                            '{countbillable}<br/>',
	                            '{sum}<br/>',
	                            '{sumbillable}<br/>',
	                            '</span>',
	                        '</div>',
	                    '</div>',
	                '</div>'            
	            ),
	            
	            showDefault: function(body) {
	                
	                var data = {
	                    count: this.gridpanel.store.proxy.jsonReader.jsonData.totalcount,
	                    countbillable: (this.gridpanel.store.proxy.jsonReader.jsonData.totalcountbillable) ? this.gridpanel.store.proxy.jsonReader.jsonData.totalcountbillable : 0,
	                    sum:  Tine.Tinebase.common.minutesRenderer(this.gridpanel.store.proxy.jsonReader.jsonData.totalsum),
	                    sumbillable: Tine.Tinebase.common.minutesRenderer(this.gridpanel.store.proxy.jsonReader.jsonData.totalsumbillable)
	                };
	                
	                this.defaultTpl.overwrite(body, data);
	            },
	            
	            showMulti: function(sm, body) {
	                
	                var data = {
	                    count: sm.getCount(),
	                    countbillable: 0,
	                    sum: 0,
	                    sumbillable: 0
	                };
	                sm.each(function(record){
	                    
	                    data.sum = data.sum + parseInt(record.data.duration);
	                    if (record.data.is_billable_combined == '1') {
	                        data.countbillable++;
	                        data.sumbillable = data.sumbillable + parseInt(record.data.duration);
	                    }
	                });
	                data.sum = Tine.Tinebase.common.minutesRenderer(data.sum);
	                data.sumbillable = Tine.Tinebase.common.minutesRenderer(data.sumbillable);
	                
	                this.defaultTpl.overwrite(body, data);
	            },
	            
	            tpl: new Ext.XTemplate(
	                '<div class="preview-panel-timesheet-nobreak">',    
	                    '<!-- Preview beschreibung -->',
	                    '<div class="preview-panel preview-panel-timesheet-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.app.i18n._('Description') */ + '</div>',
	                        '<div class="preview-panel-timesheet-description preview-panel-left">',
	                            '<span class="preview-panel-nonbold">',
	                             '{[this.encode(values.description)]}',
	                            '<br/>',
	                            '</span>',
	                        '</div>',
	                    '</div>',
	                    '<!-- Preview detail-->',
	                    '<div class="preview-panel-timesheet-right">',
	                        '<div class="bordercorner_gray_1"></div>',
	                        '<div class="bordercorner_gray_2"></div>',
	                        '<div class="bordercorner_gray_3"></div>',
	                        '<div class="bordercorner_gray_4"></div>',
	                        '<div class="preview-panel-declaration">' /* + this.app.i18n._('Detail') */ + '</div>',
	                        '<div class="preview-panel-timesheet-leftside preview-panel-left">',
	                        // @todo add custom fields here
	                        /*
	                            '<span class="preview-panel-bold">',
	                            'Ansprechpartner<br/>',
	                            'Newsletter<br/>',
	                            'Ticketnummer<br/>',
	                            'Ticketsubjekt<br/>',
	                            '</span>',
	                        */
	                        '</div>',
	                        '<div class="preview-panel-timesheet-rightside preview-panel-left">',
	                            '<span class="preview-panel-nonbold">',
	                            '<br/>',
	                            '<br/>',
	                            '<br/>',
	                            '<br/>',
	                            '</span>',
	                        '</div>',
	                    '</div>',
	                '</div>',{
	                encode: function(value, type, prefix) {
	                    if (value) {
	                        if (type) {
	                            switch (type) {
	                                case 'longtext':
	                                    value = Ext.util.Format.ellipsis(value, 150);
	                                    break;
	                                default:
	                                    value += type;
	                            }
	                        }
	                        
	                        var encoded = Ext.util.Format.htmlEncode(value);
	                        encoded = Ext.util.Format.nl2br(encoded);
	                        
	                        return encoded;
	                    } else {
	                        return '';
	                    }
	                }
	            })
	        });
	    },
	
	    /**
	     * @private
	     */
	    initActions: function() {
	        var hiddenQuickTag = false,
	            quicktagName,
	            quicktagId;
	
	        quicktagId = Tine.Timetracker.registry.get('quicktagId');
	        quicktagName = Tine.Timetracker.registry.get('quicktagName');
	
	        if (!quicktagId || !quicktagName) {
	            hiddenQuickTag = true;
	        }
	
	        this.actions_massQuickTag = new Ext.Action({
	            hidden: hiddenQuickTag,
	            requiredGrant: 'editGrant',
	            text: String.format(
	                this.app.i18n._('Assign \'{0}\' Tag'),
	                quicktagName
	            ),
	            disabled: true,
	            allowMultiple: true,
	            handler: this.onApplyQuickTag.createDelegate(this),
	            iconCls: 'action_tag',
	            scope: this
	        });
	
	        this.actions_export = new Ext.Action({
	            text: this.app.i18n._('Export Timesheets'),
	            iconCls: 'action_export',
	            scope: this,
	            requiredGrant: 'exportGrant',
	            disabled: true,
	            allowMultiple: true,
	            actionUpdater: this.updateExportAction,
	            menu: {
	                items: [
	                    new Tine.widgets.grid.ExportButton({
	                        text: this.app.i18n._('Export as ODS'),
	                        format: 'ods',
	                        iconCls: 'tinebase-action-export-ods',
	                        exportFunction: 'Timetracker.exportTimesheets',
	                        gridPanel: this
	                    }),
	                    new Tine.widgets.grid.ExportButton({
	                        text: this.app.i18n._('Export as CSV'),
	                        format: 'csv',
	                        iconCls: 'tinebase-action-export-csv',
	                        exportFunction: 'Timetracker.exportTimesheets',
	                        gridPanel: this
	                    }),
	                    new Tine.widgets.grid.ExportButton({
	                        text: this.app.i18n._('Export as ...'),
	                        iconCls: 'tinebase-action-export-xls',
	                        exportFunction: 'Timetracker.exportTimesheets',
	                        showExportDialog: true,
	                        gridPanel: this
	                    })
	                ]
	            }
	        });
	        
	        // register actions in updater
	        this.actionUpdater.addActions([
	            this.actions_export,
	            this.actions_massQuickTag
	        ]);
	        
	        Tine.Timetracker.TimesheetGridPanel.superclass.initActions.call(this);
	    },
	
	    /**
	     * Apply quick tag to current selection
	     */
	    onApplyQuickTag: function() {
	        var quickTagId,
	            filter,
	            filterModel,
	            me;
	
	        me = this;
	
	        // Tag to assign
	        quickTagId = Tine.Timetracker.registry.get('quicktagId');
	
	        // Get filter model for current selection
	        filter = this.selectionModel.getSelectionFilter();
	        filterModel = this.recordClass.getMeta('appName') + '_Model_' +  this.recordClass.getMeta('modelName') + 'Filter';
	
	        // Send request to backend
	        Ext.Ajax.request({
	            scope: this,
	            timeout: 1800000,
	            success: function(response, options) {
	                // In case of success, just reload grid
	                me.getStore().reload();
	            },
	            params: {
	                method: 'Tinebase.attachTagToMultipleRecords',
	                filterData: filter,
	                filterName: filterModel,
	                tag: quickTagId
	            },
	            failure: function(response, options) {
	                Tine.Tinebase.ExceptionHandler.handleRequestException(response, options);
	            }
	        });
	    },
	
	    /**
	     * check user exportGrant for timeaccounts
	     * NOTE: manage_timeaccounts ALWAYS allows to export
	     *
	     * @param action
	     * @param grants
	     * @param records
	     * @returns {boolean}
	     */
	    updateExportAction: function(action, grants, records) {
	        // export should be allowed always if user is allowed to manage timeaccounts
	        if (Tine.Tinebase.common.hasRight('manage', 'Timetracker', 'timeaccounts')) {
	            action.setDisabled(false);
	
	            // stop further events
	            return false;
	        }
	
	        // By default disallow export, this apply for example, if there is no selection yet
	        // E.g. filter changes and so on
	        var exportGrant = false;
	
	        // We need to go through all timeaccounts and check if the user is trying to export a timesheet of a timeaccount
	        // where he has no permission to export.
	        Ext.each(records, function (record) {
	            var timeaccount = record.get('timeaccount_id');
	            var c = timeaccount.container_id;
	            if (c.hasOwnProperty('account_grants')) {
	                var grants = c.account_grants;
	
	                if (!grants.exportGrant) {
	                    exportGrant = false;
	
	                    // stop loop
	                    return false;
	                } else {
	                    // If there was at least one selection which had the exportGrant, allow to export
	                    exportGrant = true;
	                }
	            }
	        });
	
	        var disable = !exportGrant;
	        action.setDisabled(disable);
	
	        // stop further events
	        return false;
	    },
	    
	    /**
	     * add custom items to context menu
	     * 
	     * @return {Array}
	     */
	    getContextMenuItems: function() {
	        var items = [
	            '-',
	            this.actions_massQuickTag,
	            this.actions_export
	        ];
	        
	        return items;
	    }
	});


/***/ },

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

	/* 
	 * Tine 2.0
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Michael Spahn <M.Spahn@bitExpert.de>
	 * @copyright   Copyright (c) 2016 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	
	Ext.ns('Tine.Timetracker');
	
	/**
	 * CoreData west panel
	 * 
	 * @namespace   Tine.Timetracker
	 * @class       Tine.Timetracker.TimesheetWestPanel
	 * @extends     Tine.widgets.mainscreen.TimesheetWestPanel
	 * 
	 * @author      Michael Spahn <M.Spahn@bitExpert.de>
	 * 
	 * @constructor
	 * @xtype       tine.timetracker.TimesheetWestPanel
	 */
	Tine.Timetracker.TimesheetWestPanel = Ext.extend(Tine.widgets.mainscreen.WestPanel, {
	    getAdditionalItems: function() {
	        var items = [];
	
	        if (this.app.featureEnabled('featureTimeaccountBookmark')) {
	            items.push(new Tine.Timetracker.TimeaccountFavoritesPanel({
	                height: 'auto',
	                id: 'TimeaccountFavoritesPanel'
	            }));
	        }
	
	        return items;
	    }
	});


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Timetracker
	 * @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.Timetracker');
	
	Tine.widgets.grid.RendererManager.register('Timetracker', 'Timesheet', 'timeaccount_closed', function(row, index, record) {
	    var isopen = (record.data.timeaccount_id.is_open == '1');
	    return Tine.Tinebase.common.booleanRenderer(!isopen);
	});
	
	Tine.widgets.grid.RendererManager.register('Timetracker', 'Timesheet', 'timeaccount_id', function(row, index, record) {
	    var record = new Tine.Timetracker.Model.Timeaccount(record.get('timeaccount_id'));
	    var closedText = record.get('is_open') ? '' : (' (' + Tine.Tinebase.appMgr.get('Timetracker').i18n._('closed') + ')');
	    return record.get('number') ? (record.get('number') + ' - ' + record.get('title') + closedText) : '';
	});
	
	Tine.Tinebase.data.TitleRendererManager.register('Timetracker', 'Timeaccount', function(record) {
	    var closedText = record.get('is_open') ? '' : (' (' + Tine.Tinebase.appMgr.get('Timetracker').i18n._('closed') + ')');
	    return record.get('number') ? (record.get('number') + ' - ' + record.get('title') + closedText) : '';
	});
	
	Tine.Tinebase.data.TitleRendererManager.register('Timetracker', 'Timesheet', function(record) {
	    var timeaccount = record.get('timeaccount_id'),
	        description = Ext.util.Format.ellipsis(record.get('description'), 30, true),
	        timeaccountTitle = '';
	
	    if (timeaccount) {
	        if (typeof(timeaccount.get) !== 'function') {
	            timeaccount = new Tine.Timetracker.Model.Timeaccount(timeaccount);
	        }
	        timeaccountTitle = timeaccount.getTitle();
	    }
	
	    timeaccountTitle = timeaccountTitle ? '[' + timeaccountTitle + '] ' : '';
	    return timeaccountTitle + description;
	});
	
	Tine.widgets.grid.RendererManager.register('Timetracker', 'Timeaccount', 'status', function(row, index, record) {
	    return Tine.Tinebase.appMgr.get('Timetracker').i18n._hidden(record.get('status'));
	});
	
	Tine.widgets.grid.RendererManager.register('Timetracker', 'Timeaccount', 'is_open', function(row, index, record) {
	    var i18n = Tine.Tinebase.appMgr.get('Timetracker').i18n;
	    return record.get('is_open') ? i18n._('open') : i18n._('closed');
	});
	
	// add renderer for invoice position gridpanel
	Tine.Timetracker.HumanHourRenderer = function(value) {
	    return Ext.util.Format.round(value, 2);
	};
	
	Tine.Timetracker.registerRenderers = function() {
	    
	    if (! Tine.hasOwnProperty('Sales') || ! Tine.Sales.hasOwnProperty('InvoicePositionQuantityRendererRegistry')) {
	        Tine.Timetracker.registerRenderers.defer(10);
	        return false;
	    }
	    
	    Tine.Sales.InvoicePositionQuantityRendererRegistry.register('Timetracker_Model_Timeaccount', 'hour', Tine.Timetracker.HumanHourRenderer);
	};
	
	Tine.Timetracker.registerRenderers();
	
	Tine.Timetracker.registerAccountables = function() {
	    if (! Tine.hasOwnProperty('Sales') || ! Tine.Sales.hasOwnProperty('AccountableRegistry')) {
	        Tine.Timetracker.registerAccountables.defer(10);
	        return false;
	    }
	    
	    Tine.Sales.AccountableRegistry.register('Timetracker', 'Timeaccount');
	};
	
	Tine.Timetracker.registerAccountables();

/***/ },

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

	exports = module.exports = __webpack_require__(1)();
	// imports
	
	
	// module
	exports.push([module.id, ".TimetrackerIconCls{background-image:url(" + __webpack_require__(52) + ")!important}.x-btn-medium .TimetrackerIconCls{background-image:url(" + __webpack_require__(74) + ")!important}.x-btn-large .TimetrackerIconCls{background-image:url(" + __webpack_require__(93) + ")!important}.TimetrackerTimesheet{background-image:url(" + __webpack_require__(822) + ")!important}.x-btn-medium .TimetrackerTimesheet{background-image:url(" + __webpack_require__(1190) + ")!important}.x-btn-large .TimetrackerTimesheet{background-image:url(" + __webpack_require__(1551) + ")!important}.TimetrackerTimeaccount{background-image:url(" + __webpack_require__(834) + ")!important}.x-btn-medium .TimetrackerTimeaccount{background-image:url(" + __webpack_require__(1200) + ")!important}.x-btn-large .TimetrackerTimeaccount{background-image:url(" + __webpack_require__(1561) + ")!important}.preview-panel-timesheet-description{width:98%;height:97px;padding:3px;position:relative}.preview-panel-timesheet-left{height:102px;margin:5px 2px 5px 5px}.preview-panel-timesheet-left,.preview-panel-timesheet-right{float:left;position:relative;width:48%;padding:5px;font-family:verdana}.preview-panel-timesheet-right{height:97px;margin:5px 1px 5px 2px;border:3px solid #e5e6fe}.preview-panel-timesheet-leftside{width:180px;padding:5px}.preview-panel-timesheet-rightside{width:auto;padding:5px}.preview-panel-timesheet-nobreak{min-width:900px}", ""]);
	
	// exports


/***/ },

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

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANMSURBVHjadVNNSFtpFD3fyzPmRxNNNHEUiRKlqQXtxjiVMaIDrypDcFO1YFNakLZIl6ml7aJddjEdmEJbxsXQAUXjYBkoSKPMgFPELlKl9Rc00RoRbcx/YjQ/r5e3kHbRAx/vLb577j3nno+Joojvobm52TA3N3eArzAwMPBQrVb/GIlE4lR7+xuC6elpudvtngkEAudzuVyBwWBg9M0Gg8FQMpl0jY+PD/4xPJz8qalpoV0QLtpstl9PCbq7u38pLi52Wa1WpVajEbe3t3PRSAQqtRqWMxauxWZjT3578vlyb29JlcnEnHfu7s78O/OnRDA4OGjd2dmZf3DvPnv79v+sUaeT5atU0Gg0CIVCiEajWFtfz1zu7+d9Xp84OTk5J0IcHRsbeyYROByO6K0bNwu9mxtiQ309K8xkoCovxykYw8elJSwuLuZ+FgRub29vpaOj4xwIXFtb26NsNlsYCQXTFwWBKZRKKAwGxNbWwMlk0gnSFAqFAo4rV7i/Xr48abI21bW3t58HQdba2jrs6HfoqqpMMp7nEQ0GkU+6Yysr0JrN2D84QJi8OEqlsP3pE6qrq9kbt5v19fVx9P+aD4fD5ZlsRjQajSwej6OYdCupW+rsWTy/ehU6ux07fj/0ej3kcjloQ1wsFoNKobpEDSM8mSQmEnFwHCeZliH9fF4e1nd3kSgrQx6R9vT0oLS0VJKRTqfh8Xjw6p9XRZWVlTkulUrtUijYIY3OiESeny+RlVdUIKXTobOzEzU1NZiamkIikQBlA+QbLBYLs9vtFdzh4eF/iUQS7xcWTmRk2PHxsUSwtbWFkpISqbOSjPV6vRgaGsLIyAhodAiCAGp+gd/Y2LhJRl6jIMk/BwLgGIO6oADUTbpIZNKZnZ3F8vKylImWlhbJE5Kr50Dw+/2OeCyO358+FUPhcIYKYCT9+/v7kieUFYmMAoeJiQmYTCas0ZrJD89plM1m8+Pr164705k0Sx0d5Wpra7Pz797xNBmjncPn86Gurg4gUG7gdDpBgbr0zWOioh+o4EORtkivUCrY5uamNDJJRFdXF7RaLVZXVzE6OgoqfkFRvvXd59zY2FjW0NDQSV7MU8d7AC4wxvR03wPghcvl+huELyzsjhx09SmYAAAAAElFTkSuQmCC"

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAALXSURBVHjabVPfSxRRGD0z47quO7qlsrLlL1Yt8T+QSIuIwOglJEIIxILegl566UUEwXwIfetBfIpF8iFQsrKoVQohDIlCWdFNWdN11V331+zo7M7Xd2fdEOnAZT747jn3O/fckYgI4+PjnkwmswWGLMt6T0+PE6cwNjaWK9S9vb0K80wwJLThUdXZqq6VlyuXwUjr6WztndovOIXoZPRKoa64VfEZMl7RHL2QcAmfbj+5ebXNyPeLihRkmv6gUj0Dl90pjkBC1xBfsKOABddXTA69n9FmtBtFYCztBfA69gYuRwkTS1EVcKK6XIW7TIVAJJnCjpTCXiqN/ZSGRqOZDyqSrAMhQTJNAhGQNU0YORO6kUVSP+SWDEVWcL/5KVZjazhX2oDp4Dv8iv0Et+S8AJiYzULOycjlgGKoeFD7GDWOGjhlJzRTQyS8g/HfPmwktpDMHOJCZRNAsCDBhmvZTPaDqNPpNMLhMDY3N5GMx3HeZsPh/DwUXUfFw4dwu90oKyuDJEmob6rvDAVDb8HoMAzD5BhpcXGRpqenaW1tjWLb23Svu5tSGxu0bbfTx44Oq69pGvHEVFdXd52I8j5Esbq6allpbW2FqqriPWAvGgWJaHlVz85Cn5pCIBCw9hfwT2B3dxd2ux1Op9Min0SSraTE1+/HwcHBaYE82ILljy3AxgRZUSzBH0tLcI+OIl1eDj0UAlv4/wRCwOFwoKurKy9QUoLnAwMY9fkwx5fbOjGB4uZmsa8gQCcFxOhiPPFA8otFPF4vnvX3I7K/D7WlBbbOTkQiEZEScWImjtHOY5lMpuHhYYpGo9YtczI0MjJCxtER6fE47SwvU19fn9Xjn+87AEfBSjuPlRPx8A3T4OAgcSJWXLqui5NofX2dhoaGyO/3mz6fbxGAKshiSQAaPB7PRUVRRC0VM7xe712Xy9XIcZayQCaRSKwHg0Eff1Ns4RsT4zjGX7UknlErAiA/AAAAAElFTkSuQmCC"

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACYQAAAmEBwTBV+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAUhSURBVHjapVVZTFNpGMWJMWbik4mZTJyHcQnEF30iyoMkhi0qPjniLiJxGUBtaeNGjFoWOwFtUVnMiImoAQsBFIEHUIzIUmWTYROwUAoCXRCQIpTbnjn3T2gksySTucnJvb3/3/N93/nO918fAP8bly5dyrt48WLPiRMnWuLi4tLld/+4OSAg4EeNRqPX6XStWq3WdvbsWYdKpWomMg8cOOC/sC8sLOz7neHh9pGRkQD598aNG1/u2rXrh78jXZKamvru9OnTuHXrFhrqG9Db04vuzm6Y+80YMA2gqqoKERERlqCgIL+jR48qc3JyYKytdXd0dAStXr06wWg03l1Eymwi4uPjZ+/cuSOI8vPzPb+lpEjn1GpJpVC4VUqllKjRuF+8eIHhoWE0Nzd7rmk0A4MmEz7b7WhrbZvZsGGDo6Ki4icvKfUJPnz4MOpq61BZWYlUrVbKyc5GdkYGSgoLUVRQgAf370N34wY0V654jkdHu9+/fw/bmA2szq25pvlMGUajo6MDF2lM0Werq6tR8MTgMeTl4V19PXoaGjBqsWBsaEiGeO7t6sKbV6+Q//gx4mJjpcbGRtisNvj7+4ctcHmJ9+3bV5WUlISKsnK8rq72NBmNGDKbMdjWBguzsn76tAimnh7Uv3mDsmfPEHnkiNTX14d+U7+LDf/OS8z0l+/YsQP1dfUoKy112UZGYP74EX+0tEB+bs/PF3f76KgXDI5nxcXiua6mBmwixh3juHr1aq6XOCQkJJYNI+lzOMbGBAZJ/JFZjQ0Po7u8HBZKsrDWytL7uT7KtT7usZE8KyNjro3VsaGjXuKoqChjbm4uysvK3B1cHKGWTW/f4kNdHTMimdUKY2Iixm02PGfpxUVFyGBDZekS+T4lORnper3nzJkzmJyYdMmkK1asWOWzfft2a+nTUpQ+fTpPywgCK7OwMYBc6oTDges7d+LXLVtwk47glOEG73lsMG0F2cMcJCQkJCD3QS5CQ0IfLV26tNInMDDQZnhiQKHB4JocH4cMBhDgs8j4eHg4zkVF4fz583hFRwwMDMDGBMa5bue+wcFBlJSUQK1Wg0boWrZsWYnP1q1b3zGSPGXu3g8fYCfR1MSEFy1NTSgwGKBUKlHDRlm5LhO1sLlutxuSJGFubk4EIbm8z0Ns89m8eXMatZJ1EzJMT05iempqEViqKP8TrTYzMwOLxSI0zsrKgoNSydf8/Lx4vnDhAmJjY+/5rF+//mceJEhPT8fLqirJ+eULZHzmpoX7yZMncZ9TN0ZXMENBzEMJe/bskUsHB0uQM6gIxiluFdZYs2ZNp/a6VhDYmfUQS22nQ746nTDRWseOHUMR3UAZBHFnZycoIfg/+Pn5gYnJ0oisCzn+3D8liH19fZczusRTDTExMdIQM5r9+lXAOT0Nzj8yMzO9Gbe3t2PTpk1YuXIlQkND0d3d7ZWDvUJkZGStd7bXrl2rPHXqFHQ3ddi9e7enqbFRmpudxTBtd/nyZaGd2WwWjerieREcHIzbt2/D5XJh4XI6nUKigwcP6gXpN+SaeGW8JzkpGTxCoVapPHezs+cfPXwo7d+/H8XFxaL7w5w6E4/Kby8GEN6m5jOE718O+nXr1q1i5la1Ss2pShGOYBDRpEOHDgmt2X3RKJYuwEwFKb8s2Lt3r+JfP010yy8KhaIm5/ecKb1O705LS/NwAOb55QDHV8hgoL/1ej145ILvZwgFscRL/F/AJm8j7hGtxBRRS+gJ32/3/QmXUHCN9dyliwAAAABJRU5ErkJggg=="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAQwSURBVHjajZRdSBxXFMf/M7MzO/vlrhs/o7UJ6EOF0AeLUiS0VhcC2yAxSVupBFraPPSpD/14kFCh+BAK9T190JcifaiCENoQN2KpYoIVokLAj621um4+Nrru7uzXzNyeubKpswTJfzjovXvv755z7jlXYIyhXOPj4wUAMkhOp7O6r6/vGco0NzcX3N7eTuBIxf7+fgXH9AIsnBcGwHABpPxMvl92yCJIpy+d/jX+PF5AmeqCdUpsMnaZU/Wi6ex2/gKTPgkTbJZNOFASw6foRZdAiLszd6FIRw68fe3c5ebXL6DKE4BPdcPSYU7Dw0frmJ6ZBhigm7oohcV+SZFQmChai46BBfoM+uMS8OFSHzyCAp9bQVWDB9rTfxDIqPC7XNyDZDaHA1cO3/z9CbJpHYdmFqf8FUhoh0cckgPHxQCeGg8gqICoCigYBvJFHZl8AabJYClbLKKgG/jq/HcwmYBkLgWvw4/P7lwH10vBphWawTfmCOgQRYgQaM5E1mESyECRDoMpwyV5EU1GUe9uxL+HuwDDS8AmNAWKlS/oBiMDDENEqOYS3qpsR51aD4M+ibbE87tYeP4nbix8i30tRVFRerQ0ZCbDMA3NXhWC0G2a5nRpXKRw9/b2oCgKcrkcstksNE2D2+2Gy+Xi8wZ5Xl9fD4fDUWJAFMUeYkRsqaAJboVCAdFoFF6vF1tbW1hYWIAI4MzGDop3ppB5rRFvDA6iprkZ6+vraGlpgSRJOC4RpHL42toaPB4PVlZWsLm5iVAohI9DvThoOoOL4SvonZ1FYmAAa7dvWw2EjY2NklM2sA0ai8V4mIlEArquo7OzE5WVlXDS3M/TU9BlSg2Ac0+eQL95E0lal8/nsb+/D9KJYO7Fzs4O2tra+P+yLFu5gyWdTCPLkDXRmu1bt3jO6T5OTgV5yiG1tbUlKL+UkoocyuHcHKurPMJ4PH5yKqgauFVXV2NyctK6cW6AAFVVkW5sgkZjC147NAQWjfLqSKfT5WC7UqkUD83n84FerBdg5nXiaugiftpdh/r9j8i53FglsMEYj4zu4+QcU1jcY4JzYMnEChVXPvoAZwM1uDH7O+ShH6AHKqG2tiKZTPL6LmHKW5qroaGBl1gwGOSH2A72S7j2xXV43B6M3v8DXw58jr9OuSA/fsxTRxd/AOCZrSlI3VQ2LJPJsJGREUYNwqwxec+oYWyWT2ZY6uEmu//1IJu5d49Rjtni4mKhqqrqnRLPBqbW5WDqNjY8PMyohDiYNnIbGxtjlEtudAA/fGpqis3Pz+co0ndLLDLbW/EeeRih94KPCYrR0VF0dXWho6PDSgsvQ/qdvx2RSATLy8tWrT8Nh8PvE+cB/pcNfLa9vb0Vx0RzUiAQ6KV34E2C+giapLkK2nNIkTygmv9taWkpSuNHKBdNvrL19PT4X3Xtf00apeQG1nyqAAAAAElFTkSuQmCC"

/***/ },

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

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

/***/ },

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

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

/***/ }

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