(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__(300);
	__webpack_require__(312);
	__webpack_require__(309);
	__webpack_require__(303);
	__webpack_require__(311);
	__webpack_require__(308);
	__webpack_require__(305);
	__webpack_require__(307);
	__webpack_require__(306);
	__webpack_require__(304);
	__webpack_require__(299);
	__webpack_require__(301);
	__webpack_require__(302);
	__webpack_require__(310);
	__webpack_require__(313);
	__webpack_require__(656);


/***/ },

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


/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAQAAADlauupAAAACXBIWXMAADdcAAA3XAHLx6S5AAAACXZwQWcAAAAQAAAAEABcxq3DAAAAAmJLR0T//xSrMc0AAAMkSURBVBgZ1cH9T5QFAAfw73NwB3fPnfd+z73x3D0Qd/EScrKDndLpKFvoIQpkuamx3Fpi+LJGBas1dDJWi1WTiFkMrIGhueUL07VqCgtq9IM2qmm5RdFQ8mCxc3dn8O1+6Y/o8wH+/7xHAD+gkwsAaZ+wLbyYtaN6fZYcvaNq3TIONEageUkLHFwLue0Qht/qhLF7CDh2C0LXLmT0Q8AIgE+gCHtwWDDiPxHVm2h2VgFKED8UfKoq3LYOeKRO9VTlSZysugaEj0MDZxpwBQRRHwZ0nXJ5tP/d1bq+0Wcea63t31wBPBERmgGcHk8Kxec6tF0kNuZPCb4nH4arJACABJpSwvWmJSC/7FKg7G3SN8F+uSKRba701xsuA9rzuZNFtvfi66eXGqJn3vnbPZ59waQA4U7sQUY9MkjAd+vGUdckaVtMjeWNkOauyG/eQUBpGEo/FCU9OenPHG1kYc+xHuUE4JdU88hQHr2LRGQWMA5NlVp3kN7alemCdjL3YlF7wemcXv/2BXVeC2ns/sciVZD5t2cn5EFdQpkHILUC1kJV3OwDRNdHv1qWSN8m0ts4Xw9oG72bfAnvQuoN8zhpnFqdlutIuSYed0esAx4RgF4WOnQH1WWaS4D6r6afLdWkZ5i0tZwNFe4H8s+Lz9qTPx3Vm0nr6w+mPVbSc2C43lYKOJdVRciYI+FUdllf0HDghulL0j5HOmdvBopbwq8iw7g1eFyvvbPbKpLu3mvflHRlTVZKgO6qqgbiSKDUlD5Lw/1EUJ8mHXNc69zNw+4N/NY3xva83O88DvvHkmE4edusJr0fLo2WaE58EAhtGKh+RbAg2z8TyjGS4uLqFdvvPOK5S+aNka4LjImDbDa9SDokpl1Pk/Io6a3jsvNzvma7Ser3jnwNYGFZHUqsW7N4f7P9x+RG9y/JGW881edYTr9s+CJ9zykm55SZZCqYWrleNLF6KphY2an8kdoptT04YLDf2w9hu9Kd01MsiL3lew1/Vj235mq03NDxeIOYrG3Sfh+7mKuPzesPxU6ZVmJf2ffVuqXna/qkM9V6+/uhcxaDNfkvFyNEYtfdliYAAAAielRYdFNvZnR3YXJlAAB42isvL9fLzMsuTk4sSNXLL0oHADbYBlgQU8pcAAAAAElFTkSuQmCC"

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAG7AAABuwE67OPiAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAARdQTFRF////gAAAqAAArQAAhwAAigAAkQAAmAAAnAAAqgAAgAAAqAAArwQEnAAAhw4OjgAAbgAAbQAAagAAogAAlisrfx4WgiQb0nh1w0pJyWBdnR8cvzQqxUc/pB8TpB8VpCEapCMepR4Sph4QqyQXrycbszEmsysfvko/w0pAyExDylZMgCMhgSMhoT40skM6aiMfaiMgezwyWSEcWyEbvQAAvgAAvzkzwREKwjMzwk1Iwzo6xTkyxhIMxxIMyT4+y0Q/y05KzEZG0AAA0BIM01ZW01dU02Vg1GJe1mBd12Nh2xMQ2xQR3xMP3xQS32hh4wAA5S8q5TAs5TIt5TIu5XNx5m1t5nZ16Y2J7xQS7xUT74mH8I2K9QAAY45BIQAAADR0Uk5TADIyMkhISEhISElJSUpLT1BRUtDX3d7k5ury9PX6+vr6+vr6+vr7+/v7+/z8/Pz9/f3+/tVu3mIAAACcSURBVBgZjcFFFoIAAAXADyjYInZ3d2IHYnfn/c+h8HTPDKAE5Tbgy+CkICO9z4wW0KdfPhIS6/ZyTRnNhfPlZoVEk5iIi3x5Js6TGsiY2KA/bI2mcQY/dLTTbDciNP7UYb5W58Nq/Kj8Y6HbE8YBFWS64Hq3rFZWu03IBIl9/74XWa70eB9skBCeY5YFuNzJQ0BGOCz44lwElPgAQ7MTa3psPxYAAAAASUVORK5CYII="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIxSURBVDiNhZNLSFRRGMd/33fGGYse22hGyIoigtA2IS1qU/sgqECIpE2ClZY9pEWLsgySwCHBQugFSdYm6GFR0CJataipMUEwSOmxSGlomjsz92sx984jhT44fJxz7vn9/+fPuWJmAIhIAxCnVML/y4DpSDhLJBJrPk1MPM/9yUmIEBEEQQQQKVGDHqmrs0X19dvKAOec5L28+5XJoCqouqArqhrAqgCRiAESqTgq7asqzimqDueCgyJo0EOASMloNQARwTkXAIIhgmgFJLUA0RqACs5pCaKKUyXneVwfGqR1767KunMLO1Cp3FlVeXj3HPlcnq3rjcn0ElyVE1Xl3wzKGyrCk9Feluce0z3wkyOtcdoOJcNDZXWAmisQAMYe9LE4O0Zn/3eSJ1aSlwRNTc1lgcCFLRji0/t9LPVe0HXlG0NnVpH+GufgsVtl1bCHD7AG8GjkAssKrzl6+QuDp+N8nInT1nWbWCw2DxBWGbC58Udb7Pcz2i9OMny2kQ8zCQ503iAajZY/npqawvM8isUisVjMBzzMjPY9Df337gzkNm5YbS+Ht1jy/G7LZDKWz+etUChYsVg03/ctlUqZ7/uWzWatp+fUTcABdDSv4/3OHdsL796+smTvPpubmzPP82oAZmapVMqy2ax1nzw+AkTCHFaIyPSmtdHPVy/tn6ccqvu+b+l02us43HENqDMzzAwxM1paWuLj4+M9s7Ozo0CB0n8RpiVVowC8MTMvzOUv+1z4vWWlSDQAAAAASUVORK5CYII="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJXSURBVDiNfZBNSFRxFMV/781T05maUqkmtA/Saim0MtM0gxBrUUSQENi00oXLWrgpaVEWtmkRBAblwtoYQl8uFERJcqKiDEb6QJgGmnTEnJk3M+//3m1hb8DRPHDh/M+993DuXxMRBgcHA6ZpRgF0XU+3t7d7yUN/f7/t8mAw6BERB0Cjlq7ybeXnZgdm6wGS6aSqPF85kW8QH443urz0dOkYOk9lXO5r1DF69kprU6210jcMD2bVT8p8W/EXeUGDP+kUS6GinFnIP8lw7+uR1EjqpAHwZT7M0OJz/MWbKPOVUB72smOLj+2bfQDElhP80hLMJ5IsJFLst6oxDEMDMNDQHEcQAeU4WLZD2lIspzMrifQCLld383XxG7tK9vLi+ys+L34CHX3FAFBKods6tg1pyyaVtdHJYGYUANemrpLIWiyZJstmhgNlVSDuQQU0K6UcpZRsVJaycty2banYV9EiIuhYKBFho7Idm+YH9XQ8C+Y03dYVsHLHxsuKxodHGP89RXGRN6e7MFyD9eCIzfGBBt4lPtB1uJPbJ+6umdVdIiJMRSa5N92HiKAci5bBJn6oMJ2HOuht7luVbE0CEeHOdA9zdpiUlWIiOkq8cI6LOy/Rc+zWeillzR88ah1it7GHydQTxB/jVPkFrjfczPXj8TgzMzNEIhFJJpOOayDuQKFeyOOWl5RmKzhafIbuuhurYkejUWpqagiFQu8XFhbeAGhAg2maYyKi52fMRyQSkVAo9LGtra1eRBKuwd5AIHDQ4/Fo/97/g2SzWTsWi70VkSVX/Av566CQaS3obgAAAABJRU5ErkJggg=="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAPeSURBVHjatZXfaxRXFMe/dyYzuxGzmx9tNi3Zmdi4aAWrEZRQlF0RIfrUx0L7kH+hfTERSZ5UBMlD+1DavvhYWsTSQuiLZrfaptYq2iiRdGudCU00u26yRJOdnTv39txlHbaDLfjggcNl937P555z7rkMk1LiVZiGiP3C2MDPjOXVioi9lJYyDn0WGPg1nV6sXr0qr5mmo3637ke1PxnGw5Vvvpa/ZTKLUa3Wejrr7v5xcOp8v6iuIX3mjBUYRjSbUCto743xMbt69y66PvygX5pmoVWrPReau3Zd2/HF52lmGPBXK4inXod19qwdmGYID6G6nn/z5EmbVyrYWPgDG38voW/shCXj8RDeuDzVp53T01kmAyix8OpAnZws2NiAMzbuMM5zIFPQ/skJm5fK8EolcNL5tRpi2wch6ID1ixcL70qZa2RMiNF7x487azdvgTGtAZWeB1GtQpcCtsqcgFzT8vbkpI0nFQQrK9AIyDY3EetMwoi3o3LpkqtYYcbK8lSCWradO2e3dyUhKFjWPTCVfcwEtmyFUFUQsP7oEQQdzMmRTKBtewbu6dMupMzmpHzYCg7hnNry9tSUbVJbgvITylzBa9AoI1n34RNUHSDoP3R0QH9nDxYmJlxdiBAaglvtB4LrVPKeTz+hksuQjx8DBNSo5KDZ+6ABTUA/cAD3xsddn/PsCEH/94EoQSBE7vZHH7taqg9Gz2tgqmSC6rRqBG1r34L4wYP4/dSpxRAasTa8wGrkhu9j/bvvEac11t0NvWMrGF2SYBpoZsFXVxFwDg8R+69WfEut0IDCjqNHLXNuDjqNlEkalYFGq2AMHADv6QEfHsbc9LQbBEH2vWgrolAQdNuRIxbm5yHKZWhNkdnVhRjBjOfPleZdzs5i57FjlqbrBRX7QvBXaiKAfDqbtcTCAuo0VgJoOKNWVPbtQ2nvXrBUCrL5P19bg3/9Ot4aGbEEwRWjtRUNKCNo/6FDtu66YMvLiAGI0157MgmPgLevXHGUdujwYTtx/z426WCPMdTIOY0d9u/HX5cvO4Hv596ntjQylsCFjkzGls+eYZPGi5M4ABAkElgn6C2CCpoUAuduzsw4pUwGoq8PflPnPX2KerGInqEhW7HCVnjAaKVYdILOToDKboApixpB7xCoRlCVhXKP4HcKBWfVsiB7e1EnLVTcwACWb9xwvOiTvqCmgV6dRe3QlpbQRoF/EoBuPDfacuOhFsgPDg/bBmXr0wEPZmbcgJ600obg1gBB8NTu3XZpft6B70eh/9YSvJdaWCoWXRZCmxb9MnxGRX1JAWqN7L2U9pV9TP8BhsF6s7ML914AAAAASUVORK5CYII="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAMcSURBVDiNtdVLSFRRGAfw/3fueKWRmoUOOKZRpmkUhL0YK1pZbVoEtgtcSJE9iGjXoqLa5aKgx6aSQmwXJdrTCpHIujlOvioJFzaaMWXlOHq949zztXDmOvf66EUHDvfMXOZ3/t83Bw4xM/7HcCUXRJQLIO8fvRAzD9hgALnj4/qLyclJEAEgAhGBkFinPqfTTCdUFKiqWgpgBkwThgFd1yEEQQgxBTunYyNrqCqA6X1TYQv8G5jIVosdJiIoyhQoiEBOPAk4YPodmGg6rZgtsQNOcsIBCydsQ4UACWF9193djRs11xLtEhBE1vqPE4MItbU3MdTfhd63r7Fxa7lVifO3c8OJkpKoZMaVM9vx9UsYO3dsgNDTsHffoVkh52fheGuhDKCmuhyrMzV8G/6EReZLGOoaSCkhhLBV6ERn7TEJASkl6i5WoHBhCxpeZeDCMS8+h79jT0UV0tPTbdhc+IxWMDNuXz+MJeojPA4sRPWRDDwP/kBmaQPcGR64XK5ftmEGLJlx58ZRZKMeT4IZOLvfjZbAd8iCGmRm+eDz+WxtmG+kwqLuUiVylUY0BVScOLAULdp7pK26hWX5RfB4PNaJsYJICSklmBmKogAA22AiEsf3Fd1cTPV4oKk4ebAIL9o+QBTXIsubA6/XC7fbDZdrKkckEkE4HMbExATi8TiEEBgbGxsEEE5NrZw6tPZd4zmV9+9awJ+a1vC981n8+FEja5rGw8PDbBgGm6bJUkqWUnJPT4+1Nk2Tg8F2PT8/fz0zIzldu7dn319Z5Ct+1efB6YMhBDr7EV9+FdlZPhQWFkJKmSwTAGCaJnRdBxJ/dFdX52RV1d5tfX19bbYm+0vyli/LUeIv71Zy4+USfvb0IXd0dHAoFOLR0VGOx+O2tLquc2trK5umyW/eBI2ysrIdqUmTE8wMv9+/Ze0K6unsaOPe3l4eGhriSCTChmHMgKPRKGuaxu3tgXG/f93m2VALTtx7m0ZGRjgajbKu6xyLxdg0TRsqpeRYLMbNzc0DBQUFJXOhzAxKXqYpd55IHJv5btlBZv443zn+CXGDw3JtopXWAAAAAElFTkSuQmCC"

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANBSURBVDiNnZRNaFxVFMd/972ZeTOTialJSmpSW0QFEbowpKkVUhobMdJF6lSR0SIo6r4gdlXEjUs3unLRhQtDBSNVN0OiaZBQKUTQTQySxMZ0iGmndvIx8+a9e+9xMZ10ZjINSQ/cxTsfv3fu/53zlIjQaKOjowEQBfA8b386nb7dmDM9Pd2+tLSUv/cYZjKZWG1cVcFqQJ1DGAYoT5Yz0UjUAeh+tfvblTsrQSP4QPuBWO673FmAUIfWO+VdxmJxGZMpGYtsZQrvMsKgCmB8cpyYW2ng+NtHzj51eJjOln20xpMArPlFfp/9i4nJCRDQVjvuaSfjxlyCsTAJ1IAVCgMqoXjjtzQtKkZrMkZnTwvFWzfYtxmnLZEAhELJ527C56PFdyhtaNZsiY62R8gX1yoc4D640jUiAi2g4uDEFYExlEPNZjnA2opspTAk0IYPBz7GiqLgr5OKtPFe9oMt1HawBW0NgTb4oSbiODgotLVsumHlSxkDNkrCTbFQWOCx5EH+WbsJNXNwH2wpxoihrUYbQRvQRhEah0CrCtytpBqj8HWRi79e4L/iOoERCsUNohLFWFOsnwqlTllrJ5qN325NKYXjOEMi8lOdFCLCXsC+KRJ3k01jzm4h1ZdWT770L0e/PML58ffr/FV7qI7zpVWOXzrKYiEHC1OUjY/nxuty9gzOl1Y59lUfS8EKT+4/xOS5aWKOh4iglGoOrsIfCPVvMfD1MfJyh6dbDzH15jUe9dq3amprH6hx9u/vee3HlwltsAV98ZsX8KPrHE70cDVzjXavY5v2TcHVYEmX+OT6BW6U/+TMlZe4ubHM6bETRFNlutwuxl//hY54x46SNQV7jsenz39Bq9OCTq7y1vgQbZ2QMu1cGfm5rlNrLVprgmDrByhNpagWDPSc5OJzn5OQOAe7UkSKrVx+JUtHvP762WyW2dlZ5ufnyeVyd4HbO2oMcOLxk5x/5jM2VuNcGvphG1RE6O7upre3F2NM2NfXd0ZE/oCGlfZ9f8IYs6N2jTY3N0cYhuV0Oj28vLx8teqvHTe5t+t7AhcKhZXBwcEREble66/t+In+/v5n9wI1xsjMzMyiiMw2xtRuVvhh7H/sbdgpbF0eJwAAAABJRU5ErkJggg=="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAABuvAAAbrwFeGpEcAAAAB3RJTUUH2AEDExYsLUx2oQAABApJREFUOMvVlW1olWUYx//3fT/Pec7O247bzo5uTd00l6lD2yImK2uVTCozySAc9LYYCoGRKAR9yA+KBQWBMKIvfkmitCgyoi1ag0DKWmXi0bnm5jbdce/Pc563+76vPoRhtCNRH6IL7g8X/K8fF9d98b+A/1uwf1K09c7FPC6dpwMR3+hKGlKKjnz+88T0vwa3NVccqebebpImCmYajuP+lEzEmt7tGwyva4yFCrv2t98thNhbnslm4snSbiJ9qO35V1wA2HJXZRxcdtTd0YzN92xGNFWB11873DA/O7cRQG9RcNf+9hYCeoRhmolUKdJl5c2TE1fXf3b04NYtT72Mpg3rK1Ol8UhHewci6WoAhPb2nTjxwfEKYAxFwZpoT2NToznjBHBdD7EghGPPPTIzPFUPILdzx5MBlwUtTItzIwJSAdavW42EtaPQ9Wl/cXA2m6ledVs9zGQGzIwCWuHSuRT6vuyuApCzS4PR5X7sqJb+M8qdgZYBPHval4HTfSOH35jkvniHr6ituYVxAYD9/rOMoTJbiYa1t9YBQFNTJ8h3Xg3tKZJ2HsrO4/gnJ9ThrrdkUXD9gx16UTqZg5YAFKBDQIUQTPmpVPKr6zqKlFyazl/x7GtjyI+N4NcL5yNxKOtG1l9GETX5bu3PnSUzIsiIQCsJCgvvr9n64sWenp6qDF1Zx8i+t7yqtiTwPZSlMjBlaDz+0PbOXQefO0Na9rU+sDlYcI/Het/+MBpLbONGBKHvYXg831qTNlbTyi1vwMlbYuo8mGkBjCMMAhze14mm1sfw6L4uzP74Uc5wJ1oW3ON8EP/BLMxsIxnAkQLpdMU4j+qTGrCIC/BIFCRDMGFgYmQQJDXO9X+L7UKAGVY9j6Y6+ELgmpW3V/HEYoxcc5HO1iCVSHSA8ajWGsRNaBmAGEFriYELAyiQibHxMUxdHYXWCuDi4T86PpsbjRmGeMKKGM96Qrfw2BxKs8tgldUiXrXiJTV7GZ4yIEPAkhrCMEAEJFKLsKZxI5aubQaLxFBwfQq1dhgAdPeeua+muvxYWTqejUZNcM4AAggAYwyMAUSAlAqB72NoaGhQyRAALCIKSGNGEy75nn/6l2++Pnns4+l+9l3/kDANdj5TkapLJqJgrLgvKa0RBBJE9OaGVbv2WvES5ts+OWGBZuwT9Cd3O3V64P50aaw7HrOQSsZu6mpaa7heCCK6HLhq2fLaCl1My23H22QYAkGgEEoJTVT0hVJBKQ2t9ZKp+fnamzVhfH9m+NDE5Nzg0uryNtcPGgzBlxBQopUWSmvGGNOMMQnCbBDKIdvxTuUGxt+zJ+cu/q0LsuPAAWyqbmGcacsPZUwTmYyBk4Y0DeEJg7uhLeWeF9r+25v3G0/f9nxH1TdIAAAAAElFTkSuQmCC"

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAASySURBVHja7ZdrTNV1GMcfX5RMuUhxh8P9GnJ94WWsdMlNQgYOCANqWQmiZorNDGGY85DExvSApDSQGYhCgiwyrRZXpQQUE0xw3By4EEXnpJffnmfafx5h56Cy1QtefLbffs/z/T7f//md//9/DgH4T5kL8P8OcJLI8LSlZcNZf/8b1QYGzjM1PU3k9IOra2+9q2sLr42eK4AM/46ouc7KHI1RIeD1YA2Ro77h0iO9DSuXot7bE+IhXs8UQARM8ymDlzBWoMZkTRXOveYI3htinHSEdpKenxY740HZN7h/6luIx0kdIaYdfpwFVSwcVe/AZFYWhAdVFTjjaQ+uDZUTTTmOo0QuFVw74+WAe0c0mMzMxN/79mHiRAnESzzFW2+AY0T1lSwY+PQ9jKdvx+3tj0lPx0R5Kb73UIF7hmXgv5oiIrcCopE6Dni7KF/RCHczMnDneDHEU7z1BigjulxlYYT+TUkYSknRJjUVYyWFqHGxxQGiUQ2Rex6Rx06iscO8d0uzf4pmOC0N9+uqcdJsIcRbb4BSIscSosFqO1P8uSEePYmJ2iQnY+TQVyjkgTt48Aai8d1O1ujP34vupKQp/X8dOcCBrSGe4q03gFDEjcV8nidsF6FnfTQuR2vTGRODvrxsZDpaIN3BHN1fZqCd957uG8j6BNXOVhAv8Xym25BFTl+zsMLGBFeTV+NicLDC78z50FBcyd6GS1lb0RwSIntKvT0sDNc3v4NKBzOIh3g914PoEJFzIdHwMWsT/LFuFdqWL1e4wDQFBaGRaX28dyUhAb2fZ2BQo0YFfzqiFY8XehTns8FBoptlVsboin0drb6+jwgMRGdUFLpTUnFt02Z0bdyIX1esQFOwG45aGkE0op2VdwGbueSzYamEeDccLXy1LXzl51Qq1M6bh1oiCK2rPFDCw6VXNLP2Msplszw2LbY0RluwJ84STQfXvCA90ps7WwFyiJz3s+FhKxN0hHqjiSVCI9MgPFor+x1hPjhsvQiiyXnRIxADtXyR2LAr3A8dRBDamYvMBUHWj/aUeldEAA5Zm0K04vFcAfYSOTFDhTavoDsiEN1ECldlCPNzeAB+CQ+UtVJTiFyKQttXIR7Ms92G2USOe1ioYYPeyGXoJ9Kij2mNDEKAjRn8mfNr3sANqT1Fb8yb0KgsIV7iOaMAu4znu7FgUIT9bHCLSItRpjMmBCvtrLCS6F4Q0f0VvL60NlxqU/r74yKhsbdFjqHhUJGfn7veAFnmJr15S7xxc10U7hFpMcFci30LYSobrCa6u5XIUwjmIOG8dz02Unqm6EaS4lCbEI8Cd/eeGQQwbvrC0wF9m9fj4fyX8ZBIYSA+CvEqW0QQ3eHBytXIOowDrVPZYeDtaC2NePR9vAEFHu7INTX9UV8AOX9DPoJm9YIF6NvyoRJiOGEtUu3tEEU0/uTwJ0Os4Voa90ivMnzLR1AvXADxFG89AbRDiFDSjyTFY5eDCvFEY9uI3KbTCFKTnizuHUmME62u4UoAnSH28G9B9WJXvE90a/sMnm7S8wHRaOWyJaj09dE1XAmgM8Rue4vfdpoYXv9MeaDoR3rLvbz6q3x82sRj7p/RXABd/ANJI/6l0u5c9gAAAABJRU5ErkJggg=="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAATvSURBVFiFxVd7aFNXGP+dm6SJxmgQSWvTTtuyVp1Vy9xDGZt14gPFP8SNqZso1ambOocD0TGh3VAGbri5KcyCChM3/GcT62SztpSqTFZX6ChNi7a10upatsQ0yX2d++2PtulN7kkTleEHJ+dxH7/H950bDiMiPM2wmyeMsWcBFANg/xMeAWgnog4hAQDFiqJclGUFYAAb+jH1ABgbZWceD8/jQwG63W6Hw+FYBSAlAciygvDgICSJgTFBGwEeBov3JgLmcUII1pIJMMZgApfAGIMkjYKZgRMcSQFuhmTWJasDGAa2OGBSnrELInVpHAADE9tvJiBQb6mPJCeEcyEBBiv48IvZ0EULASICk6REhclkIHZFsqyIwBmLA0imNYkx3Lh+DXs/fC9+fahmpIT7zC29A0jhgMCFmp/P45uvDuHrE+cgJdXDqB4mHKckkNIBk90P+npx8/qvKJrcgbfXr0XJzFmjxMYAE4UlBWM6wBiCf7fiwpn34Xf9gd+bWlG+YhO4rlvSk2lkXgMAYqHbaLuyA19WX0Nz8024/Wvg8Xhgt9uF1j9+DQhaJHgXty5WYPfhDhzbX4KY61XMemEBPB4PbDZbHPRRw1oDAvaRh/fx1287sO/obezfNgc94Rwsfn0r/H4/srKyxiy8RycwXEwjqdC1CAL1e1B1vAOb3yiDY/xklMzYAp/PB5fLlbbK0xEacxsahoq2qx/gs+PNWL28DLMKCa7CXfD7/XA6nXA4HEKARyEiTgEAg2tovbITR0/dwpJFL+LlmWHcs23BgoIC+Hw+Yd4fJxXCFBAIgas7cPLcnyidPRflc4Pod+/B7GnT4Xa704I/0TZkAO40foSzP7UgO/85rHzpIdrVjfB4JsLn88HtdieAWP6ik8CJaLQNL43pQEfjxzh/4QZ0Rz7eWSKjrnMF5pUVIj8/H16vN6VC8xoRwTCMhB4AmGSzPJdA4PPtWFvzSy3u/TsFBzYyXO1airnz5qO0tBROpzMlqLnnnMMwDKiqCk3TwDkH5xwAEJbVKICYkMDlI2x7fwgL2zttOLZvAi63laNkxhzk5ubC6XQKwZKVc86haRoURUEkEkEoFEIkEgUYw4RJXr2y8uB3AOotBC6dXHagtROra1vynqk5kY+Gu8uRNy0PRUVF8Hq9ICJIkvWrbQ7DMKDrOmRZRl/ffTx4cB9Opwu+bB9skg0Hq6pO//D92b1EZJifs+UMVr7Fstd9ejs0r+BQxT/9AaViontSHnJzc+H3++MfG5HyZPWyLCMYDKK7+y4WLXoNU6dmIxqNovLwoR/PVFdvTgYHACycP73bM15S264dGVi1uPjblpYW6u3tpWAwSLIsk6qqpKoqaZpGuq6TruvEOSfOORmGQYZhkK7rFIvFaGBggJqablFDQyOpqkLd3d20fdeuSwCkhN1gaigvL39+ySuFrRuWYg2ALT09PdQ/MEDRaJQURcmIgKZpFA6Hqauri+rq6ikQaB8C372zZixwIsLIFskC4AGwLhQKUTQWI1mW4wQ0TUtLIBQKUSDQTrV19XSns5M2vbv1XDpwIhoqQiJSAaiMsfC4cePi2yaTYIzFX8a5jinZOfyTyqpTZ0+f2ibMeXIk2AGs5JyTmkJxsvK4A7pOwYeD1NzaHnlzw/ovMlE+0pj5dMye/HA6CKAhI+UjmE/7eP4fE3vv5uVsFbYAAAAASUVORK5CYII="

/***/ },

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

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

/***/ },

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

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

/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Crm
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Alexander Stintzing <alex@stintzing.net>
	 * @copyright   Copyright (c) 2009-2012 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.ns('Tine.Crm');
	
	/**
	 * @namespace   Tine.Crm
	 * @class       Tine.Crm.AddToLeadPanel
	 * @extends     Tine.widgets.dialog.AddToRecordPanel
	 * @author      Alexander Stintzing <alex@stintzing.net>
	 */
	Tine.Crm.AddToLeadPanel = Ext.extend(Tine.widgets.dialog.AddToRecordPanel, {
	    // private
	    appName : 'Crm',    
	    recordClass: Tine.Crm.Model.Lead,
	    callingApp: 'Addressbook',
	    callingModel: 'Contact',
	    /**
	     * @see Tine.widgets.dialog.AddToRecordPanel::isValid()
	     */
	    isValid: function() {
	        var valid = true;
	        if(this.searchBox.getValue() == '') {
	            this.searchBox.markInvalid(this.app.i18n._('Please choose the Lead to add the contacts to'));
	            valid = false;
	        }
	        
	        if(this.chooseRoleBox.getValue() == '') {
	            this.chooseRoleBox.markInvalid(this.app.i18n._('Please select the attenders\' role'));
	            valid = false;
	        }
	        
	        return valid;
	    },
	    
	    getRelationConfig: function() {
	        return {
	            type: this.chooseRoleBox.getValue()
	            };
	    },
	    
	    /**
	     * @see Tine.widgets.dialog.AddToRecordPanel::getFormItems()
	     */
	    getFormItems : function() {
	        return {
	            border : false,
	            frame : false,
	            layout : 'border',
	            items : [ {
	                region : 'center',
	                border: false,
	                frame:  false,
	                layout : {
	                    align: 'stretch',
	                    type: 'vbox'
	                },
	                items: [{
	                    layout:  'form',
	                    margins: '10px 10px',
	                    border:  false,
	                    frame:   false,
	                    items: [ 
	                        {
	                            xtype: 'crmleadpickercombobox',
	                            fieldLabel: this.app.i18n._('Lead'),
	                            emptyText: this.app.i18n._('Select Lead'),
	                            anchor : '100% 100%',
	                            ref: '../../../searchBox'
	                        }, {
	                            fieldLabel: this.app.i18n._('Role'),
	                            amptyText: this.app.i18n._('Select Role'),
	                            xtype: 'leadcontacttypecombo',
	                            ref : '../../../chooseRoleBox',
	                            anchor : '100% 100%'
	                    }] 
	                }]
	            }]
	        };
	    }
	});
	
	Tine.Crm.AddToLeadPanel.openWindow = function(config) {
	    var window = Tine.WindowFactory.getWindow({
	        modal: true,
	        title : String.format(Tine.Tinebase.appMgr.get('Crm').i18n._('Adding {0} contacts to lead'), config.count),
	        width : 250,
	        height : 150,
	        contentPanelConstructor : 'Tine.Crm.AddToLeadPanel',
	        contentPanelConstructorConfig : config
	    });
	    return window;
	};


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Crm
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2009-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.ns('Tine.Crm');
	
	/**
	 * @namespace   Tine.Crm
	 * @class       Tine.Crm.AddressbookGridPanelHook
	 * 
	 * <p>Crm Addressbook Hook</p>
	 * <p>
	 * </p>
	 * 
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * 
	 * @constructor
	 */
	Tine.Crm.AddressbookGridPanelHook = Ext.extend(Tine.Addressbook.GenericContactGridPanelHook, {
	    modelName: 'Lead'
	});


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Crm
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2009-2015 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	
	Ext.namespace('Tine.Crm');
	
	/**
	 * admin settings panel
	 * 
	 * @namespace   Tine.Crm
	 * @class       Tine.Crm.AdminPanel
	 * @extends     Tine.widgets.dialog.EditDialog
	 * 
	 * <p>Crm Admin Panel</p>
	 * <p><pre>
	 * TODO         generalize this
	 * TODO         revert/rollback changes onCancel
	 * </pre></p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2009-2015 Metaways Infosystems GmbH (http://www.metaways.de)
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Crm.AdminPanel
	 */
	Tine.Crm.AdminPanel = Ext.extend(Ext.TabPanel, {
	
	    border: false,
	    activeTab: 0,
	
	    /**
	     * @private
	     */
	    initComponent: function() {
	
	        this.app = Tine.Tinebase.appMgr.get('Crm');
	
	        this.items = [
	            new Tine.Admin.config.GridPanel({
	                configApp: this.app
	            })
	
	        ];
	
	        this.supr().initComponent.call(this);
	    }
	});
	
	/**
	 * Crm admin settings popup
	 * 
	 * @param   {Object} config
	 * @return  {Ext.ux.Window}
	 */
	Tine.Crm.AdminPanel.openWindow = function (config) {
	    var id = (config.record && config.record.id) ? config.record.id : 0;
	    var window = Tine.WindowFactory.getWindow({
	        width: 600,
	        height: 470,
	        name: Tine.Crm.AdminPanel.prototype.windowNamePrefix + id,
	        contentPanelConstructor: 'Tine.Crm.AdminPanel',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Crm
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2009-2012 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 * TODO         use Tine.widgets.grid.LinkGridPanel
	 */
	 
	Ext.ns('Tine.Crm.Contact');
	
	/**
	 * @namespace   Tine.Crm.Contact
	 * @class       Tine.Crm.Contact.Combo
	 * @extends     Tine.Addressbook.SearchCombo
	 * 
	 * Lead Dialog Contact Search Combo
	 * 
	 * @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)
	 */
	Tine.Crm.Contact.Combo = Ext.extend(Tine.Addressbook.SearchCombo, {
	
	    valueField: 'id',
	    
	    /**
	     * store to hold all contacts of grid
	     * 
	     * @type Ext.data.Store
	     * @property contactsStore
	     */
	    contactsStore: null,
	    
	    /**
	     * override default onSelect
	     * 
	     * TODO add some logic to determine if contact is customer or partner
	     */
	    onSelect: function(record) {
	        var data = {
	            relation_type: (record.get('type') == 'user') ? 'responsible' : 'customer'
	        };
	        
	        // check if already in
	        if (! this.contactsStore.getById(record.id)) {
	            var recordToAdd = new this.contactsStore.recordType(Ext.apply(data, record.data), record.id);
	            this.contactsStore.add([recordToAdd]);
	        }
	            
	        this.collapse();
	        this.clearValue();
	    }
	});
	
	/**
	 * @namespace   Tine.Crm.Contact
	 * @class       Tine.Crm.Contact.GridPanel
	 * @extends     Ext.grid.EditorGridPanel
	 * 
	 * Lead Dialog Contact Grid Panel
	 * 
	 * <p>
	 * </p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Tine.Crm.Contact.GridPanel = Ext.extend(Ext.grid.EditorGridPanel, {
	    /**
	     * grid config
	     * @private
	     */
	    autoExpandColumn: 'n_fileas',
	    clicksToEdit: 1,
	    baseCls: 'contact-grid',
	    
	    /**
	     * The record currently being edited
	     * 
	     * @type Tine.Crm.Model.Lead
	     * @property record
	     */
	    record: null,
	    
	    /**
	     * store to hold all contacts
	     * 
	     * @type Ext.data.Store
	     * @property store
	     */
	    store: null,
	    
	    /**
	     * @type Ext.Menu
	     * @property contextMenu
	     */
	    contextMenu: null,
	
	    /**
	     * @type Array
	     * @property otherActions
	     */
	    otherActions: null,
	    
	    /**
	     * @type function
	     * @property recordEditDialogOpener
	     */
	    recordEditDialogOpener: null,
	    
	    /**
	     * record class
	     * @cfg {Tine.Addressbook.Model.Contact} recordClass
	     */
	    recordClass: null,
	    
	    /**
	     * @private
	     */
	    initComponent: function() {
	        // init properties
	        this.app = this.app ? this.app : Tine.Tinebase.appMgr.get('Crm');
	        this.recordEditDialogOpener = Tine.Addressbook.ContactEditDialog.openWindow;
	        this.recordClass = Tine.Addressbook.Model.Contact;
	
	        this.storeFields = Tine.Addressbook.Model.ContactArray;
	        this.storeFields.push({name: 'relation'});   // the relation object           
	        this.storeFields.push({name: 'relation_type'});
	        
	        // create delegates
	        this.initStore = Tine.Crm.LinkGridPanel.initStore.createDelegate(this);
	        this.initActions = Tine.Crm.LinkGridPanel.initActions.createDelegate(this);
	        this.initGrid = Tine.Crm.LinkGridPanel.initGrid.createDelegate(this);
	        //this.onUpdate = Tine.Crm.LinkGridPanel.onUpdate.createDelegate(this);
	
	        this.initStore();
	        this.initOtherActions();
	        this.initActions();
	        this.initGrid();
	
	        // add contact type to "add" action
	        this.actionAdd.contactType = 'customer';
	
	        // init store stuff
	        this.store.setDefaultSort('type', 'asc');
	        
	        Tine.Crm.Contact.GridPanel.superclass.initComponent.call(this);
	    },
	    
	    /**
	     * init other actions and tbar (change contact type and contact search combo
	     */
	    initOtherActions: function() {
	        this.actionChangeContactTypeCustomer = new Ext.Action({
	            requiredGrant: 'editGrant',
	            contactType: 'customer',
	            text: this.app.i18n._('Customer'),
	            tooltip: this.app.i18n._('Change type to Customer'),
	            iconCls: 'contactIconCustomer',
	            scope: this,
	            handler: this.onChangeContactType
	        });
	        
	        this.actionChangeContactTypeResponsible = new Ext.Action({
	            requiredGrant: 'editGrant',
	            contactType: 'responsible',
	            text: this.app.i18n._('Responsible'),
	            tooltip: this.app.i18n._('Change type to Responsible'),
	            iconCls: 'contactIconResponsible',
	            scope: this,
	            handler: this.onChangeContactType
	        });
	    
	        this.actionChangeContactTypePartner = new Ext.Action({
	            requiredGrant: 'editGrant',
	            contactType: 'partner',
	            text: this.app.i18n._('Partner'),
	            tooltip: this.app.i18n._('Change type to Partner'),
	            iconCls: 'contactIconPartner',
	            scope: this,
	            handler: this.onChangeContactType
	        });
	        var otherActionItems = [
	           this.actionChangeContactTypeCustomer,
	           this.actionChangeContactTypeResponsible,
	           this.actionChangeContactTypePartner
	        ];
	        this.otherActions = [new Ext.Action({
	            text: this.app.i18n._('Change contact type'),
	            requiredGrant: 'editGrant',
	            disabled: true,
	            menu: otherActionItems
	        })];
	        
	        this.tbar = new Ext.Panel({
	            layout: 'fit',
	            items: [
	                // TODO perhaps we could add an icon/button (i.e. edit-find.png) here
	                new Tine.Crm.Contact.Combo({
	                    contactsStore: this.store,
	                    emptyText: this.app.i18n._('Search for Contacts to add ...')
	                })
	            ]
	        });
	    },
	    
	    /**
	     * @return Ext.grid.ColumnModel
	     * @private
	     */
	    getColumnModel: function() {
	        return new Ext.grid.ColumnModel({
	            defaults: {
	                sortable: true
	            },
	            columns: [            
	                {id:'id', header: "id", dataIndex: 'id', width: 25, hidden: true },
	                {id:'n_fileas', header: this.app.i18n._('Name'), dataIndex: 'n_fileas', width: 200, sortable: true, renderer: 
	                    function(val, meta, record) {
	                        var org_name           = Ext.isEmpty(record.data.org_name) === false ? record.data.org_name : ' ';
	                        var n_fileas           = Ext.isEmpty(record.data.n_fileas) === false ? record.data.n_fileas : ' ';
	                        var formated_return = '<b>' + Ext.util.Format.htmlEncode(n_fileas) + '</b><br />' + Ext.util.Format.htmlEncode(org_name);
	                        
	                        return formated_return;
	                    }
	                },
	                {id:'contact_one', header: this.app.i18n._("Address"), dataIndex: 'adr_one_locality', width: 140, sortable: false, renderer: function(val, meta, record) {
	                        var adr_one_street     = Ext.isEmpty(record.data.adr_one_street) === false ? record.data.adr_one_street : ' ';
	                        var adr_one_postalcode = Ext.isEmpty(record.data.adr_one_postalcode) === false ? record.data.adr_one_postalcode : ' ';
	                        var adr_one_locality   = Ext.isEmpty(record.data.adr_one_locality) === false ? record.data.adr_one_locality : ' ';
	                        var formated_return =  
	                            Ext.util.Format.htmlEncode(adr_one_street) + '<br />' + 
	                            Ext.util.Format.htmlEncode(adr_one_postalcode) + ' ' + Ext.util.Format.htmlEncode(adr_one_locality);
	                    
	                        return formated_return;
	                    }
	                },
	                {id:'tel_work', header: this.app.i18n._("Data"), dataIndex: 'tel_work', width: 140, sortable: false, renderer: function(val, meta, record) {
	                        var translation = new Locale.Gettext();
	                        translation.textdomain('Crm');
	                        var tel_work           = Ext.isEmpty(record.data.tel_work) === false ? translation._('Phone') + ': ' + record.data.tel_work : ' ';
	                        var tel_cell           = Ext.isEmpty(record.data.tel_cell) === false ? translation._('Cellphone') + ': ' + record.data.tel_cell : ' ';
	                        var formated_return = Ext.util.Format.htmlEncode(tel_work) + '<br/>' + Ext.util.Format.htmlEncode(tel_cell) + '<br/>';
	                        return formated_return;
	                    }
	                }, {
	                    id:'relation_type', 
	                    header: this.app.i18n._("Role"), 
	                    dataIndex: 'relation_type', 
	                    width: 60, 
	                    sortable: true,
	                    renderer: Tine.Crm.Contact.typeRenderer,
	                    editor: new Tine.Crm.Contact.TypeComboBox({
	                        autoExpand: true,
	                        blurOnSelect: true,
	                        listClass: 'x-combo-list-small'
	                    })
	                }
	            ]}
	        );
	    },
	    
	    /**
	     * onclick handler for changeContactType
	     */
	    onChangeContactType: function(_button, _event) {
	        var selectedRows = this.getSelectionModel().getSelections();
	        
	        for (var i = 0; i < selectedRows.length; ++i) {
	            selectedRows[i].data.relation_type = _button.contactType;
	        }
	        
	        this.store.fireEvent('dataChanged', this.store);
	    },
	    
	    /**
	     * update event handler for related contacts
	     * 
	     * TODO use generic function?
	     */
	    onUpdate: function(contact) {
	        var response = {
	            responseText: contact
	        };
	        contact = Tine.Addressbook.contactBackend.recordReader(response);
	        
	        Tine.log.debug('Tine.Crm.Contact.GridPanel::onUpdate - Contact has been updated:');
	        Tine.log.debug(contact);
	        
	        // remove contact relations to prevent cyclic relation structure
	        contact.data.relations = null;
	        
	        var myContact = this.store.getById(contact.id);
	        if (myContact) {
	            myContact.beginEdit();
	            for (var p in contact.data) {
	                myContact.set(p, contact.get(p));
	            }
	            myContact.endEdit();
	        } else {
	            contact.data.relation_type = 'customer';
	            this.store.add(contact);
	        }
	    }
	});
	
	/**
	 * @namespace   Tine.Crm.Contact
	 * @class       Tine.Crm.Contact.TypeComboBox
	 * @extends     Ext.form.ComboBox
	 * 
	 * Contact type selection combobox
	 * 
	 * @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)
	 */
	Tine.Crm.Contact.TypeComboBox = Ext.extend(Ext.form.ComboBox, {
	    /**
	     * @cfg {bool} autoExpand Autoexpand comboBox on focus.
	     */
	    autoExpand: false,
	    /**
	     * @cfg {bool} blurOnSelect blurs combobox when item gets selected
	     */
	    blurOnSelect: false,
	    
	    displayField: 'label',
	    valueField: 'relation_type',
	    mode: 'local',
	    triggerAction: 'all',
	    lazyInit: false,
	    forceSelection: true,
	    allowBlank: false,
	    
	    //private
	    initComponent: function() {
	        
	        var translation = new Locale.Gettext();
	        translation.textdomain('Crm');
	        
	        Tine.Crm.Contact.TypeComboBox.superclass.initComponent.call(this);
	        // always set a default
	        if(!this.value) {
	            this.value = 'responsible';
	        }
	            
	        this.store = new Ext.data.SimpleStore({
	            fields: ['label', 'relation_type'],
	            data: [
	                    [translation._('Responsible'), 'responsible'],
	                    [translation._('Customer'), 'customer'],
	                    [translation._('Partner'), 'partner']
	                ]
	        });
	        
	        if (this.autoExpand) {
	            this.lazyInit = false;
	            this.on('focus', function(){
	                this.selectByValue(this.getValue());
	                this.onTriggerClick();
	            });
	        }
	        
	        if (this.blurOnSelect){
	            this.on('select', function(){
	                this.fireEvent('blur', this);
	            }, this);
	        }
	    }
	});
	Ext.reg('leadcontacttypecombo', Tine.Crm.Contact.TypeComboBox);
	
	/**
	 * contact type renderer function
	 * 
	 * @param   string type
	 * @return  contact type icon
	 */
	Tine.Crm.Contact.typeRenderer = function(type)
	{
	    var translation = new Locale.Gettext();
	    translation.textdomain('Crm');
	    
	    switch ( type ) {
	        case 'responsible':
	            var iconClass = 'contactIconResponsible';
	            var qTip = translation._('Responsible');
	            break;
	        case 'customer':
	            var iconClass = 'contactIconCustomer';
	            var qTip = translation._('Customer');
	            break;
	        case 'partner':
	            var iconClass = 'contactIconPartner';
	            var qTip = translation._('Partner');
	            break;
	    }
	    
	    var icon = '<img class="x-menu-item-icon contactIcon ' + iconClass + '" src="library/ExtJS/resources/images/default/s.gif" ext:qtip="' + Ext.util.Format.htmlEncode(qTip) + '"/>';
	    
	    return icon;
	};


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Crm
	 * @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)
	 *
	 */
	 
	Ext.ns('Tine.Crm');
	
	/**
	 * @namespace   Tine.Crm
	 * @class       Tine.Crm.Application
	 * @extends     Tine.Tinebase.Application
	 * Crm Application Object <br>
	 * 
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 */
	Tine.Crm.Application = Ext.extend(Tine.Tinebase.Application, {
	    
	    /**
	     * auto hook text i18n._('New Lead')
	     */
	    addButtonText: 'New Lead',
	    
	    init: function() {
	        Tine.Crm.Application.superclass.init.apply(this, arguments);
	        
	        new Tine.Crm.AddressbookGridPanelHook({app: this});
	    }
	});
	
	/**
	 * @namespace Tine.Crm
	 * @class Tine.Crm.MainScreen
	 * @extends Tine.widgets.MainScreen
	 * MainScreen of the Crm Application <br>
	 * 
	 * @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)
	 * @constructor
	 * Constructs mainscreen of the crm application
	 */
	Tine.Crm.MainScreen = Ext.extend(Tine.widgets.MainScreen, {
	    activeContentType: 'Lead',
	    contentTypes: [
	        {modelName: 'Lead', requiredRight: null, singularContainerMode: false}
	    ]
	});
	
	/**
	 * @namespace Tine.Crm
	 * @class Tine.Crm.TreePanel
	 * @extends Tine.widgets.container.TreePanel
	 * Left Crm Panel including Tree<br>
	 * 
	 * TODO add d&d support to tree
	 * 
	 * @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)
	 */
	Tine.Crm.LeadTreePanel = function(config) {
	    Ext.apply(this, config);
	    
	    this.id = 'CrmLeadTreePanel';
	    this.filterMode = 'filterToolbar';
	    this.recordClass = Tine.Crm.Model.Lead;
	    Tine.Crm.LeadTreePanel.superclass.constructor.call(this);
	};
	
	Ext.extend(Tine.Crm.LeadTreePanel , Tine.widgets.container.TreePanel);
	
	/**
	 * @namespace Tine.Crm
	 * @class Tine.Crm.FilterPanel
	 * @extends Tine.widgets.persistentfilter.PickerPanel
	 * Crm Filter Panel<br>
	 * 
	 * @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)
	 */
	Tine.Crm.LeadFilterPanel = function(config) {
	    config.app.enableAdvancedSearch = true;
	
	    Ext.apply(this, config);
	    Tine.Crm.LeadFilterPanel.superclass.constructor.call(this);
	};
	
	Ext.extend(Tine.Crm.LeadFilterPanel, Tine.widgets.persistentfilter.PickerPanel, {
	    filter: [{field: 'model', operator: 'equals', value: 'Crm_Model_LeadFilter'}]
	});
	
	
	
	/**
	 * @namespace Tine.Crm
	 * @class Tine.Crm.leadBackend
	 * @extends Tine.Tinebase.data.RecordProxy
	 * 
	 * Lead Backend
	 */ 
	Tine.Crm.leadBackend = new Tine.Tinebase.data.RecordProxy({
	    appName: 'Crm',
	    modelName: 'Lead',
	    recordClass: Tine.Crm.Model.Lead
	});
	
	/**
	 * returns ids of ended lead states
	 */
	Tine.Crm.getEndedLeadStateIds = function() {
	    var leadstates = Tine.Tinebase.widgets.keyfield.StoreMgr.get('Crm', 'leadstates');
	    var ids = [];
	    leadstates.each(function(leadstate) {
	        if (leadstate.json.endslead == 1) {
	            ids.push(leadstate.id);
	        }
	    }, this);
	    
	    return ids;
	}


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Crm
	 * @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.Crm');
	
	/**
	 * @namespace   Tine.Crm
	 * @class       Tine.Crm.LeadEditDialog
	 * @extends     Tine.widgets.dialog.EditDialog
	 * 
	 * <p>Lead Edit Dialog</p>
	 * <p>
	 * TODO         simplify relation handling (move init of stores to relation grids and get data from there later?)
	 * TODO         make marking of invalid fields work again
	 * TODO         add export button
	 * TODO         disable link grids if user has no run right for the app (adb/tasks/sales)
	 * </p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Crm.LeadEditDialog
	 */
	Tine.Crm.LeadEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog, {
	    
	    /**
	     * linked contacts grid
	     * 
	     * @type Tine.Crm.Contact.GridPanel
	     * @property contactGrid
	     */
	    contactGrid: null,
	    
	    /**
	     * linked tasks grid
	     * 
	     * @type Tine.Crm.Task.GridPanel
	     * @property tasksGrid
	     */
	    tasksGrid: null,
	    
	    /**
	     * @private
	     */
	    windowNamePrefix: 'LeadEditWindow_',
	    appName: 'Crm',
	    recordClass: Tine.Crm.Model.Lead,
	    recordProxy: Tine.Crm.leadBackend,
	    showContainerSelector: true,
	    displayNotes: true,
	
	    /**
	     * ignore these models in relation grid
	     * @type {Array}
	     */
	    ignoreRelatedModels: ['Sales_Model_Product', 'Addressbook_Model_Contact', 'Tasks_Model_Task'],
	    
	    /**
	     * executed after record got updated from proxy
	     * 
	     * @private
	     */
	    onAfterRecordLoad: function() {
	        Tine.Crm.LeadEditDialog.superclass.onAfterRecordLoad.call(this);
	        // load contacts/tasks/products into link grid (only first time this function gets called/store is empty)
	        if (this.contactGrid && this.tasksGrid && this.productsGrid 
	            && this.contactGrid.store.getCount() == 0 
	            && (! this.tasksGrid.store || this.tasksGrid.store.getCount() == 0) 
	            && (! this.productsGrid.store || this.productsGrid.store.getCount() == 0)) {
	            
	            var relations = this.splitRelations();
	            
	            this.contactGrid.store.loadData(relations.contacts, true);
	            
	            if (this.tasksGrid.store) {
	                this.tasksGrid.store.loadData(relations.tasks, true);
	            }
	            if (this.productsGrid.store) {
	                this.productsGrid.store.loadData(relations.products, true);
	            }
	        }
	    },
	
	    /**
	     * is called from onApplyChanges
	     * @param {Boolean} closeWindow
	     */
	    doApplyChanges: function(closeWindow) {
	        this.getAdditionalData();
	        
	        var relations = [].concat(this.record.get('relations'));
	        this.record.data.relations = relations;
	        
	        Tine.Crm.LeadEditDialog.superclass.doApplyChanges.call(this, closeWindow);
	    },
	    
	    /**
	     * getRelationData
	     * get the record relation data (switch relation and related record)
	     * 
	     * @param   Object record with relation data
	     * @return  Object relation with record data
	     */
	    getRelationData: function(record) {
	        var relation = null;
	        
	        if (record.data.relation) {
	            relation = record.data.relation;
	        } else {
	            // empty relation for new record
	            relation = {};
	        }
	
	        // set the relation type
	        if (!relation.type) {
	            relation.type = record.data.relation_type.toUpperCase();
	        }
	        
	        // do not do recursion!
	        record.data.relation = null;
	        delete record.data.relation;
	        
	        // save record data
	        relation.related_record = record.data;
	        
	        // add remark values
	        relation.remark = {};
	        if (record.data.remark_price) {
	            relation.remark.price = record.data.remark_price;
	        }
	        if (record.data.remark_description) {
	            relation.remark.description = record.data.remark_description;
	        }
	        if (record.data.remark_quantity) {
	            relation.remark.quantity = record.data.remark_quantity;
	        }
	        
	        Tine.log.debug('Tine.Crm.LeadEditDialog::getRelationData() -> relation:');
	        Tine.log.debug(relation);
	        
	        return relation;
	    },
	
	    /**
	     * getAdditionalData
	     * collects additional data (start/end dates, linked contacts, ...)
	     */
	    getAdditionalData: function() {
	        var relations = this.record.get('relations'),
	            grids = [this.contactGrid, this.tasksGrid, this.productsGrid];
	            
	        Ext.each(grids, function(grid) {
	            if (grid.store) {
	                grid.store.each(function(record) {
	                    relations.push(this.getRelationData(record.copy()));
	                }, this);
	            }
	        }, this);
	        
	        this.record.data.relations = relations;
	    },
	    
	    /**
	     * split the relations array in contacts and tasks and switch related_record and relation objects
	     * 
	     * @return {Array}
	     */
	    splitRelations: function() {
	        
	        var contacts = [],
	            tasks = [],
	            products = [];
	        
	        var relations = this.record.get('relations');
	        
	        for (var i=0; i < relations.length; i++) {
	            var newLinkObject = relations[i]['related_record'];
	            relations[i]['related_record']['relation'] = null;
	            delete relations[i]['related_record']['relation'];
	            newLinkObject.relation = relations[i];
	            newLinkObject.relation_type = relations[i]['type'].toLowerCase();
	            
	            if ((newLinkObject.relation_type === 'responsible' 
	              || newLinkObject.relation_type === 'customer' 
	              || newLinkObject.relation_type === 'partner')) {
	                contacts.push(newLinkObject);
	            } else if (newLinkObject.relation_type === 'task') {
	                tasks.push(newLinkObject);
	            } else if (newLinkObject.relation_type === 'product') {
	                newLinkObject.remark_description = (relations[i].remark) ? relations[i].remark.description : '';
	                newLinkObject.remark_price = (relations[i].remark) ? relations[i].remark.price : 0;
	                newLinkObject.remark_quantity = (relations[i].remark) ? relations[i].remark.quantity : 1;
	                products.push(newLinkObject);
	            }
	        }
	        
	        return {
	            contacts: contacts,
	            tasks: tasks,
	            products: products
	        };
	    },
	
	    /**
	     * returns dialog
	     * 
	     * NOTE: when this method gets called, all initalisation is done.
	     * 
	     * @return {Object}
	     * @private
	     */
	    getFormItems: function() {
	        
	        this.combo_probability = new Ext.ux.PercentCombo({
	            fieldLabel: this.app.i18n._('Probability'), 
	            id: 'combo_probability',
	            anchor:'95%',
	            name:'probability'
	        });
	        
	        this.date_end = new Ext.ux.form.ClearableDateField({
	            fieldLabel: this.app.i18n._('End'), 
	            id: 'end',
	            anchor: '95%'
	        });
	        
	        this.contactGrid = new Tine.Crm.Contact.GridPanel({
	            record: this.record,
	            anchor: '100% 98%'
	        });
	
	        if (Tine.Tasks && Tine.Tinebase.common.hasRight('run', 'Tasks')) {
	            this.tasksGrid = new Tine.Crm.Task.GridPanel({
	                record: this.record
	            });
	        } else {
	            this.tasksGrid = new Ext.Panel({
	                title: this.app.i18n._('Tasks'),
	                html: this.app.i18n._('You do not have the run right for the Tasks application or it is not activated.')
	            })
	        }
	        
	        if (Tine.Sales && Tine.Tinebase.common.hasRight('run', 'Sales')) {
	            this.productsGrid = new Tine.Crm.Product.GridPanel({
	                record: this.record
	            });
	        } else {
	            this.productsGrid = new Ext.Panel({
	                title: this.app.i18n._('Products'),
	                html: this.app.i18n._('You do not have the run right for the Sales application or it is not activated.')
	            })
	        }
	
	        // Don't show item if it's a archived source!
	        var sourceStore = Tine.Tinebase.widgets.keyfield.StoreMgr.get('Crm', 'leadsources');
	
	        var preserveRecords = [];
	
	        sourceStore.each(function(record) {
	            preserveRecords.push(record.copy());
	        });
	
	        var copiedStore = new Ext.data.Store({
	            recordType: sourceStore.recordType
	        });
	
	        copiedStore.add(preserveRecords);
	
	        sourceStore.each(function(item) {
	            if (item.json.archived == true) {
	                sourceStore.remove(item);
	            }
	        });
	
	        var setdeffered = function (combo) {
	            var rawValue = parseInt(combo.getRawValue());
	
	            if (Ext.isNumber(rawValue)) {
	                combo.setRawValue(copiedStore.getById(combo.getValue()).get('value'));
	            }
	        };
	
	        return {
	            xtype: 'tabpanel',
	            border: false,
	            plain:true,
	            plugins: [{
	                ptype : 'ux.tabpanelkeyplugin'
	            }],
	            defaults: {
	                hideMode: 'offsets'
	            },
	            activeTab: 0,
	            border: false,
	            items:[{
	                title: this.app.i18n._('Lead'),
	                autoScroll: true,
	                border: true,
	                frame: true,
	                layout: 'border',
	                id: 'editCenterPanel',
	                defaults: {
	                    border: true,
	                    frame: true
	                },
	                items: [{
	                    region: 'center',
	                    layout: 'border',
	                    items: [{
	                        region: 'north',
	                        height: 40,
	                        layout: 'form',
	                        labelAlign: 'top',
	                        defaults: {
	                            anchor: '100%',
	                            labelSeparator: '',
	                            columnWidth: 1
	                        },
	                        items: [{
	                            xtype: 'textfield',
	                            hideLabel: true,
	                            id: 'lead_name',
	                            emptyText: this.app.i18n._('Enter lead name'),
	                            name: 'lead_name',
	                            allowBlank: false,
	                            selectOnFocus: true,
	                            maxLength: 255,
	                            // TODO make this work
	                            listeners: {render: function(field){field.focus(false, 2000);}}
	                        }]
	                    }, {
	                        region: 'center',
	                        layout: 'form',
	                        items: [ this.contactGrid ]
	                    }, {
	                        region: 'south',
	                        height: 390,
	                        split: true,
	                        collapseMode: 'mini',
	                        header: false,
	                        collapsible: true,
	                        items: [{
	                            xtype: 'panel',
	                            layout:'column',
	                            height: 140,
	                            id: 'lead_combos',
	                            anchor:'100%',
	                            labelAlign: 'top',
	                            items: [{
	                                columnWidth: 0.33,
	                                items:[{
	                                    layout: 'form',
	                                    defaults: {
	                                        valueField:'id',
	                                        typeAhead: true,
	                                        mode: 'local',
	                                        triggerAction: 'all',
	                                        editable: false,
	                                        allowBlank: false,
	                                        forceSelection: true,
	                                        anchor:'95%',
	                                        xtype: 'combo'
	                                    },
	                                    items: [new Tine.Tinebase.widgets.keyfield.ComboBox({
	                                        app: 'Crm',
	                                        keyFieldName: 'leadstates',
	                                        fieldLabel: this.app.i18n._('Leadstate'),
	                                        name: 'leadstate_id',
	                                        showIcon: false,
	                                        listeners: {
	                                            'select': function(combo, record, index) {
	                                                if (this.record.json.probability !== null) {
	                                                    this.combo_probability.setValue(record.data.probability);
	                                                }
	                                                if (record.json.endslead == '1') {
	                                                    this.date_end.setValue(new Date());
	                                                }
	                                            },
	                                            scope: this
	                                        }
	                                    }), new Tine.Tinebase.widgets.keyfield.ComboBox({
	                                        app: 'Crm',
	                                        keyFieldName: 'leadtypes',
	                                        fieldLabel: this.app.i18n._('Leadtype'),
	                                        name: 'leadtype_id',
	                                        showIcon: false
	                                    }), new Tine.Tinebase.widgets.keyfield.ComboBox({
	                                        app: 'Crm',
	                                        keyFieldName: 'leadsources',
	                                        fieldLabel: this.app.i18n._('Leadsource'),
	                                        name: 'leadsource_id',
	                                        showIcon: false,
	                                        listeners: {
	                                            scope: this,
	                                            // When loading
	                                            'beforerender': function (combo) {
	                                                setdeffered.defer(5, this, [combo]);
	                                            },
	                                            // When focus changed
	                                            'blur': function(combo) {
	                                                setdeffered.defer(5, this, [combo]);
	                                            }
	                                        }
	                                    })]
	                                }]
	                            }, {
	                                columnWidth: 0.33,
	                                items:[{
	                                    layout: 'form',
	                                    border:false,
	                                    items: [
	                                    {
	                                        xtype:'extuxmoneyfield',
	                                        fieldLabel: this.app.i18n._('Expected turnover'),
	                                        name: 'turnover',
	                                        selectOnFocus: true,
	                                        anchor: '95%',
	                                        minValue: 0
	                                    },  
	                                        this.combo_probability,
	                                        new Ext.ux.form.ClearableDateField({
	                                            fieldLabel: this.app.i18n._('Resubmission Date'), 
	                                            id: 'resubmission_date',
	                                            anchor: '95%'
	                                        })
	                                    ]
	                                }]
	                            }, {
	                                columnWidth: 0.33,
	                                items:[{
	                                    layout: 'form',
	                                    border:false,
	                                    items: [
	                                        new Ext.form.DateField({
	                                            fieldLabel: this.app.i18n._('Start'), 
	                                            allowBlank: false,
	                                            id: 'start',
	                                            anchor: '95%'
	                                        }),
	                                        new Ext.ux.form.ClearableDateField({
	                                            fieldLabel: this.app.i18n._('Estimated end'), 
	                                            id: 'end_scheduled',
	                                            anchor: '95%'
	                                        }),
	                                        this.date_end   
	                                    ]
	                                }]
	                            }]
	                        }, {
	                            xtype: 'tabpanel',
	                            id: 'linkPanelBottom',
	                            activeTab: 0,
	                            height: 250,
	                            items: [
	                                this.tasksGrid,
	                                this.productsGrid
	                            ]
	                        }]
	                    }] // end of center lead panel with border layout
	                    }, {
	                        layout: 'accordion',
	                        animate: true,
	                        region: 'east',
	                        width: 210,
	                        split: true,
	                        collapsible: true,
	                        collapseMode: 'mini',
	                        header: false,
	                        margins: '0 5 0 5',
	                        border: true,
	                        items: [
	                            new Ext.Panel({
	                                title: this.app.i18n._('Description'),
	                                iconCls: 'descriptionIcon',
	                                layout: 'form',
	                                labelAlign: 'top',
	                                border: false,
	                                items: [{
	                                    style: 'margin-top: -4px; border 0px;',
	                                    labelSeparator: '',
	                                    xtype:'textarea',
	                                    name: 'description',
	                                    hideLabel: true,
	                                    grow: false,
	                                    preventScrollbars:false,
	                                    anchor:'100% 100%',
	                                    emptyText: this.app.i18n._('Enter description')
	                                }]
	                            }),
	                            new Tine.widgets.tags.TagPanel({
	                                app: 'Crm',
	                                border: false,
	                                bodyStyle: 'border:1px solid #B5B8C8;'
	                            })
	                        ]} // end of accordion panel (east)
	                    ] // end of lead tabpanel items
	            }, new Tine.widgets.activities.ActivitiesTabPanel({
	                app: this.appName,
	                record_id: this.record.id,
	                record_model: this.appName + '_Model_' + this.recordClass.getMeta('modelName')
	            })] // end of main tabpanel items
	        }; // end of return
	    } // end of getFormItems
	});
	
	/**
	 * Crm Edit Popup
	 * 
	 * @param   {Object} config
	 * @return  {Ext.ux.Window}
	 */
	Tine.Crm.LeadEditDialog.openWindow = function (config) {
	    var id = (config.record && config.record.id) ? config.record.id : 0;
	    var window = Tine.WindowFactory.getWindow({
	        width: 800,
	        height: 750,
	        name: Tine.Crm.LeadEditDialog.prototype.windowNamePrefix + id,
	        contentPanelConstructor: 'Tine.Crm.LeadEditDialog',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Crm
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.namespace('Tine.Crm');
	
	/**
	 * Lead grid panel
	 * 
	 * @namespace   Tine.Crm
	 * @class       Tine.Crm.LeadGridContactFilter
	 * @extends     Tine.widgets.grid.FilterModel
	 * 
	 * <p>Contact Filter for Lead Grid Panel</p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Crm.LeadGridContactFilter
	 */
	Tine.Crm.LeadGridContactFilter = Ext.extend(Tine.widgets.grid.ForeignRecordFilter, {
	    
	    /**
	     * @cfg {Record} foreignRecordClass needed for explicit defined filters
	     */
	    foreignRecordClass : Tine.Addressbook.Model.Contact,
	    
	    /**
	     * @cfg {String} ownField for explicit filterRow
	     */
	    ownField: 'contact',
	    
	    /**
	     * @private
	     */
	    initComponent: function() {
	        this.app = Tine.Tinebase.appMgr.get('Crm');
	        this.label = this.app.i18n._("Contact");
	        
	        Tine.Crm.LeadGridContactFilter.superclass.initComponent.call(this);
	    },
	    
	    getSubFilters: function() {
	        var contactRoleFilter = new Tine.widgets.grid.FilterModel({
	            label: this.app.i18n._('CRM Role'),
	            field: 'relation_type',
	            operators: ['equals'],
	            valueRenderer: function(filter, el) {
	                var value = new Tine.Crm.Contact.TypeComboBox({
	                    filter: filter,
	                    blurOnSelect: true,
	                    width: this.filterValueWidth,
	                    listAlign: 'tr-br',
	                    id: 'tw-ftb-frow-valuefield-' + filter.id,
	                    value: filter.data.value ? filter.data.value : this.defaultValue,
	                    renderTo: el
	                });
	                value.on('specialkey', function(field, e){
	                     if(e.getKey() == e.ENTER){
	                         this.onFiltertrigger();
	                     }
	                }, this);
	                return value;
	            }
	        });
	        
	        return [contactRoleFilter];
	    }
	});
	Tine.widgets.grid.FilterToolbar.FILTERS['crm.contact'] = Tine.Crm.LeadGridContactFilter;


/***/ },

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

	/**
	 * Tine 2.0
	 * 
	 * @package     Crm
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2009-2015 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.namespace('Tine.Crm');
	
	/**
	 * @namespace   Tine.Crm
	 * @class       Tine.Crm.LeadGridDetailsPanel
	 * @extends     Tine.widgets.grid.DetailsPanel
	 * 
	 * <p>Lead Grid Details Panel</p>
	 * <p>
	 * </p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Tine.Crm.LeadGridDetailsPanel = Ext.extend(Tine.widgets.grid.DetailsPanel, {
	    
	    border: false,
	    
	    /**
	     * renders contact names
	     * 
	     * @param {String} type
	     * @return {String}
	     * 
	     * TODO add mail link
	     * TODO all labels should have the same width
	     */
	    contactRenderer: function(type) {
	        
	        var relations = this.record.get('relations');
	        
	        var a = [];
	        var fields = [{
	            label: (type == 'CUSTOMER') ? this.app.i18n._('Customer') : this.app.i18n._('Partner'),
	            dataField: 'n_fileas'
	        }, {
	            label: this.app.i18n._('Phone'),
	            dataField: 'tel_work'
	        }, {
	            label: this.app.i18n._('Mobile'),
	            dataField: 'tel_cell'
	        }, {
	            label: this.app.i18n._('Fax'),
	            dataField: 'tel_fax'
	        }, {
	            label: this.app.i18n._('E-Mail'),
	            dataField: 'email'
	        }, {
	            label: this.app.i18n._('Web'),
	            dataField: 'url'
	        }, {
	            label: this.app.i18n._('Street'),
	            dataField: 'adr_one_street'
	        }, {
	            label: this.app.i18n._('Postalcode'),
	            dataField: 'adr_one_postalcode'
	        }, {
	            label: this.app.i18n._('City'),
	            dataField: 'adr_one_locality'
	        }];
	        var labelMarkup = '<label class="x-form-item x-form-item-label">';
	        
	        if (Ext.isArray(relations) && relations.length > 0) {
	            // get correct relation type from relations (contact) array
	            for (var i = 0; i < relations.length; i++) {
	                if (relations[i].type == type) {
	                    var data = relations[i].related_record;
	                    for (var j=0; j < fields.length; j++) {
	                        if (data[fields[j].dataField]) {
	                            if (fields[j].dataField == 'url') {
	                                a.push(labelMarkup + fields[j].label + ':</label> '
	                                    + '<a href="' + Ext.util.Format.htmlEncode(data[fields[j].dataField]) + '" target="_blank">' 
	                                    + Ext.util.Format.htmlEncode(data[fields[j].dataField]) + '</a>');
	                            } else {
	                                a.push(labelMarkup + fields[j].label + ':</label> '  + Ext.util.Format.htmlEncode(data[fields[j].dataField]));
	                            }
	                        }
	                    }
	                    a.push('');
	                }
	            }
	        }
	        
	        return a.join("\n");
	    },
	
	    /**
	     * inits this component
	     */
	    initComponent: function() {
	        this.app = Tine.Tinebase.appMgr.get('Crm');
	        
	        // define piechart stores
	        this.leadstatePiechartStore = new Ext.data.JsonStore({
	            fields: ['id', 'label', 'total'],
	            id: 'id'
	        });
	        this.leadsourcePiechartStore = new Ext.data.JsonStore({
	            fields: ['id', 'label', 'total'],
	            id: 'id'
	        });
	        this.leadtypePiechartStore = new Ext.data.JsonStore({
	            fields: ['id', 'label', 'total'],
	            id: 'id'
	        });
	        
	        this.supr().initComponent.call(this);
	    },
	    
	    /**
	     * default panel w.o. data
	     * 
	     * @return {Ext.ux.display.DisplayPanel}
	     * 
	     * TODO add something useful here
	     */
	    getDefaultInfosPanel: function() {
	        if (! this.defaultInfosPanel) {
	            this.defaultInfosPanel = new Ext.ux.display.DisplayPanel({
	                layout: 'fit',
	                border: false,
	                items: []
	            });
	        }
	        
	        return this.defaultInfosPanel;
	    },
	
	    /**
	     * get panel for multi selection aggregates/information
	     * 
	     * @return {Ext.Panel}
	     */
	    getMultiRecordsPanel: function() {
	        return this.getDefaultInfosPanel();
	    },
	    
	    /**
	     * main lead details panel
	     * 
	     * @return {Ext.ux.display.DisplayPanel}
	     * 
	     * TODO add tasks / products?
	     * TODO add contact icons?
	     */
	    getSingleRecordPanel: function() {
	        if (! this.singleRecordPanel) {
	            this.singleRecordPanel = new Ext.ux.display.DisplayPanel ({
	                layout: 'fit',
	                border: false,
	                items: [{
	                    layout: 'vbox',
	                    border: false,
	                    layoutConfig: {
	                        align:'stretch'
	                    },
	                    items: [
	                        {
	                        layout: 'hbox',
	                        flex: 0,
	                        height: 16,
	                        border: false,
	                        style: 'padding-left: 5px; padding-right: 5px',
	                        layoutConfig: {
	                            align:'stretch'
	                        },
	                        items: [{
	                            flex: 1,
	                            xtype: 'ux.displayfield',
	                            cls: 'x-ux-display-header',
	                            name: 'lead_name'
	                        }, {
	                            flex: 1,
	                            xtype: 'ux.displayfield',
	                            style: 'text-align: right;',
	                            name: 'container_id',
	                            cls: 'x-ux-display-header',
	                            htmlEncode: false,
	                            renderer: Tine.Tinebase.common.containerRenderer
	                        }]
	                    }, {
	                        layout: 'hbox',
	                        flex: 1,
	                        border: false,
	                        layoutConfig: {
	                            padding:'5',
	                            align:'stretch'
	                        },
	                        defaults:{margins:'0 5 0 0'},
	                        items: [{
	                            flex: 1,
	                            layout: 'ux.display',
	                            labelWidth: 90,
	                            layoutConfig: {
	                                background: 'solid',
	                                declaration: this.app.i18n._('Status')
	                            },
	                            items: [{
	                                xtype: 'ux.displayfield',
	                                name: 'start',
	                                fieldLabel: this.app.i18n._('Start'),
	                                renderer: Tine.Tinebase.common.dateRenderer
	                            }, {
	                                xtype: 'ux.displayfield',
	                                name: 'end_scheduled',
	                                fieldLabel: this.app.i18n._('Estimated end'),
	                                renderer: Tine.Tinebase.common.dateRenderer
	                            }, {
	                                xtype: 'ux.displayfield',
	                                name: 'leadtype_id',
	                                fieldLabel: this.app.i18n._('Leadtype'),
	                                renderer: Tine.Tinebase.widgets.keyfield.Renderer.get('Crm', 'leadtypes')
	                            }, {
	                                xtype: 'ux.displayfield',
	                                name: 'leadsource_id',
	                                fieldLabel: this.app.i18n._('Leadsource'),
	                                renderer: Tine.Tinebase.widgets.keyfield.Renderer.get('Crm', 'leadsources')
	                            }]
	                        }, {
	                            flex: 1,
	                            layout: 'ux.display',
	                            labelAlign: 'top',
	                            autoScroll: true,
	                            layoutConfig: {
	                                background: 'solid'
	                            },
	                            items: [{
	                                xtype: 'ux.displayfield',
	                                name: 'partner',
	                                nl2br: true,
	                                htmlEncode: false,
	                                renderer: this.contactRenderer.createDelegate(this, ['PARTNER'])
	                            }]
	                        }, {
	                            flex: 1,
	                            layout: 'ux.display',
	                            labelAlign: 'top',
	                            autoScroll: true,
	                            layoutConfig: {
	                                background: 'solid'
	                            },
	                            items: [{
	                                xtype: 'ux.displayfield',
	                                name: 'customer',
	                                nl2br: true,
	                                htmlEncode: false,
	                                renderer: this.contactRenderer.createDelegate(this, ['CUSTOMER'])
	                            }]
	                        }, {
	                            flex: 1,
	                            layout: 'fit',
	                            border: false,
	                            items: [{
	                                cls: 'x-ux-display-background-border',
	                                xtype: 'ux.displaytextarea',
	                                name: 'description'
	                            }]
	                        }]
	                    }]
	                }]
	            });
	        }
	        
	        return this.singleRecordPanel
	    },
	    
	    /**
	     * update lead details panel
	     * 
	     * @param {Tine.Tinebase.data.Record} record
	     * @param {Mixed} body
	     */
	    updateDetails: function(record, body) {
	        this.getSingleRecordPanel().loadRecord.defer(100, this.getSingleRecordPanel(), [record]);
	    },
	    
	    /**
	     * show default panel
	     * 
	     * @param {Mixed} body
	     */
	    showDefault: function(body) {
	    },
	    
	    /**
	     * show template for multiple rows
	     * 
	     * @param {Ext.grid.RowSelectionModel} sm
	     * @param {Mixed} body
	     */
	    showMulti: function(sm, body) {
	    }
	});


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Crm
	 * @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.Crm');
	
	/**
	 * Lead grid panel
	 * 
	 * @namespace   Tine.Crm
	 * @class       Tine.Crm.LeadGridPanel
	 * @extends     Tine.widgets.grid.GridPanel
	 * 
	 * <p>Lead Grid Panel</p>
	 * <p><pre>
	 * TODO         add products to grid?
	 * </pre></p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2007-2010 Metaways Infosystems GmbH (http://www.metaways.de)
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Crm.LeadGridPanel
	 */
	Tine.Crm.LeadGridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
	    /**
	     * record class
	     * @cfg {Tine.Crm.Model.Lead} recordClass
	     */
	    recordClass: Tine.Crm.Model.Lead,
	
	    /**
	     * eval grants
	     * @cfg {Boolean} evalGrants
	     */
	    evalGrants: true,
	
	    /**
	     * grid specific
	     * @private
	     */
	    defaultSortInfo: {field: 'lead_name', direction: 'DESC'},
	    gridConfig: {
	        autoExpandColumn: 'title',
	        // drag n drop
	        enableDragDrop: true,
	        ddGroup: 'containerDDGroup'
	    },
	
	
	    /**
	     * returns view row class (scope is this.grid.view)
	     */
	    getViewRowClass: function (record, index, rowParams, store) {
	
	        var className = Tine.Crm.LeadGridPanel.superclass.getViewRowClass(record, index, rowParams, store);
	
	        var now = new Date();
	        if (this.endingLeadStateIds.indexOf(record.get('leadstate_id')) == -1) {
	            var rsd = record.get('resubmission_date');
	            var esd = record.get('end_scheduled');
	            if (((esd && (esd < now)) || (rsd && (rsd < now)))) {
	                className += ' crm-highlight-task';
	            }
	        }
	
	        return className;
	    },
	
	    /**
	     * inits this cmp
	     * @private
	     */
	    initComponent: function () {
	        this.recordProxy = Tine.Crm.leadBackend;
	
	        this.gridConfig.cm = this.getColumnModel();
	
	        this.defaultFilters = [{field: 'leadstate_id', operator: 'notin', value: Tine.Crm.getEndedLeadStateIds()}];
	
	        this.detailsPanel = new Tine.Crm.LeadGridDetailsPanel({
	            grid: this
	        });
	
	        Tine.Crm.LeadGridPanel.superclass.initComponent.call(this);
	
	        this.grid.view.endingLeadStateIds = Tine.Crm.getEndedLeadStateIds();
	    },
	
	    /**
	     * returns cm
	     * 
	     * @return Ext.grid.ColumnModel
	     * @private
	     */
	    getColumnModel: function(){
	        return new Ext.grid.ColumnModel({
	            defaults: {
	                sortable: true
	            },
	            columns: [
	                {header: this.app.i18n._('Tags'), id: 'tags', dataIndex: 'tags', width: 50, renderer: Tine.Tinebase.common.tagsRenderer, sortable: false},
	                {header: this.app.i18n._('Lead name'), id: 'lead_name', dataIndex: 'lead_name', width: 200},
	                {header: this.app.i18n._('Responsible'), id: 'lead_responsible', dataIndex: 'relations', width: 175, sortable: false, hidden: true, renderer: this.responsibleRenderer},
	                {header: this.app.i18n._('Partner'), id: 'lead_partner', dataIndex: 'relations', width: 175, sortable: false, renderer: this.partnerRenderer},
	                {header: this.app.i18n._('Customer'), id: 'lead_customer', dataIndex: 'relations', width: 175, sortable: false, renderer: this.customerRenderer},
	                {header: this.app.i18n._('Leadstate'), id: 'leadstate_id', dataIndex: 'leadstate_id', width: 100, renderer: Tine.Tinebase.widgets.keyfield.Renderer.get('Crm', 'leadstates')},
	                {header: this.app.i18n._('Leadsource'), id: 'leadsource_id', dataIndex: 'leadsource_id', width: 100, renderer: Tine.Tinebase.widgets.keyfield.Renderer.get('Crm', 'leadsources')},
	                {header: this.app.i18n._('Probability'), id: 'probability', dataIndex: 'probability', width: 50, renderer: Ext.ux.PercentRenderer },
	                {header: this.app.i18n._('Turnover'), id: 'turnover', dataIndex: 'turnover', width: 100, renderer: Ext.util.Format.money },
	
	                {header: this.app.i18n._('Estimated end'), id: 'end_scheduled', dataIndex: 'end_scheduled', width: 100, renderer: Tine.Tinebase.common.dateRenderer, sortable: true },
	                {header: this.app.i18n._('Probable Turnover'), id: 'probableTurnover', dataIndex: 'probableTurnover', width: 100, renderer: Ext.util.Format.money, sortable: false },
	                {header: this.app.i18n._('Resubmission Date'), id: 'resubmission_date', dataIndex: 'resubmission_date', width: 100, renderer: Tine.Tinebase.common.dateRenderer, sortable: true }
	                
	            ].concat(this.getModlogColumns().concat(this.getCustomfieldColumns()))
	        });
	    },
	
	    /**
	     * render responsible contact
	     * 
	     * @param {Array} value
	     * @return {String}
	     * 
	     * TODO use another renderer (with email, phone, ...) here?
	     */
	    responsibleRenderer: function(value) {
	        return Tine.Crm.LeadGridPanel.shortContactRenderer(value, 'RESPONSIBLE');
	    },
	    
	    /**
	     * render partner contact
	     * 
	     * @param {Array} value
	     * @return {String}
	     */
	    partnerRenderer: function(value) {
	        return Tine.Crm.LeadGridPanel.shortContactRenderer(value, 'PARTNER');
	    },
	    
	    /**
	     * render customer contact
	     * 
	     * @param {Array} value
	     * @return {String}
	     */
	    customerRenderer: function(value) {
	        return Tine.Crm.LeadGridPanel.shortContactRenderer(value, 'CUSTOMER');
	    },
	
	    /**
	     * @private
	     */
	    initActions: function(){
	        this.actions_import = this.app.featureEnabled('featureLeadImport') ?
	            new Ext.Action({
	                text: this.app.i18n._('Import leads'),
	                disabled: false,
	                handler: this.onImport,
	                iconCls: 'action_import',
	                scope: this,
	                allowMultiple: true
	            }) : false;
	
	        this.supr().initActions.call(this);
	    }
	});
	
	/**
	 * contact column renderer
	 * 
	 * @param       {String} data
	 * @param       {String} type (CUSTOMER|PARTNER)
	 * @return      {String}
	 * 
	 * @namespace   Tine.Crm
	 */
	Tine.Crm.LeadGridPanel.shortContactRenderer = function(data, type) {
	
	    if( Ext.isArray(data) && data.length > 0) {
	        var index = 0;
	        
	        // get correct relation type from data (contact) array and show first matching record (org_name + n_fileas)
	        while (index < data.length && data[index].type != type) {
	            index++;
	        }
	        if (data[index]) {
	            var org = (data[index].related_record.org_name !== null ) ? data[index].related_record.org_name : '';
	            return '<b>' + Ext.util.Format.htmlEncode(org) + '</b><br />' + Ext.util.Format.htmlEncode(data[index].related_record.n_fileas);
	        }
	    }
	};


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Crm
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 * TODO         add to extdoc
	 */
	 
	Ext.ns('Tine.Crm.LinkGridPanel');
	
	/**
	 * @namespace   Tine.Crm.LinkGridPanel
	 * 
	 * TODO         move change contact type functions
	 */
	Tine.Crm.LinkGridPanel.initActions = function() {
	    
	    var app = Tine.Tinebase.appMgr.get(this.recordClass.getMeta('appName'));
	    if (! app) {
	        return;
	    }
	        
	    if (app.i18n) {
	        var recordName = app.i18n.n_(
	            this.recordClass.getMeta('recordName'), this.recordClass.getMeta('recordsName'), 1
	        );
	    } else {
	        var recordName = this.recordClass.getMeta('recordName');
	    }
	
	    var addActionText = app.addButtonText && app.i18n ? app.i18n._hidden(app.addButtonText) : String.format(this.app.i18n._('Add new {0}'), recordName);
	    this.actionAdd = new Ext.Action({
	        requiredGrant: 'editGrant',
	        text: addActionText,
	        tooltip: addActionText,
	        iconCls: 'action_add',
	        disabled: ! (this.record && this.record.get('container_id') 
	            && this.record.get('container_id').account_grants 
	            && this.record.get('container_id').account_grants.editGrant),
	        scope: this,
	        handler: function(_button, _event) {
	            var editWindow = this.recordEditDialogOpener({
	                listeners: {
	                    scope: this,
	                    'update': this.onUpdate
	                }
	            });
	        }
	    });
	    
	    this.actionUnlink = new Ext.Action({
	        requiredGrant: 'editGrant',
	        text: String.format(this.app.i18n._('Unlink {0}'), recordName),
	        tooltip: String.format(this.app.i18n._('Unlink selected {0}'), recordName),
	        disabled: true,
	        iconCls: 'action_remove',
	        onlySingle: true,
	        scope: this,
	        handler: function(_button, _event) {
	            var selectedRows = this.getSelectionModel().getSelections();
	            for (var i = 0; i < selectedRows.length; ++i) {
	                this.store.remove(selectedRows[i]);
	            }           
	        }
	    });
	    
	    this.actionEdit = new Ext.Action({
	        requiredGrant: 'editGrant',
	        text: String.format(this.app.i18n._('Edit {0}'), recordName),
	        tooltip: String.format(this.app.i18n._('Edit selected {0}'), recordName),
	        disabled: true,
	        iconCls: 'actionEdit',
	        onlySingle: true,
	        scope: this,
	        handler: function(_button, _event) {
	            var selectedRows = this.getSelectionModel().getSelections();
	            var record = selectedRows[0];
	            // unset record id for new records
	            if (record.phantom) {
	                record.id = 0;
	            }
	            var editWindow = this.recordEditDialogOpener({
	                record: record,
	                listeners: {
	                    scope: this,
	                    'update': this.onUpdate
	                }
	            });
	        }
	    });
	
	    // init toolbars and ctx menut / add actions
	    this.bbar = [                
	        this.actionAdd,
	        this.actionUnlink
	    ];
	    
	    this.actions = [
	        this.actionEdit,
	        this.actionUnlink
	    ];
	    
	    if (this.otherActions) {
	        this.actions = this.actions.concat(this.otherActions);
	    }
	
	    this.contextMenu = new Ext.menu.Menu({
	        items: this.actions.concat(['-', this.actionAdd]),
	        plugins: [{
	            ptype: 'ux.itemregistry',
	            key:   'Tinebase-MainContextMenu'
	        }]
	    });
	    
	    this.actions.push(this.actionAdd);
	};
	
	/**
	 * init store
	 * 
	 */ 
	Tine.Crm.LinkGridPanel.initStore = function() {
	    
	    this.store = new Ext.data.JsonStore({
	        fields: (this.storeFields) ? this.storeFields : this.recordClass
	    });
	
	    // focus+select new record
	    this.store.on('add', function(store, records, index) {
	        (function() {
	            if (this.rendered) {
	                this.getView().focusRow(index);
	                this.getSelectionModel().selectRow(index);
	            }
	        }).defer(300, this);
	    }, this);
	};
	
	/**
	 * init ext grid panel
	 * 
	 * TODO         add grants for linked entries to disable EDIT?
	 */
	Tine.Crm.LinkGridPanel.initGrid = function() {
	    this.cm = this.getColumnModel();
	    
	    this.selModel = new Ext.grid.RowSelectionModel({multiSelect:true});
	    this.enableHdMenu = false;
	    this.plugins = this.plugins || [];
	    this.plugins.push(new Ext.ux.grid.GridViewMenuPlugin({}));
	
	    // on selectionchange handler
	    this.selModel.on('selectionchange', function(sm) {
	        var rowCount = sm.getCount();
	        var selectedRows = this.getSelectionModel().getSelections();
	        if (selectedRows.length > 0) {
	            var selectedRecord = selectedRows[0];
	        }
	        if (this.record && (this.record.get('container_id') && this.record.get('container_id').account_grants)) {
	            for (var i=0; i < this.actions.length; i++) {
	                this.actions[i].setDisabled(
	                    ! this.record.get('container_id').account_grants.editGrant 
	                    || (this.actions[i].initialConfig.onlySingle && rowCount != 1)
	                    || (this.actions[i] == this.actionEdit && selectedRecord && selectedRecord.phantom == true)
	                );
	            }
	        }
	        
	    }, this);
	    
	    // on rowcontextmenu handler
	    this.on('rowcontextmenu', function(grid, row, e) {
	        e.stopEvent();
	        var selModel = grid.getSelectionModel();
	        if(!selModel.isSelected(row)) {
	            selModel.selectRow(row);
	        }
	        
	        this.contextMenu.showAt(e.getXY());
	    }, this);
	    
	    // doubleclick handler
	    this.on('rowdblclick', function(grid, row, e) {
	        var selectedRows = grid.getSelectionModel().getSelections();
	        record = selectedRows[0];
	        if (! record.phantom && this.recordEditDialogOpener != Ext.emptyFn) {
	            var editWindow = this.recordEditDialogOpener({
	                record: record,
	                listeners: {
	                    scope: this,
	                    'update': this.onUpdate
	                }
	            });
	        }
	    }, this);
	};


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Crm
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2007-2010 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.namespace('Tine.Crm', 'Tine.Crm.Model');
	
	/**
	 * @namespace Tine.Crm.Model
	 * @class Tine.Crm.Model.Lead
	 * @extends Tine.Tinebase.data.Record
	 * 
	 * Lead Record Definition
	 */ 
	Tine.Crm.Model.Lead = Tine.Tinebase.data.Record.create(Tine.Tinebase.Model.genericFields.concat([
	        {name: 'id',            type: 'string', omitDuplicateResolving: true},
	        {name: 'lead_name',     type: 'string', label: 'Lead name', group: 'Lead'},
	        {name: 'leadstate_id',  type: 'int', omitDuplicateResolving: true},
	        {name: 'leadtype_id',   type: 'int', omitDuplicateResolving: true},
	        {name: 'leadsource_id', type: 'int', omitDuplicateResolving: true},
	        {name: 'start',         type: 'date', dateFormat: Date.patterns.ISO8601Long, label: 'Start', group: 'Lead'},
	        {name: 'description',   type: 'string', label: 'Description', group: 'Lead'},
	        {name: 'end',           type: 'date', dateFormat: Date.patterns.ISO8601Long, label: 'End', group: 'Lead'},
	        {name: 'turnover',      type: 'float', omitDuplicateResolving: true},
	        {name: 'probability',   type: 'int', omitDuplicateResolving: true},
	        {name: 'probableTurnover',   type: 'int', omitDuplicateResolving: true},
	        {name: 'end_scheduled', type: 'date', dateFormat: Date.patterns.ISO8601Long, omitDuplicateResolving: true},
	        {name: 'resubmission_date', type: 'date', dateFormat: Date.patterns.ISO8601Long, omitDuplicateResolving: true},
	
	        {name: 'lastread', omitDuplicateResolving: true},
	        {name: 'lastreader', omitDuplicateResolving: true},
	        {name: 'responsible', omitDuplicateResolving: true},
	        {name: 'customer', omitDuplicateResolving: true, label: 'Customer', group: 'Relationen'},
	        {name: 'partner', omitDuplicateResolving: true, label: 'Partner', group: 'Relationen'},
	        {name: 'tasks', omitDuplicateResolving: true},
	        {name: 'relations', label: 'Relationen', group: 'Relationen'},
	        {name: 'products', omitDuplicateResolving: true, label: 'Products', group: 'Relationen'},
	        {name: 'tags', label: 'Tags'},
	        {name: 'notes', omitDuplicateResolving: true},
	        {name: 'customfields', omitDuplicateResolving: true},
	        {name: 'attachments', omitDuplicateResolving: true}
	    ]), {
	    appName: 'Crm',
	    modelName: 'Lead',
	    idProperty: 'id',
	    titleProperty: 'lead_name',
	    // ngettext('Lead', 'Leads', n);
	    recordName: 'Lead',
	    recordsName: 'Leads',
	    containerProperty: 'container_id',
	    // ngettext('lead list', 'lead lists', n); gettext('lead lists');
	    containerName: 'lead list',
	    containersName: 'lead lists',
	    getTitle: function() {
	        return this.get('lead_name') ? this.get('lead_name') : false;
	    }
	});
	
	/**
	 * @namespace Tine.Crm.Model
	 * 
	 * get default data for a new lead
	 *  
	 * @return {Object} default data
	 * @static
	 */
	Tine.Crm.Model.Lead.getDefaultData = function() {
	    
	    var app = Tine.Tinebase.appMgr.get('Crm');
	    
	    var data = {
	        start: new Date().clearTime(),
	        container_id: app.getMainScreen().getWestPanel().getContainerTreePanel().getDefaultContainer(),
	        probability: 0,
	        turnover: 0,
	        relations: [{
	            type: 'RESPONSIBLE',
	            related_record: Tine.Tinebase.registry.get('userContact')
	        }]
	    };
	    
	    return data;
	};
	
	/**
	 * get filtermodel of lead model
	 * 
	 * @namespace Tine.Crm.Model
	 * @static
	 * @return {Array} filterModel definition
	 */ 
	Tine.Crm.Model.Lead.getFilterModel = function() {
	    var app = Tine.Tinebase.appMgr.get('Crm'),
	        filters = [
	            {label: i18n._('Quick Search'),  field: 'query',    operators: ['contains']},
	            {filtertype: 'tine.widget.container.filtermodel', app: app, recordClass: Tine.Crm.Model.Lead},
	            {label: app.i18n._('Lead name'),   field: 'lead_name' },
	            {
	                label: app.i18n._('Leadstate'),
	                field: 'leadstate_id',
	                filtertype: 'tine.widget.keyfield.filter',
	                app: app,
	                keyfieldName: 'leadstates'
	            },
	            {label: app.i18n._('Probability'), field: 'probability', valueType: 'percentage'},
	            {
	                label: app.i18n._('Leadsource'),
	                field: 'leadsource_id',
	                filtertype: 'tine.widget.keyfield.filter',
	                app: app,
	                keyfieldName: 'leadsources'
	            },
	            {label: app.i18n._('Turnover'),    field: 'turnover', valueType: 'number', defaultOperator: 'greater'},
	            {filtertype: 'tinebase.tag', app: app},
	            {label: i18n._('Last Modified Time'),                                                field: 'last_modified_time', valueType: 'date'},
	            {label: i18n._('Last Modified By'),                                                  field: 'last_modified_by',   valueType: 'user'},
	            {label: i18n._('Creation Time'),                                                     field: 'creation_time',      valueType: 'date'},
	            {label: i18n._('Created By'),                                                        field: 'created_by',         valueType: 'user'},
	            
	            {label: app.i18n._('Estimated end'), field: 'end_scheduled', valueType: 'date'},
	            {label: app.i18n._('Resubmission Date'), field: 'resubmission_date', valueType: 'date'},
	            
	            {filtertype: 'crm.contact'},
	            {filtertype: 'foreignrecord', app: app, foreignRecordClass: Tine.Tasks.Model.Task, ownField: 'task'}
	        ];
	        
	    if (Tine.Sales && Tine.Tinebase.common.hasRight('run', 'Sales')) {
	        filters.push({filtertype: 'foreignrecord', 
	            app: app,
	            foreignRecordClass: Tine.Sales.Model.Product,
	            ownField: 'product'
	        });
	    }
	    
	    return filters;
	}
	
	// custom keyFieldRecord
	Tine.Crm.Model.LeadState = Tine.Tinebase.data.Record.create([
	    { name: 'id' },
	    { name: 'value' },
	    { name: 'system' },
	    { name: 'probability', label: 'Probability', type: 'percentage' }, // i18n._('Probability')
	    { name: 'endslead', label: 'X Lead', type: 'bool'} // i18n._('X Lead')
	], {
	    appName: 'Crm',
	    modelName: 'LeadState',
	    idProperty: 'id',
	    titleProperty: 'value'
	});
	
	// custom keyFieldRecord
	Tine.Crm.Model.LeadSource = Tine.Tinebase.data.Record.create([
	    { name: 'id' },
	    { name: 'value' },
	    { name: 'system' },
	    { name: 'archived', label: 'Archived', type: 'bool' } // i18n._('Archived')
	], {
	    appName: 'Crm',
	    modelName: 'LeadSource',
	    idProperty: 'id',
	    titleProperty: 'value'
	});
	
	Tine.Crm.Model.getRandomUnusedId = function(store) {
	    var result;
	    do {
	        result = Tine.Tinebase.common.getRandomNumber(0, 21474836);
	    } while (store.getById(result) != undefined)
	    
	    return result;
	};


/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Crm
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2009-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 * TODO         use Tine.widgets.grid.LinkGridPanel
	 */
	 
	Ext.ns('Tine.Crm.Product');
	
	/**
	 * @namespace   Tine.Crm.Product
	 * @class       Tine.Crm.Product.GridPanel
	 * @extends     Ext.grid.EditorGridPanel
	 * 
	 * Lead Dialog Products Grid Panel
	 * 
	 * <p>
	 * TODO         allow multiple relations with 1 product or add product quantity?
	 * TODO         check if we need edit/add actions again
	 * TODO         make resizing work correctly
	 * </p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Tine.Crm.Product.GridPanel = Ext.extend(Ext.grid.EditorGridPanel, {
	    /**
	     * grid config
	     * @private
	     */
	    autoExpandColumn: 'name',
	    clicksToEdit: 1,
	    
	    /**
	     * The record currently being edited
	     * 
	     * @type Tine.Crm.Model.Lead
	     * @property record
	     */
	    record: null,
	    
	    /**
	     * store to hold all contacts
	     * 
	     * @type Ext.data.Store
	     * @property store
	     */
	    store: null,
	    
	    /**
	     * @type Ext.Menu
	     * @property contextMenu
	     */
	    contextMenu: null,
	
	    /**
	     * @type Array
	     * @property otherActions
	     */
	    otherActions: null,
	    
	    /**
	     * @type function
	     * @property recordEditDialogOpener
	     */
	    recordEditDialogOpener: null,
	
	    /**
	     * record class
	     * @cfg {Tine.Sales.Model.Product} recordClass
	     */
	    recordClass: null,
	    
	    /**
	     * @private
	     */
	    initComponent: function() {
	        // init properties
	        this.app = this.app ? this.app : Tine.Tinebase.appMgr.get('Crm');
	        this.title = this.app.i18n._('Products');
	        //this.recordEditDialogOpener = Tine.Products.EditDialog.openWindow;
	        this.recordEditDialogOpener = Ext.emptyFn;
	        this.recordClass = Tine.Sales.Model.Product;
	        
	        this.storeFields = Tine.Sales.Model.ProductArray;
	        this.storeFields.push({name: 'relation'});   // the relation object           
	        this.storeFields.push({name: 'relation_type'});
	        this.storeFields.push({name: 'remark_price'});
	        this.storeFields.push({name: 'remark_description'});
	        this.storeFields.push({name: 'remark_quantity'});
	        
	        // create delegates
	        this.initStore = Tine.Crm.LinkGridPanel.initStore.createDelegate(this);
	        //this.initActions = Tine.Crm.LinkGridPanel.initActions.createDelegate(this);
	        this.initGrid = Tine.Crm.LinkGridPanel.initGrid.createDelegate(this);
	        //this.onUpdate = Tine.Crm.LinkGridPanel.onUpdate.createDelegate(this);
	        this.onUpdate = Ext.emptyFn;
	
	        // call delegates
	        this.initStore();
	        this.initActions();
	        this.initGrid();
	        
	        // init store stuff
	        this.store.setDefaultSort('name', 'asc');
	        
	        this.on('newentry', function(productData){
	            // add new product to store
	            var newProduct = [productData];
	            this.store.loadData(newProduct, true);
	            
	            return true;
	        }, this);
	        
	        Tine.Crm.Product.GridPanel.superclass.initComponent.call(this);
	    },
	    
	    /**
	     * @return Ext.grid.ColumnModel
	     * @private
	     */
	    getColumnModel: function() {
	        return new Ext.grid.ColumnModel({
	            defaults: {
	                sortable: true
	            },
	            columns: [
	            {
	                header: this.app.i18n._("Product"),
	                id: 'name',
	                dataIndex: 'name',
	                width: 150
	            }, {
	                header: this.app.i18n._("Description"),
	                id: 'remark_description',
	                dataIndex: 'remark_description',
	                width: 150,
	                editor: new Ext.form.TextField({
	                })
	            }, {
	                header: this.app.i18n._("Price"),
	                id: 'remark_price',
	                dataIndex: 'remark_price',
	                width: 150,
	                editor: new Ext.form.NumberField({
	                    allowBlank: false,
	                    allowNegative: false,
	                    // TODO hardcode separator or get it from locale?
	                    decimalSeparator: ','
	                }),
	                renderer: Ext.util.Format.money
	            }, {
	                header: this.app.i18n._("Quantity"),
	                id: 'remark_quantity',
	                dataIndex: 'remark_quantity',
	                width: 50,
	                editor: new Ext.form.NumberField({
	                    allowBlank: false,
	                    allowNegative: false
	                })
	            }]
	        });
	    },
	    
	    /**
	     * init actions and bars
	     */
	    initActions: function() {
	        
	        var app = Tine.Tinebase.appMgr.get(this.recordClass.getMeta('appName'));
	        if (! app) {
	            return;
	        }        
	        var recordName = app.i18n.n_(
	            this.recordClass.getMeta('recordName'), this.recordClass.getMeta('recordsName'), 1
	        );
	
	        this.actionUnlink = new Ext.Action({
	            requiredGrant: 'editGrant',
	            text: String.format(this.app.i18n._('Unlink {0}'), recordName),
	            tooltip: String.format(this.app.i18n._('Unlink selected {0}'), recordName),
	            disabled: true,
	            iconCls: 'action_remove',
	            onlySingle: true,
	            scope: this,
	            handler: function(_button, _event) {
	                var selectedRows = this.getSelectionModel().getSelections();
	                for (var i = 0; i < selectedRows.length; ++i) {
	                    this.store.remove(selectedRows[i]);
	                }
	            }
	        });
	        
	        // init toolbars and ctx menut / add actions
	        this.bbar = [                
	            this.actionUnlink
	        ];
	        
	        this.actions = [
	            this.actionUnlink
	        ];
	        
	        this.contextMenu = new Ext.menu.Menu({
	            items: this.actions,
	            plugins: [{
	                ptype: 'ux.itemregistry',
	                key:   'Tinebase-MainContextMenu'
	            }]
	        });
	
	        this.tbar = new Ext.Panel({
	            layout: 'fit',
	            items: [
	                new Tine.Crm.ProductPickerCombo({
	                    anchor: '90%',
	                    emptyText: this.app.i18n._('Search for Products to add ...'),
	                    productsStore: this.store,
	                    blurOnSelect: true,
	                    recordClass: Tine.Sales.Model.Product,
	                    getValue: function() {
	                        return this.selectedRecord ? this.selectedRecord.data : null;
	                    },
	                    onSelect: function(record){
	                        // check if already in?
	                        if (! this.productsStore.getById(record.id)) {
	                            var newRecord = new Ext.data.Record({
	                                price: record.data.price,
	                                remark_price: record.data.price,
	                                remark_quantity: 1,
	                                name: record.data.name,
	                                relation_type: 'product',
	                                related_id: record.id,
	                                id: record.id
	                            }, record.id);
	                            this.productsStore.insert(0, newRecord);
	                        }
	                        
	                        this.collapse();
	                        this.clearValue();
	                    }
	                })
	            ]
	        });
	    }    
	});


/***/ },

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

	/* 
	 * Tine 2.0
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Michael Spahn <kontakt@michaelspahn.de>
	 * @copyright   Copyright (c) 2015 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Crm');
	
	Tine.Crm.ProductPickerCombo = Ext.extend(Tine.Tinebase.widgets.form.RecordPickerComboBox, {
	    initComponent: function() {
	        Tine.Crm.ProductPickerCombo.superclass.initComponent.apply(this, arguments);
	    },
	
	    onBeforeLoad: function (store, options) {
	        Tine.Crm.ProductPickerCombo.superclass.onBeforeLoad.apply(this, arguments);
	        store.baseParams.filter.push({field: 'is_active', operator: 'equals', value: true});
	    }
	});
	
	Tine.widgets.form.RecordPickerManager.register('Crm', 'Product', Tine.Crm.ProductPickerCombo);

/***/ },

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

	/*
	 * Tine 2.0
	 * Crm combo box and store
	 * 
	 * @package     Crm
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Alexander Stintzing <alex@stintzing.net>
	 * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	
	Ext.ns('Tine.Crm');
	
	/**
	 * Lead selection combo box
	 * 
	 * @namespace   Tine.Crm
	 * @class       Tine.Crm.SearchCombo
	 * @extends     Tine.Tinebase.widgets.form.RecordPickerComboBox
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Alexander Stintzing <alex@stintzing.net>
	 * @copyright   Copyright (c) 2007-2012 Metaways Infosystems GmbH (http://www.metaways.de)
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Crm.SearchCombo
	 */
	Tine.Crm.SearchCombo = Ext.extend(Tine.Tinebase.widgets.form.RecordPickerComboBox, {
	    
	    allowBlank: false,
	    itemSelector: 'div.search-item',
	    minListWidth: 200,
	    
	    //private
	    initComponent: function(){
	        this.recordClass = Tine.Crm.Model.Lead;
	        this.recordProxy = Tine.Crm.recordBackend;
	        
	        this.initTemplate();
	        
	        Tine.Crm.SearchCombo.superclass.initComponent.call(this);
	        
	        this.displayField = 'lead_name';
	        
	    },
	    
	    /**
	     * init template
	     * @private
	     */
	    initTemplate: function() {
	        if (! this.tpl) {
	            this.tpl = new Ext.XTemplate(
	                '<tpl for="."><div class="search-item">',
	                    '{[this.encode(values)]}',
	                '</div></tpl>',
	                {
	                    encode: function(values) {
	                        return Ext.util.Format.htmlEncode(values.lead_name);
	                        
	                    }
	                }
	            );
	        }
	    },
	    
	    getValue: function() {
	            return Tine.Crm.SearchCombo.superclass.getValue.call(this);
	    },
	
	    setValue: function (value) {
	        return Tine.Crm.SearchCombo.superclass.setValue.call(this, value);
	    }
	
	});
	
	Ext.reg('crmleadpickercombobox', Tine.Crm.SearchCombo);
	Tine.widgets.form.RecordPickerManager.register('Crm', 'Lead', 'crmleadpickercombobox');

/***/ },

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

	/*
	 * Tine 2.0
	 * 
	 * @package     Crm
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2009-2012 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 * TODO         use Tine.widgets.grid.LinkGridPanel
	 */
	 
	Ext.ns('Tine.Crm.Task');
	
	/**
	 * @namespace   Tine.Crm
	 * @class       Tine.Crm.Task.GridPanel
	 * @extends     Ext.ux.grid.QuickaddGridPanel
	 * 
	 * Lead Dialog Tasks Grid Panel
	 * 
	 * <p>
	 * </p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 */
	Tine.Crm.Task.GridPanel = Ext.extend(Ext.ux.grid.QuickaddGridPanel, {
	    /**
	     * grid config
	     * @private
	     */
	    quickaddMandatory: 'summary',
	    clicksToEdit: 1,
	    enableColumnHide:false,
	    enableColumnMove:false,
	    
	    /**
	     * The record currently being edited
	     * 
	     * @type Tine.Crm.Model.Lead
	     * @property record
	     */
	    record: null,
	
	    /**
	     * store to hold all contacts
	     * 
	     * @type Ext.data.Store
	     * @property store
	     */
	    store: null,
	    
	    /**
	     * @type Ext.Menu
	     * @property contextMenu
	     */
	    contextMenu: null,
	
	    /**
	     * @type Array
	     * @property otherActions
	     */
	    otherActions: null,
	    
	    /**
	     * @type function
	     * @property recordEditDialogOpener
	     */
	    recordEditDialogOpener: null,
	
	    /**
	     * record class
	     * @cfg {Tine.Tasks.Model.Task} recordClass
	     */
	    recordClass: null,
	    
	    /**
	     * @private
	     */
	    initComponent: function() {
	        // init properties
	        this.app = this.app ? this.app : Tine.Tinebase.appMgr.get('Crm');
	        this.title = this.app.i18n._('Tasks');
	        this.recordEditDialogOpener = Tine.Tasks.TaskEditDialog.openWindow;
	        this.recordClass = Tine.Tasks.Model.Task;
	        
	        this.storeFields = Tine.Tasks.Model.TaskArray;
	        this.storeFields.push({name: 'relation'});   // the relation object
	        this.storeFields.push({name: 'relation_type'});
	        
	        // create delegates
	        this.initStore = Tine.Crm.LinkGridPanel.initStore.createDelegate(this);
	        this.initActions = Tine.Crm.LinkGridPanel.initActions.createDelegate(this);
	        this.initGrid = Tine.Crm.LinkGridPanel.initGrid.createDelegate(this);
	        //this.onUpdate = Tine.Crm.LinkGridPanel.onUpdate.createDelegate(this);
	
	        // call delegates
	        this.initStore();
	        this.initActions();
	        this.initGrid();
	        
	        // init store stuff
	        this.store.setDefaultSort('due', 'asc');
	        
	        this.view = new Ext.grid.GridView({
	            emptyText: this.app.i18n._('No Tasks to display'),
	            onLoad: Ext.emptyFn,
	            listeners: {
	                beforerefresh: function(v) {
	                    v.scrollTop = v.scroller.dom.scrollTop;
	                },
	                refresh: function(v) {
	                    v.scroller.dom.scrollTop = v.scrollTop;
	                }
	            }
	        });
	        
	        this.on('afteredit', this.onAfterEdit);
	        
	        this.on('newentry', function(taskData){
	            var newTask = taskData;
	            newTask.relation_type = 'task';
	            
	            // get first responsible person and add it to task as organizer
	            var i = 0;
	            while (this.record.data.relations.length > i && this.record.data.relations[i].type != 'responsible') {
	                i++;
	            }
	            if (! newTask.organizer) {
	                if (this.record.data.relations[i] && this.record.data.relations[i].type == 'responsible' && this.record.data.relations[i].related_record.account_id != '') {
	                    newTask.organizer = Tine.Tinebase.registry.get('currentAccount');
	                }
	            } else {
	                var contactRecord = this.organizerQuickAdd.selectedRecord;
	                
	                if (contactRecord) {
	                    var organizer = {
	                        accountId: contactRecord.get('account_id'),
	                        accountDisplayName: contactRecord.get('n_fileas')
	                    };
	                    newTask.organizer = organizer;
	                }
	            }
	            
	            // add new task to store
	            this.store.loadData([newTask], true);
	            
	            return true;
	        }, this);
	        
	        // hack to get percentage editor working
	        this.on('rowclick', function(grid,row,e) {
	            var cell = Ext.get(grid.getView().getCell(row,1));
	            var dom = cell.child('div:last');
	            while (cell.first()) {
	                cell = cell.first();
	                cell.on('click', function(e){
	                    e.stopPropagation();
	                    grid.fireEvent('celldblclick', grid, row, 1, e);
	                });
	            }
	        }, this);
	        
	        Tine.Crm.Task.GridPanel.superclass.initComponent.call(this);
	    },
	    
	    /**
	     * is called on after edit to set related records
	     * @param {} o
	     */
	    onAfterEdit: function(o) {
	        if (o.field == 'organizer') {
	            var contactRecord = this.organizerEditor.selectedRecord;
	            
	            if (contactRecord) {
	                var organizer = {
	                    accountId: contactRecord.get('account_id'),
	                    accountDisplayName: contactRecord.get('n_fileas')
	                };
	                
	                o.record.set('organizer', organizer);
	            } else {
	                if (o.originalValue.accountId == o.value) {
	                    o.record.set('organizer', o.originalValue);
	                }
	            }
	        }
	    },
	    
	    
	    /**
	     * @return Ext.grid.ColumnModel
	     * @private
	     */
	    getColumnModel: function() {
	        
	        this.organizerQuickAdd = Tine.widgets.form.RecordPickerManager.get('Addressbook', 'Contact', {
	            userOnly: true,
	            useAccountRecord: true,
	            scope: this,
	            allowBlank: true
	        });
	        
	        this.organizerEditor = Tine.widgets.form.RecordPickerManager.get('Addressbook', 'Contact', {
	            userOnly: true,
	            useAccountRecord: true,
	            scope: this
	        });
	        
	        return new Ext.grid.ColumnModel({
	            defaults: {
	                sortable: true
	            },
	            columns: [
	                 {
	                    id: 'summary',
	                    header: this.app.i18n._("Summary"),
	                    width: 150,
	                    dataIndex: 'summary',
	                    quickaddField: new Ext.form.TextField({
	                        emptyText: this.app.i18n._('Add a task...')
	                    })
	                }, {
	                    id: 'due',
	                    header: this.app.i18n._("Due Date"),
	                    width: 110,
	                    dataIndex: 'due',
	                    renderer: Tine.Tinebase.common.dateRenderer,
	                    editor: new Ext.ux.form.ClearableDateField({
	                        //format : 'd.m.Y'
	                    }),
	                    quickaddField: new Ext.ux.form.ClearableDateField({
	                        //value: new Date(),
	                        //format : "d.m.Y"
	                    })
	                }, {
	                    id: 'priority',
	                    header: this.app.i18n._("Priority"),
	                    width: 80,
	                    dataIndex: 'priority',
	                    renderer: Tine.Tinebase.widgets.keyfield.Renderer.get('Tasks', 'taskPriority'),
	                    editor: {
	                        xtype: 'widget-keyfieldcombo',
	                        app: 'Tasks',
	                        keyFieldName: 'taskPriority'
	                    },
	                    quickaddField: new Tine.Tinebase.widgets.keyfield.ComboBox({
	                        app: 'Tasks',
	                        keyFieldName: 'taskPriority',
	                        value: 'NORMAL'
	                    })
	                }, {
	                    id: 'percent',
	                    header: this.app.i18n._("Percent"),
	                    width: 80,
	                    dataIndex: 'percent',
	                    renderer: Ext.ux.PercentRenderer,
	                    editor: new Ext.ux.PercentCombo({
	                        autoExpand: true,
	                        blurOnSelect: true
	                    }),
	                    quickaddField: new Ext.ux.PercentCombo({
	                        autoExpand: true
	                    })
	                }, {
	                    id: 'status',
	                    header: this.app.i18n._("Status"),
	                    width: 92,
	                    dataIndex: 'status',
	                    renderer: Tine.Tinebase.widgets.keyfield.Renderer.get('Tasks', 'taskStatus'),
	                    editor: {
	                        xtype: 'widget-keyfieldcombo',
	                        app: 'Tasks',
	                        keyFieldName: 'taskStatus'
	                    },
	                    quickaddField: new Tine.Tinebase.widgets.keyfield.ComboBox({
	                        app: 'Tasks',
	                        keyFieldName: 'taskStatus',
	                        value: 'NEEDS-ACTION'
	                    })
	                }, {
	                    id: 'organizer',
	                    header: this.app.i18n._("Organizer"),
	                    width: 180,
	                    dataIndex: 'organizer',
	                    renderer: Tine.Tinebase.common.usernameRenderer,
	                    quickaddField: this.organizerQuickAdd,
	                    editor: this.organizerEditor
	                }
	            ]}
	        );
	    },
	    
	    /**
	     * update event handler for related tasks
	     * 
	     * TODO use generic function
	     */
	    onUpdate: function(task) {
	        var response = {
	            responseText: task
	        };
	        task = Tine.Tasks.JsonBackend.recordReader(response);
	        
	        Tine.log.debug('Tine.Crm.Task.GridPanel::onUpdate - Task has been updated:');
	        Tine.log.debug(task);
	        
	        // remove task relations to prevent cyclic relation structure
	        task.data.relations = null;
	        
	        var myTask = this.store.getById(task.id);
	        
	        if (myTask) {
	            // copy values from edited task
	            myTask.beginEdit();
	            for (var p in task.data) {
	                myTask.set(p, task.get(p));
	            }
	            myTask.endEdit();
	            
	        } else {
	            task.data.relation_type = 'task';
	            this.store.add(task);
	        }
	    }
	});


/***/ },

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

	exports = module.exports = __webpack_require__(1)();
	// imports
	
	
	// module
	exports.push([module.id, ".CrmIconCls,.CrmLead{background-image:url(" + __webpack_require__(758) + ")!important}.x-btn-medium .CrmIconCls{background-image:url(" + __webpack_require__(1131) + ")!important}.x-btn-large .CrmIconCls{background-image:url(" + __webpack_require__(1497) + ")!important}.actionAddTask{background-image:url(" + __webpack_require__(59) + ")!important}.x-btn-medium .actionAddTask{background-image:url(" + __webpack_require__(80) + ")!important}.x-btn-large .actionAddTask{background-image:url(" + __webpack_require__(98) + ")!important}.actionEdit{background-image:url(" + __webpack_require__(54) + ")!important}.x-btn-medium .actionEdit{background-image:url(" + __webpack_require__(75) + ")!important}.x-btn-large .actionEdit{background-image:url(" + __webpack_require__(93) + ")!important}.actionDelete{background-image:url(" + __webpack_require__(52) + ")!important}.x-btn-medium .actionDelete{background-image:url(" + __webpack_require__(74) + ")!important}.x-btn-large .actionDelete{background-image:url(" + __webpack_require__(92) + ")!important}.activities-item-small{padding:2px 4px;border-bottom:1px solid #b5b8c8;font-size:11px}.contact-item-small,.productSummary-item-small{font-size:11px}.contact-item,.contact-item-small,.productSummary-item-small{padding:2px 4px;border-bottom:1px solid #b5b8c8}.contact-item a{text-decoration:none;color:#000}.contact-item a:hover{text-decoration:underline;color:#999}.contact-item p{line-height:13px;margin:7px 0}.contacts_background{background:#fff url(" + __webpack_require__(729) + ") repeat-x scroll 0 19pt;border:1px solid #b5b8c8;margin-right:10px}.contactIcon{position:relative}.contactIconResponsible{background-image:url(" + __webpack_require__(830) + ")!important}.x-btn-medium .contactIconResponsible{background-image:url(" + __webpack_require__(1197) + ")!important}.x-btn-large .contactIconResponsible{background-image:url(" + __webpack_require__(1558) + ")!important}.contactIconCustomer{background-image:url(" + __webpack_require__(24) + ")!important}.x-btn-medium .contactIconCustomer{background-image:url(" + __webpack_require__(86) + ")!important}.x-btn-large .contactIconCustomer{background-image:url(" + __webpack_require__(104) + ")!important}.contactIconPartner{background-image:url(" + __webpack_require__(821) + ")!important}.x-btn-medium .contactIconPartner{background-image:url(" + __webpack_require__(1186) + ")!important}.x-btn-large .contactIconPartner{background-image:url(" + __webpack_require__(1547) + ")!important}.productSummary{background:transparent none repeat;border:0;color:#000;opacity:1;padding:0}.lowPadding{padding-left:1px;padding-right:1px}.borderTop{border-top:solid;border-top-color:#bbb;border-top-width:1px}.x-view-over{background-color:#efefef}.contact-grid{border:1px solid #ccc}.crm-leadgrid-detailspanel-status{margin:5px 2px 5px 5px;width:20%}.crm-leadgrid-detailspanel-contacts{margin:5px 2px 5px 5px;width:36%}.crm-leadgrid-detailspanel .preview-panel-description{margin:5px 2px 5px 5px;width:36%;overflow:hidden}.crm-leadgrid-detailspanel-status .preview-panel-symbolcompare{width:90px}.crm-leadgrid-detailspanel-contact{width:50%;float:right;height:108px;position:relative}.crm-highlight-task{color:red}", ""]);
	
	// exports


/***/ },

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

/***/ },

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

	module.exports = "data:image/gif;base64,R0lGODlhAQASAIcAAN7j5vDz8/P19fX39/f5+fn7+/z8/f3+/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAP8ALAAAAAABABIAAAgQAAEEEDCAQAEDBxAoXMgwIAA7"

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAGkSURBVDiNlZM/iBNBFIe/NxM1MYIyGrBQ0EKDpEgluIEt3NYytYEs2Ii1CIKi2NoKaVJapBAsbA68w2KrWG465eQOLJRbU3gcp3GehdnNXVyjPhh4zPu9b37zT9I0vSQihpIYjUa32u32i2azuVNWB5DBYPDRWnusrKiqNeCbiPwoq3vvZ5VGo3E0DEMnIgvqgRyoLUGLPEmSzCyJ/ytEhEqe5KBVwCduF4D7O8eLuUre/C+AXT7PNRcWgFUOHp7KAHg0dXPAp7nm4t8BIsKUTQCMObMEkHLA3ZPvAXj69TIiwhc+AGDttUNbMMagqotDNMZgjGGTjXnDFQCmBcCiqoUDay3e+8Uh5oCXe7cxxhQ2X39/UFhVVdb3H6OqxeoAlclksl2tVn97yiLCbDarWWv3RcTnkIORpulWQSwbvV7vXr/fP7tKU/qJAOI4Pt9qta5672/GcXzkTzpZthXHcaPT6dxJkmQvy7LT9Xp9LQzDG+Px+C3wfDgc+kMNuRVAgiB4FgTBqyiKzgF159wb51wXONHtdq9HUfTOOdfm1/WLqvITo/K1UHdaKvgAAAAASUVORK5CYII="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAG7AAABuwE67OPiAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAALFQTFRF////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANTU1MjIyNDQ0Nzc3Pz8/RkZGTExMTU1NUVRYVVVVWFhYWVlZXFxcZGRkZWZnZ2dnampqa2trbGxsbXJ6i5CXlpaVnZ2ds7rDurq6u7u7vNX6vr6+vtDrwMDAx97/2ef76Ojn6urp9vb19/f29/f3+Pj3+Pj4+fn5+vr5+/v6/Pz8/f38/f39/v79/v7+nZ2GVAAAAA10Uk5TAAQeHyA4Q0RWV1hZg2123ZUAAACXSURBVBgZBcHZTQMxFADAec/eJFI4hCIXAv3XkDaQsqAg+IE9bGaiJIwNoB5e4RqAURO8AVwrMwBaqWhzY26YqQN8fq15gVExu92G9z0g0WRkxnNrSAx1ijiWvaOO7kM/fzvdsUm7JyUyy/nhUR9Vt/ld0vI3sau6n21R7PdDLV3qp2WNiIhYl+MQhyleANzHFhEBgDH+AeuWOgNV7hLKAAAAAElFTkSuQmCC"

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJYSURBVHjajdNLSFRhFAfw/3efzp3rTZ2xG0o2TZk9sdJNtXCgddDCRYsWbVoI0SY3UUHSJqQoWreKKHQo3LVooYgiJBVKKdZI2shMgzNO87rNfZ5mDIJ8NT84nN3/O4fv+xgRYSvTrx5dEng+deri9VHsYFPA5MvBI+Wy+a5YNNSA3gJFUfI8WW2dF/py2AKHDTwPw45HqgcCJ4jQmls0XqobwTYEbODzK60nu7vBlCBc+pO4kFhqrylgZSrqaw425ZgoNwpSHSRRRlVLKByv9v+uEDObbU3zJ8A4MIYKApGHeq1+saaASCTikGPfhGMCngmyjUozHJ5Rf00BVU2ne8eXvy06rvETZBn4NDttquFzP2oOqCJJy87MvMf01AQkUfln/GjfHX7Hd+A4Hiulvtrk2nxs7iNaw4eL4wv5wOM3sdn2E50dMg+UTdcem5i6HB/qH/47QSLh6oZh3c3njaQl6Z6gNEIPHSMpeIh/+jZW8lqPdziFDM7usbCQccXQ0a4h1nP7oICKVDrXywkYIsicosgAJHCcCl3TGQDffIYQkLL47DpIrcZRsvwoEKBq2iBXNm1+NVN4IcsCVwEwVIrBI1ov1/NQNAmJ1BrC9Rau9LRhac3CcjID0+b2C0vf09cCDapIBGz3sdxSFjnyo3GXin0BHww5CDgAK8w/59JrBb1gmJ5RLq+fRkSb6tmN82BWHqMrDE/GkoAoQcivxL3JBw/Xb2FgICrtDgUiZ7oOXBUFPsw4pjHG/AChugERFWbmvmTvv/6wN/lL5BrcdDQ2cu8WAPoNsrUlXC8JbyYAAAAASUVORK5CYII="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIpSURBVDiNlZTBi9NAFMa/N4lr9VC3uFW7rYdoCh7qXnqxf4BSpNBToXqRDHj2FBARWSwse9hz8db22lsuCyrSv8Be6norCIJVVtl0V7pVTMdLJpumaZodGDKZ+d7vvXxJHoQQiDNN09w1DON2XD31+/0TxBiO41xkjP0lIhFD/lNttVoJImKrlEREQggVwEqwqqppNZ/Pf67X61tE5IdE5ghuCDGfq9vtflX9oCBwRQIP6tfJJHPgZbDgnr/CIFTeq2GCVZXK852rUwDAi1+JhcqXWhHHhlNhu6sbnj62FVEJprBdTcaDntuK16kxAODV0RUf+MjTn9sKeR2LbwAAxlKe5hT2gj7Sipfr3wEAO8eb3tkJJPjughWMsbNfOcwKOX+IT25ALgTMvMrCwHMVM8bmwId04AY89JL+plFsMBGdWeGH709Mby3PP/zZhn8IIfD2eNsDyRc4m82WV+yfwZcjoUSExKW1BQvkE6mDwaDfbDZnCIzgJ+c4zk0Ah4qiTIPaYBMaDocHsZq22+jfGIZxJ65+ZR8GAM55oVAo5AE85pwn4sREgjnnt3q9XjubzZqWZf2bTCbTSqWyzzl/yjlXo2JDwZqm3e90Ok1d13fb7fZeo9F4Ytu2MhqNepZlPXAch2q12vtqtfosmUxmQsmu8QRAAbCmadq9YrE4LpVKjwCsA9gAcD2dTn9JpVLPAWQAXMvlcpu6rr8rl8sfAVwGkABwQRb7HyrEW3kqKdf2AAAAAElFTkSuQmCC"

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAADdcAAA3XAHLx6S5AAAECElEQVR42oVU3YsbVRT/3ZnJ5GPjbjbsuppJ6SaiseoW9U19UQRFfNA+KKUPRZQ+qkUQRBBEEKT/gyAUtcu2tiv4UNz6Qe1+YB/c+rA0wu4mMdlu2uxHvjPJzPXcwzCZLpWeMLl37j3nd8/87u8c8dWZL3HQWq0mIIT/LugXtC8+p5j7GEe8dfxYslDYNDVdcyEheIOAHcdBIpGQH53+eOfVV15zOp2OiEajEvcwx3Wgazqu/PIz5s7PSvHuqZNTL7348rKVsqYIqD9MVULXdXe/vh+/8ffq6wLismmamkv26Sef4X5mbG5uhLOZR5LPP/dClGIimqYJhpVSZS1rtTui2WyeMUPmaVoLqa1zs9+JAxwJSEiKDe3u7VYpkfcMULAykBEwT4M2Pp6Ux98+MeNK9yjhSAa5h6lA+iLxx7Wr9bnz58YMWqHEfF7ZMDQGokxcXegu/t84KcWA8nVobiBgCpM24NHAS142mrev5r5vgDKmzctFcSnuAl5fX2clkPFoGDoFMoi6SAhw+vxOCoHmzSlbEA3IZrPDy5NySFu73VabFNRGpbKFVOohDAYDehzM/ziPcqWMUCiEZ59+BmnrEKy0hUgkysCFQgFBC2bMQSMjMRZcOBxGmIJGKZNL8xdx8dIPIA0zyPXrf+LNN45h5ugMpPRjg6UBw5v4n99qtSjjLmXZR6/TAtwBNjbWOTASiYCMfYrFIvsFqPPvm4GD4rFtG+VyBZKy2q230bBrCBNYszOA5nEZvLjqdhV23+YL7Pf7B6gY6pY/NZfLwe510bhZQnjiUcSiwNhEmkAH3mdKPiAejyOTzShQfs/n83dTIQQ7+9IZOAOmQYNERHNgCh3pQ4chhOb7KTVMTj7IgA75k2x9GfJImEZAmyyh/M08U9FpNkHVhjqAycQIxpMT3PWUJZNJWJaFtbU1PoT4JSpsH1gbAnPlsBIymQx6vQ7s4i1MpqZJv6xVxB8YRaNR58CxsQTJzWJwAmY5lkrFYLFC83ijAFcF+UDRiInRERPd1h4u/zRHF7UFwzD42dqqYOHKAvb292CaYcRiLEMPAxBBKmj0LuEfrrjV1Ru4cGEW1P1w53YVhqdTz4/67gL5/IXp6Wk8+cRTyD2WAyfLWNw0GFiSMzkdloqO337/Fd9+f1aBcIYmrQW6nr9e26lhu7qNpeUlfPD+h/LxI0cENXxqnzo04kf1AWEYXACCSlSsrKwIAhKxWEyoPTqU3w8+tMc+AMTi0jU1EpYhVBsw6AJ6xVKxhsWrOol8oCqs0WgI1VQ8irwHAfM7m/oH+aoYLK8sGqVSYcey0j32OPnOialy5d8wnaYUKayH01wsFBgECk6CB7HGO902VW1JS6XS3W++PnvrP+O+Kru/Y7oLAAAAInpUWHRTb2Z0d2FyZQAAeNorLy/Xy8zLLk5OLEjVyy9KBwA22AZYEFPKXAAAAABJRU5ErkJggg=="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACYQAAAmEBwTBV+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAPFSURBVHjanZVdaBxVGIbf78zMzu7Obme3afNPEmtstLUqKKggxMaLUFuIUgveaAWRoqLXShFa2guDooFeSLF4pVBsb3ohxUaI1p+ktSbYosHYWJuQze5ms7uz2Z/ZnZlzPLMNgrBt7D7wzXdm5vDwMmc4B0KIDWv81NFWv99NkX9pxLkT7wZMM/pFqVQeASla1Iy5QV27mMtZzw6/eriKDVBxGwwjdMGy1gYBQmzLFsS3dqjBsDGkBpJXAQxgAxga8PWnRx4uFIqDeigMQQzlUglVuwzHccC08PbJLz8ebCpxKBTa39rRjv7tA1DDLUgkU9A0FUFdx/xvM+BubS+A7+5arAd1c+vmOEjVZQXQ3bsNpKgQgmPbDoGF2WmzqcSbYmY1Eg2DmAIQZJEsBvLfxTcj3hI3mhLLRcoRMV63CQBCQHDPH4BA/ie53NTiUa38Cfec78EdAFIoXJA/9hz5qDrT/cSBE02J+55+Je+47mnhlCHsNcCV3SnJXkFudXkKgGhK7BNQ6NRKJs25lHvVskxqI51YQCFbHIOkaXHskf1ujYxULpsFd23kMykkUqvOA0MvzOF/oOIOtLT3EFMUzM7+CnCO7r5+D+vse2P0XjvadaatvXOAc6reXFgcn7w6/6KYOCoA3H6vWFlODetq7TxzS7Q4/wfsShmdffeDRdtPvnT8bEbrfeiwHomjk2WwWgugSBG4a9naNxMTO6oXjs3/J3EymY6aZvxlQLxuxGI7y6UaNwyDgi0O4kENFOnwHO4dWlC7EbFVhIuLOP3eMM79cA2j31ogYoH+gZ1XAMT/TbywlHuLAR+YZkhnjKAwBkCAye7PISL4HDz2Of50O8EFh+AcB3aFMJeuYCbB6/M8Wb9fufRUPXFixdpNJMaikSBjCkFVlHWZlEJC5Pc6MzfyEGZUSgU491AoOCgWXeQtR95zKKoCTVOeZ5BYVmksEFDqY2U9oaThBq7eCoLlbAkat/H+myM4uLsfK24YGZvh5nIejl1NsYpdC+iq9iAEwOsp7nwy7Hm0C0XbRVHoqEBFKpVCobiGihaFrRhAPZ93hllWZVckHGR+yKrj1sWe50vQsI68thdRVgZ0AwVmYnbuOv5Kl4CQCehhaMXkRfHTh3+z9jbzl8npuXdWsoVVAkkpRzabwS0apCYFl0ZH0OYuIWcDh8ZVfHS9FygkEElOTz33eM9Qo/+Yzn411dnT0bpHUek+IupiQGul6gZBtCbNGWLMEpzfKFupH89fvvbkxKz1DDxn6bF7Nn128vjbP2OdfwB8wTSB6/GtOQAAAABJRU5ErkJggg=="

/***/ },

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

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANVSURBVFiFvVdLTBNRFD13GEdaDJ9oaYOExAVNoLAp0SiJCWHjgkUXstQmb2JYISsWRImfQGJw4cpojKQudQkmdknChg2WmEBmAYkoGstCaQ0phSnluSgj83kdyvC5yaQz7953zpnzbifvgXMOr9fk5OQvxti142DQ2NjY3WKxeA4eoqGh4UU6nX5ZXV391ct8IuI0Nze3A0DxAnASIWuallEUpcbj/BrO+TYRFb1M1nV9W25tbS20t7dfICJhUblxU/jckpzzsuOapmVlUaGZtByA17DjyeaHY7hQMaGBZYzLIoKjEBKRq0vl3DTGT8QBUf7ZxQIMPiJg5LcsFCN0oBJSe43dBZ3nDh44QFR/eg6IanTkbBX1Z+tAwSbA3itCB44iZrxhy7LGoxm/qwAzjlmIbE+6kZojz7MHDxwArAJ0bDnwDGIztmMJKnGAiLCNrGVMkppLWvZJTsyBcuLyyJSt55w7mvDIDjyu/2NZ4/HNRgug3QE7hqgJjXB1gIhARMjw1YPZHCAKWsCcSyBZwEUOmMPxN3QIwDcbwA0LUDkHDKsLgiYULYNFgBnkL323FJvzALBDWUfeTFagLdf8/9zs7OyPaDTaLHLB/mZulgLOj5HxbP4136dSqZ8OB0Qi7IRun+zD9g/2Ghk4aCCRiErJRQTGvZswWdO0RUVRqg4DFcXu7m6jJElZSZL0cnPdHNE0bdHzfn7/XLDOGLt+HAzJ7c3PIjwLUFXVVywWCUD9cQTQUXe9qqoqAO4NDAyMTk1N1XV3d0PTtHfLy8vjiURi/dQEqKpaBeDO4ODgk2QyubaysvLA7/d/SqfT91taWnr6+vr6k8nkq83NzeeJRCJzKKARhzUJY4wYY/1LS0vaxMTE53g8fsvIDQ0NbcRisV7OOeLxeHh4ePj9zMzMBmPsIWOspqLDqWDfTij1Rm1HR8eHrq6um5FIZG1hYeHp9PT0x3w+DwDk9/uvBIPBLwBer66ujhjzY7FYpK2t7VEul+udn59fT6VStwuFwhKAPZS2LnvcTGq6JwBVKH2clGAweDUajRbr6uoWamtrL6HUbJcBBAA0+ny+nlAopAcCgTcAQvtXE4BWAOGmpqa34XBY7+zsHEPp+HYepUOwvP+CxDnHP9fEaOBVeWvvAAAAAElFTkSuQmCC"

/***/ },

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

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

/***/ },

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

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

/***/ }

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