(function(a, b) {
	a.ui     = a.ui || {};
	var c, d = Math.max, e = Math.abs, f = Math.round, g = /left|center|right/, h = /top|center|bottom/, i = /[\+\-]\d+(\.[\d]+)?%?/, j = /^\w+/, k = /%$/, l = a.fn.pos;
	function m(a, b, c) {
		return [ parseFloat( a[0] ) * (k.test( a[0] ) ? b / 100 : 1), parseFloat( a[1] ) * (k.test( a[1] ) ? c / 100 : 1) ];
	}
	function n(b, c) {
		return parseInt( a.css( b, c ), 10 ) || 0;
	}
	function o(b) {
		var c = b[0];
		if (c.nodeType === 9) {
			return {
				width: b.width(),
				height: b.height(),
				offset: {
					top: 0,
					left: 0
				}
			};
		}
		if (a.isWindow( c )) {
			return {
				width: b.width(),
				height: b.height(),
				offset: {
					top: b.scrollTop(),
					left: b.scrollLeft()
				}
			};
		}
		if (c.preventDefault) {
			return {
				width: 0,
				height: 0,
				offset: {
					top: c.pageY,
					left: c.pageX
				}
			};
		}
		return {
			width: b.outerWidth(),
			height: b.outerHeight(),
			offset: b.offset()
		};
	}
	a.pos = {
		scrollbarWidth: function() {
			if (c !== b) {
				return c;
			}
			var d, e, f = a( "<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ), g = f.children()[0];
			a( "body" ).append( f );
			d = g.offsetWidth;
			f.css( "overflow", "scroll" );
			e = g.offsetWidth;
			if (d === e) {
				e = f[0].clientWidth;
			}
			f.remove();
			return c = d - e;
		},
		getScrollInfo: function(b) {
			var c = b.isWindow || b.isDocument ? "" : b.element.css( "overflow-x" ), d = b.isWindow || b.isDocument ? "" : b.element.css( "overflow-y" ), e = c === "scroll" || c === "auto" && b.width < b.element[0].scrollWidth, f = d === "scroll" || d === "auto" && b.height < b.element[0].scrollHeight;
			return {
				width: f ? a.pos.scrollbarWidth() : 0,
				height: e ? a.pos.scrollbarWidth() : 0
			};
		},
		getWithinInfo: function(b) {
			var c = a( b || window ), d = a.isWindow( c[0] ), e = ! ! c[0] && c[0].nodeType === 9;
			return {
				element: c,
				isWindow: d,
				isDocument: e,
				offset: c.offset() || {
					left: 0,
					top: 0
				},
				scrollLeft: c.scrollLeft(),
				scrollTop: c.scrollTop(),
				width: d ? c.width() : c.outerWidth(),
				height: d ? c.height() : c.outerHeight()
			};
		}
	};
	a.fn.pos = function(b) {
		if ( ! b || ! b.of) {
			return l.apply( this, arguments );
		}
		b                       = a.extend( {}, b );
		var c, k, p, q, r, s, t = a( b.of ), u = a.pos.getWithinInfo( b.within ), v = a.pos.getScrollInfo( u ), w = (b.collision || "flip").split( " " ), x = {};
		s                       = o( t );
		if (t[0].preventDefault) {
			b.at = "left top";
		}
		k = s.width;
		p = s.height;
		q = s.offset;
		r = a.extend( {}, q );
		a.each(
			[ "my", "at" ], function() {
				var a = (b[this] || "").split( " " ), c, d;
				if (a.length === 1) {
					a = g.test( a[0] ) ? a.concat( [ "center" ] ) : h.test( a[0] ) ? [ "center" ].concat( a ) : [ "center", "center" ];
				}
				a[0]    = g.test( a[0] ) ? a[0] : "center";
				a[1]    = h.test( a[1] ) ? a[1] : "center";
				c       = i.exec( a[0] );
				d       = i.exec( a[1] );
				x[this] = [ c ? c[0] : 0, d ? d[0] : 0 ];
				b[this] = [ j.exec( a[0] )[0], j.exec( a[1] )[0] ];
			}
		);
		if (w.length === 1) {
			w[1] = w[0];
		}
		if (b.at[0] === "right") {
			r.left += k;
		} else if (b.at[0] === "center") {
			r.left += k / 2;
		}
		if (b.at[1] === "bottom") {
			r.top += p;
		} else if (b.at[1] === "center") {
			r.top += p / 2;
		}
		c       = m( x.at, k, p );
		r.left += c[0];
		r.top  += c[1];
		return this.each(
			function() {
				var g, h, i = a( this ), j = i.outerWidth(), l = i.outerHeight(), o = n( this, "marginLeft" ), s = n( this, "marginTop" ), y = j + o + n( this, "marginRight" ) + v.width, z = l + s + n( this, "marginBottom" ) + v.height, A = a.extend( {}, r ), B = m( x.my, i.outerWidth(), i.outerHeight() );
				if (b.my[0] === "right") {
					A.left -= j;
				} else if (b.my[0] === "center") {
					A.left -= j / 2;
				}
				if (b.my[1] === "bottom") {
					A.top -= l;
				} else if (b.my[1] === "center") {
					A.top -= l / 2;
				}
				A.left += B[0];
				A.top  += B[1];
				if ( ! a.support.offsetFractions) {
					A.left = f( A.left );
					A.top  = f( A.top );
				}
				g = {
					marginLeft: o,
					marginTop: s
				};
				a.each(
					[ "left", "top" ], function(d, e) {
						if (a.ui.pos[w[d]]) {
							a.ui.pos[w[d]][e](A, {
								targetWidth: k,
								targetHeight: p,
								elemWidth: j,
								elemHeight: l,
								collisionPosition: g,
								collisionWidth: y,
								collisionHeight: z,
								offset: [ c[0] + B[0], c[1] + B[1] ],
								my: b.my,
								at: b.at,
								within: u,
								elem: i
							});
						}
					}
				);
				if (b.using) {
					h = function(a) {
						var c = q.left - A.left, f = c + k - j, g = q.top - A.top, h = g + p - l, m = {
							target: {
								element: t,
								left: q.left,
								top: q.top,
								width: k,
								height: p
							},
							element: {
								element: i,
								left: A.left,
								top: A.top,
								width: j,
								height: l
							},
							horizontal: f < 0 ? "left" : c > 0 ? "right" : "center",
							vertical: h < 0 ? "top" : g > 0 ? "bottom" : "middle"
						};
						if (k < j && e( c + f ) < k) {
							m.horizontal = "center";
						}
						if (p < l && e( g + h ) < p) {
							m.vertical = "middle";
						}
						if (d( e( c ), e( f ) ) > d( e( g ), e( h ) )) {
							m.important = "horizontal";
						} else {
							m.important = "vertical";
						}
						b.using.call( this, a, m );
					};
				}
				i.offset(
					a.extend(
						A, {
							using: h
						}
					)
				);
			}
		);
	};
	a.ui.pos = {
		_trigger: function(a, b, c, d) {
			if (b.elem) {
				b.elem.trigger(
					{
						type: c,
						position: a,
						positionData: b,
						triggered: d
					}
				);
			}
		},
		fit: {
			left: function(b, c) {
				a.ui.pos._trigger( b, c, "posCollide", "fitLeft" );
				var e = c.within, f = e.isWindow ? e.scrollLeft : e.offset.left, g = e.width, h = b.left - c.collisionPosition.marginLeft, i = f - h, j = h + c.collisionWidth - g - f, k;
				if (c.collisionWidth > g) {
					if (i > 0 && j <= 0) {
						k       = b.left + i + c.collisionWidth - g - f;
						b.left += i - k;
					} else if (j > 0 && i <= 0) {
						b.left = f;
					} else {
						if (i > j) {
							b.left = f + g - c.collisionWidth;
						} else {
							b.left = f;
						}
					}
				} else if (i > 0) {
					b.left += i;
				} else if (j > 0) {
					b.left -= j;
				} else {
					b.left = d( b.left - h, b.left );
				}
				a.ui.pos._trigger( b, c, "posCollided", "fitLeft" );
			},
			top: function(b, c) {
				a.ui.pos._trigger( b, c, "posCollide", "fitTop" );
				var e = c.within, f = e.isWindow ? e.scrollTop : e.offset.top, g = c.within.height, h = b.top - c.collisionPosition.marginTop, i = f - h, j = h + c.collisionHeight - g - f, k;
				if (c.collisionHeight > g) {
					if (i > 0 && j <= 0) {
						k      = b.top + i + c.collisionHeight - g - f;
						b.top += i - k;
					} else if (j > 0 && i <= 0) {
						b.top = f;
					} else {
						if (i > j) {
							b.top = f + g - c.collisionHeight;
						} else {
							b.top = f;
						}
					}
				} else if (i > 0) {
					b.top += i;
				} else if (j > 0) {
					b.top -= j;
				} else {
					b.top = d( b.top - h, b.top );
				}
				a.ui.pos._trigger( b, c, "posCollided", "fitTop" );
			}
		},
		flip: {
			left: function(b, c) {
				a.ui.pos._trigger( b, c, "posCollide", "flipLeft" );
				var d = c.within, f = d.offset.left + d.scrollLeft, g = d.width, h = d.isWindow ? d.scrollLeft : d.offset.left, i = b.left - c.collisionPosition.marginLeft, j = i - h, k = i + c.collisionWidth - g - h, l = c.my[0] === "left" ? -c.elemWidth : c.my[0] === "right" ? c.elemWidth : 0, m = c.at[0] === "left" ? c.targetWidth : c.at[0] === "right" ? -c.targetWidth : 0, n = -2 * c.offset[0], o, p;
				if (j < 0) {
					o = b.left + l + m + n + c.collisionWidth - g - f;
					if (o < 0 || o < e( j )) {
						b.left += l + m + n;
					}
				} else if (k > 0) {
					p = b.left - c.collisionPosition.marginLeft + l + m + n - h;
					if (p > 0 || e( p ) < k) {
						b.left += l + m + n;
					}
				}
				a.ui.pos._trigger( b, c, "posCollided", "flipLeft" );
			},
			top: function(b, c) {
				a.ui.pos._trigger( b, c, "posCollide", "flipTop" );
				var d = c.within, f = d.offset.top + d.scrollTop, g = d.height, h = d.isWindow ? d.scrollTop : d.offset.top, i = b.top - c.collisionPosition.marginTop, j = i - h, k = i + c.collisionHeight - g - h, l = c.my[1] === "top", m = l ? -c.elemHeight : c.my[1] === "bottom" ? c.elemHeight : 0, n = c.at[1] === "top" ? c.targetHeight : c.at[1] === "bottom" ? -c.targetHeight : 0, o = -2 * c.offset[1], p, q;
				if (j < 0) {
					q = b.top + m + n + o + c.collisionHeight - g - f;
					if (b.top + m + n + o > j && (q < 0 || q < e( j ))) {
						b.top += m + n + o;
					}
				} else if (k > 0) {
					p = b.top - c.collisionPosition.marginTop + m + n + o - h;
					if (b.top + m + n + o > k && (p > 0 || e( p ) < k)) {
						b.top += m + n + o;
					}
				}
				a.ui.pos._trigger( b, c, "posCollided", "flipTop" );
			}
		},
		flipfit: {
			left: function() {
				a.ui.pos.flip.left.apply( this, arguments );
				a.ui.pos.fit.left.apply( this, arguments );
			},
			top: function() {
				a.ui.pos.flip.top.apply( this, arguments );
				a.ui.pos.fit.top.apply( this, arguments );
			}
		}
	};
	(function() {
		var b, c, d, e, f, g = document.getElementsByTagName( "body" )[0], h = document.createElement( "div" );
		b                    = document.createElement( g ? "div" : "body" );
		d                    = {
			visibility: "hidden",
			width: 0,
			height: 0,
			border: 0,
			margin: 0,
			background: "none"
		};
		if (g) {
			a.extend(
				d, {
					position: "absolute",
					left: "-1000px",
					top: "-1000px"
				}
			);
		}
		for (f in d) {
			b.style[f] = d[f];
		}
		b.appendChild( h );
		c = g || document.documentElement;
		c.insertBefore( b, c.firstChild );
		h.style.cssText           = "position: absolute; left: 10.7432222px;";
		e                         = a( h ).offset().left;
		a.support.offsetFractions = e > 10 && e < 11;
		b.innerHTML               = "";
		c.removeChild( b );
	})();
})( jQuery );

(function(a) {
	"use strict";
	if (typeof define === "function" && define.amd) {
		define( [ "jquery" ], a );
	} else if (window.jQuery && ! window.jQuery.fn.iconpicker) {
		a( window.jQuery );
	}
})(
	function(a) {
		"use strict";
		var b = {
			isEmpty: function(a) {
				return a === false || a === "" || a === null || a === undefined;
			},
			isEmptyObject: function(a) {
				return this.isEmpty( a ) === true || a.length === 0;
			},
			isElement: function(b) {
				return a( b ).length > 0;
			},
			isString: function(a) {
				return typeof a === "string" || a instanceof String;
			},
			isArray: function(b) {
				return a.isArray( b );
			},
			inArray: function(b, c) {
				return a.inArray( b, c ) !== -1;
			},
			throwError: function(a) {
				throw "Font Awesome Icon Picker Exception: " + a;
			}
		};
		var c = function(d, e) {
			this._id     = c._idCounter++;
			this.element = a( d ).addClass( "iconpicker-element" );
			this._trigger( "iconpickerCreate" );
			this.options                   = a.extend( {}, c.defaultOptions, this.element.data(), e );
			this.options.templates         = a.extend( {}, c.defaultOptions.templates, this.options.templates );
			this.options.originalPlacement = this.options.placement;
			this.container                 = b.isElement( this.options.container ) ? a( this.options.container ) : false;
			if (this.container === false) {
				if (this.element.is( ".dropdown-toggle" )) {
					this.container = a( "~ .dropdown-menu:first", this.element );
				} else {
					this.container = this.element.is( "input,textarea,button,.btn" ) ? this.element.parent() : this.element;
				}
			}
			this.container.addClass( "iconpicker-container" );
			if (this.isDropdownMenu()) {
				this.options.templates.search  = false;
				this.options.templates.buttons = false;
				this.options.placement         = "inline";
			}
			this.input = this.element.is( "input,textarea" ) ? this.element.addClass( "iconpicker-input" ) : false;
			if (this.input === false) {
				this.input = this.container.find( this.options.input );
				if ( ! this.input.is( "input,textarea" )) {
					this.input = false;
				}
			}
			this.component = this.isDropdownMenu() ? this.container.parent().find( this.options.component ) : this.container.find( this.options.component );
			if (this.component.length === 0) {
				this.component = false;
			} else {
				this.component.find( "i" ).addClass( "iconpicker-component" );
			}
			this._createPopover();
			this._createIconpicker();
			if (this.getAcceptButton().length === 0) {
				this.options.mustAccept = false;
			}
			if (this.isInputGroup()) {
				this.container.parent().append( this.popover );
			} else {
				this.container.append( this.popover );
			}
			this._bindElementEvents();
			this._bindWindowEvents();
			this.update( this.options.selected );
			if (this.isInline()) {
				this.show();
			}
			this._trigger( "iconpickerCreated" );
		};
		c._idCounter     = 0;
		c.defaultOptions = {
			title: false,
			selected: false,
			defaultValue: false,
			placement: "bottom",
			collision: "none",
			animation: true,
			hideOnSelect: false,
			showFooter: false,
			searchInFooter: false,
			mustAccept: false,
			selectedCustomClass: "bg-primary",
			icons: [],
			fullClassFormatter: function(a) {
				return "fa " + a;
			},
			input: "input,.iconpicker-input",
			inputSearch: false,
			container: false,
			component: ".input-group-addon,.iconpicker-component",
			templates: {
				popover: '<div class="iconpicker-popover popover"><div class="arrow"></div>' + '<div class="popover-title"></div><div class="popover-content"></div></div>',
				footer: '<div class="popover-footer"></div>',
				buttons: '<button class="iconpicker-btn iconpicker-btn-cancel btn btn-default btn-sm">Cancel</button>' + ' <button class="iconpicker-btn iconpicker-btn-accept btn btn-primary btn-sm">Accept</button>',
				search: '<input type="search" class="form-control iconpicker-search" placeholder="Type to filter" />',
				iconpicker: '<div class="iconpicker"><div class="iconpicker-items"></div></div>',
				iconpickerItem: '<a role="button" href="#" class="iconpicker-item"><i></i></a>'
			}
		};
		c.batch = function(b, c) {
			var d = Array.prototype.slice.call( arguments, 2 );
			return a( b ).each(
				function() {
					var b = a( this ).data( "iconpicker" );
					if ( ! ! b) {
						b[c].apply( b, d );
					}
				}
			);
		};
		c.prototype = {
			constructor: c,
			options: {},
			_id: 0,
			_trigger: function(b, c) {
				c = c || {};
				this.element.trigger(
					a.extend(
						{
							type: b,
							iconpickerInstance: this
						}, c
					)
				);
			},
			_createPopover: function() {
				this.popover = a( this.options.templates.popover );
				var c        = this.popover.find( ".popover-title" );
				if ( ! ! this.options.title) {
					c.append( a( '<div class="popover-title-text">' + this.options.title + "</div>" ) );
				}
				if (this.hasSeparatedSearchInput() && ! this.options.searchInFooter) {
					c.append( this.options.templates.search );
				} else if ( ! this.options.title) {
					c.remove();
				}
				if (this.options.showFooter && ! b.isEmpty( this.options.templates.footer )) {
					var d = a( this.options.templates.footer );
					if (this.hasSeparatedSearchInput() && this.options.searchInFooter) {
						d.append( a( this.options.templates.search ) );
					}
					if ( ! b.isEmpty( this.options.templates.buttons )) {
						d.append( a( this.options.templates.buttons ) );
					}
					this.popover.append( d );
				}
				if (this.options.animation === true) {
					this.popover.addClass( "fade" );
				}
				return this.popover;
			},
			_createIconpicker: function() {
				var b           = this;
				this.iconpicker = a( this.options.templates.iconpicker );
				var c           = function(c) {
					var d = a( this );
					if (d.is( "i" )) {
						d = d.parent();
					}
					b._trigger(
						"iconpickerSelect", {
							iconpickerItem: d,
							iconpickerValue: b.iconpickerValue
						}
					);
					if (b.options.mustAccept === false) {
						b.update( d.data( "iconpickerValue" ) );
						b._trigger(
							"iconpickerSelected", {
								iconpickerItem: this,
								iconpickerValue: b.iconpickerValue
							}
						);
					} else {
						b.update( d.data( "iconpickerValue" ), true );
					}
					if (b.options.hideOnSelect && b.options.mustAccept === false) {
						b.hide();
					}
					c.preventDefault();
					return false;
				};
				for (var d in this.options.icons) {
					var e = a( this.options.templates.iconpickerItem );
					e.find( "i" ).addClass( this.options.fullClassFormatter( this.options.icons[d] ) );
					e.data( "iconpickerValue", this.options.icons[d] ).on( "click.iconpicker", c );
					this.iconpicker.find( ".iconpicker-items" ).append( e.attr( "title", "." + this.options.icons[d] ) );
				}
				this.popover.find( ".popover-content" ).append( this.iconpicker );
				return this.iconpicker;
			},
			_isEventInsideIconpicker: function(b) {
				var c = a( b.target );
				if (( ! c.hasClass( "iconpicker-element" ) || c.hasClass( "iconpicker-element" ) && ! c.is( this.element )) && c.parents( ".iconpicker-popover" ).length === 0) {
					return false;
				}
				return true;
			},
			_bindElementEvents: function() {
				var c = this;
				this.getSearchInput().on(
					"keyup.iconpicker", function() {
						c.filter( a( this ).val().toLowerCase() );
					}
				);
				this.getAcceptButton().on(
					"click.iconpicker", function() {
						var a = c.iconpicker.find( ".iconpicker-selected" ).get( 0 );
						c.update( c.iconpickerValue );
						c._trigger(
							"iconpickerSelected", {
								iconpickerItem: a,
								iconpickerValue: c.iconpickerValue
							}
						);
						if ( ! c.isInline()) {
							c.hide();
						}
					}
				);
				this.getCancelButton().on(
					"click.iconpicker", function() {
						if ( ! c.isInline()) {
							c.hide();
						}
					}
				);
				this.element.on(
					"focus.iconpicker", function(a) {
						c.show();
						a.stopPropagation();
					}
				);
				if (this.hasComponent()) {
					this.component.on(
						"click.iconpicker", function() {
							c.toggle();
						}
					);
				}
				if (this.hasInput()) {
					this.input.on(
						"keyup.iconpicker", function(d) {
							if ( ! b.inArray( d.keyCode, [ 38, 40, 37, 39, 16, 17, 18, 9, 8, 91, 93, 20, 46, 186, 190, 46, 78, 188, 44, 86 ] )) {
								c.update();
							} else {
								c._updateFormGroupStatus( c.getValid( this.value ) !== false );
							}
							if (c.options.inputSearch === true) {
								c.filter( a( this ).val().toLowerCase() );
							}
						}
					);
				}
			},
			_bindWindowEvents: function() {
				var b = a( window.document );
				var c = this;
				var d = ".iconpicker.inst" + this._id;
				a( window ).on(
					"resize.iconpicker" + d + " orientationchange.iconpicker" + d, function(a) {
						if (c.popover.hasClass( "in" )) {
							c.updatePlacement();
						}
					}
				);
				if ( ! c.isInline()) {
					b.on(
						"mouseup" + d, function(a) {
							if ( ! c._isEventInsideIconpicker( a ) && ! c.isInline()) {
								c.hide();
							}
						}
					);
				}
				return false;
			},
			_unbindElementEvents: function() {
				this.popover.off( ".iconpicker" );
				this.element.off( ".iconpicker" );
				if (this.hasInput()) {
					this.input.off( ".iconpicker" );
				}
				if (this.hasComponent()) {
					this.component.off( ".iconpicker" );
				}
				if (this.hasContainer()) {
					this.container.off( ".iconpicker" );
				}
			},
			_unbindWindowEvents: function() {
				a( window ).off( ".iconpicker.inst" + this._id );
				a( window.document ).off( ".iconpicker.inst" + this._id );
			},
			updatePlacement: function(b, c) {
				b                      = b || this.options.placement;
				this.options.placement = b;
				c                      = c || this.options.collision;
				c                      = c === true ? "flip" : c;
				var d                  = {
					at: "right bottom",
					my: "right top",
					of: this.hasInput() && ! this.isInputGroup() ? this.input : this.container,
					collision: c === true ? "flip" : c,
					within: window
				};
				this.popover.removeClass( "inline topLeftCorner topLeft top topRight topRightCorner " + "rightTop right rightBottom bottomRight bottomRightCorner " + "bottom bottomLeft bottomLeftCorner leftBottom left leftTop" );
				if (typeof b === "object") {
					return this.popover.pos( a.extend( {}, d, b ) );
				}
				switch (b) {
					case "inline":
						{
							d = false;
						}
						break;

					case "topLeftCorner":
						{
							d.my = "right bottom";
							d.at = "left top";
						}
						break;

					case "topLeft":
						{
							d.my = "left bottom";
							d.at = "left top";
						}
						break;

					case "top":
						{
							d.my = "center bottom";
							d.at = "center top";
						}
						break;

					case "topRight":
						{
							d.my = "right bottom";
							d.at = "right top";
						}
						break;

					case "topRightCorner":
						{
							d.my = "left bottom";
							d.at = "right top";
						}
						break;

					case "rightTop":
						{
							d.my = "left bottom";
							d.at = "right center";
						}
						break;

					case "right":
						{
							d.my = "left center";
							d.at = "right center";
						}
						break;

					case "rightBottom":
						{
							d.my = "left top";
							d.at = "right center";
						}
						break;

					case "bottomRightCorner":
						{
							d.my = "left top";
							d.at = "right bottom";
						}
						break;

					case "bottomRight":
						{
							d.my = "right top";
							d.at = "right bottom";
						}
						break;

					case "bottom":
						{
							d.my = "center top";
							d.at = "center bottom";
						}
						break;

					case "bottomLeft":
						{
							d.my = "left top";
							d.at = "left bottom";
						}
						break;

					case "bottomLeftCorner":
						{
							d.my = "right top";
							d.at = "left bottom";
						}
						break;

					case "leftBottom":
						{
							d.my = "right top";
							d.at = "left center";
						}
						break;

					case "left":
						{
							d.my = "right center";
							d.at = "left center";
						}
						break;

					case "leftTop":
						{
							d.my = "right bottom";
							d.at = "left center";
						}
						break;

					default:
						{
							return false;
					}
					break;
				}
				this.popover.css(
					{
						display: this.options.placement === "inline" ? "" : "block"
					}
				);
				if (d !== false) {
					this.popover.pos( d ).css( "maxWidth", a( window ).width() - this.container.offset().left - 5 );
				} else {
					this.popover.css(
						{
							top: "auto",
							right: "auto",
							bottom: "auto",
							left: "auto",
							maxWidth: "none"
						}
					);
				}
				this.popover.addClass( this.options.placement );
				return true;
			},
			_updateComponents: function() {
				this.iconpicker.find( ".iconpicker-item.iconpicker-selected" ).removeClass( "iconpicker-selected " + this.options.selectedCustomClass );
				if (this.iconpickerValue) {
					this.iconpicker.find( "." + this.options.fullClassFormatter( this.iconpickerValue ).replace( / /g, "." ) ).parent().addClass( "iconpicker-selected " + this.options.selectedCustomClass );
				}
				if (this.hasComponent()) {
					var a = this.component.find( "i" );
					if (a.length > 0) {
						a.attr( "class", this.options.fullClassFormatter( this.iconpickerValue ) );
					} else {
						this.component.html( this.getHtml() );
					}
				}
			},
			_updateFormGroupStatus: function(a) {
				if (this.hasInput()) {
					if (a !== false) {
						this.input.parents( ".form-group:first" ).removeClass( "has-error" );
					} else {
						this.input.parents( ".form-group:first" ).addClass( "has-error" );
					}
					return true;
				}
				return false;
			},
			getValid: function(c) {
				if ( ! b.isString( c )) {
					c = "";
				}
				var d = c === "";
				c     = a.trim( c );
				if (b.inArray( c, this.options.icons ) || d) {
					return c;
				}
				return false;
			},
			setValue: function(a) {
				var b = this.getValid( a );
				if (b !== false) {
					this.iconpickerValue = b;
					this._trigger(
						"iconpickerSetValue", {
							iconpickerValue: b
						}
					);
					return this.iconpickerValue;
				} else {
					this._trigger(
						"iconpickerInvalid", {
							iconpickerValue: a
						}
					);
					return false;
				}
			},
			getHtml: function() {
				return '<i class="' + this.options.fullClassFormatter( this.iconpickerValue ) + '"></i>';
			},
			setSourceValue: function(a) {
				a = this.setValue( a );
				if (a !== false && a !== "") {
					if (this.hasInput()) {
						this.input.val( this.iconpickerValue );
					} else {
						this.element.data( "iconpickerValue", this.iconpickerValue );
					}
					this._trigger(
						"iconpickerSetSourceValue", {
							iconpickerValue: a
						}
					);
				}
				return a;
			},
			getSourceValue: function(a) {
				a     = a || this.options.defaultValue;
				var b = a;
				if (this.hasInput()) {
					b = this.input.val();
				} else {
					b = this.element.data( "iconpickerValue" );
				}
				if (b === undefined || b === "" || b === null || b === false) {
					b = a;
				}
				return b;
			},
			hasInput: function() {
				return this.input !== false;
			},
			isInputSearch: function() {
				return this.hasInput() && this.options.inputSearch === true;
			},
			isInputGroup: function() {
				return this.container.is( ".input-group" );
			},
			isDropdownMenu: function() {
				return this.container.is( ".dropdown-menu" );
			},
			hasSeparatedSearchInput: function() {
				return this.options.templates.search !== false && ! this.isInputSearch();
			},
			hasComponent: function() {
				return this.component !== false;
			},
			hasContainer: function() {
				return this.container !== false;
			},
			getAcceptButton: function() {
				return this.popover.find( ".iconpicker-btn-accept" );
			},
			getCancelButton: function() {
				return this.popover.find( ".iconpicker-btn-cancel" );
			},
			getSearchInput: function() {
				return this.popover.find( ".iconpicker-search" );
			},
			filter: function(c) {
				if (b.isEmpty( c )) {
					this.iconpicker.find( ".iconpicker-item" ).show();
					return a( false );
				} else {
					var d = [];
					this.iconpicker.find( ".iconpicker-item" ).each(
						function() {
							var b = a( this );
							var e = b.attr( "title" ).toLowerCase();
							var f = false;
							try {
								f = new RegExp( c, "g" );
							} catch (a) {
								f = false;
							}
							if (f !== false && e.match( f )) {
								d.push( b );
								b.show();
							} else {
								b.hide();
							}
						}
					);
					return d;
				}
			},
			show: function() {
				if (this.popover.hasClass( "in" )) {
					return false;
				}
				a.iconpicker.batch( a( ".iconpicker-popover.in:not(.inline)" ).not( this.popover ), "hide" );
				this._trigger( "iconpickerShow" );
				this.updatePlacement();
				this.popover.addClass( "in" );
				setTimeout(
					a.proxy(
						function() {
							this.popover.css( "display", this.isInline() ? "" : "block" );
							this._trigger( "iconpickerShown" );
						}, this
					), this.options.animation ? 300 : 1
				);
			},
			hide: function() {
				if ( ! this.popover.hasClass( "in" )) {
					return false;
				}
				this._trigger( "iconpickerHide" );
				this.popover.removeClass( "in" );
				setTimeout(
					a.proxy(
						function() {
							this.popover.css( "display", "none" );
							this.getSearchInput().val( "" );
							this.filter( "" );
							this._trigger( "iconpickerHidden" );
						}, this
					), this.options.animation ? 300 : 1
				);
			},
			toggle: function() {
				if (this.popover.is( ":visible" )) {
					this.hide();
				} else {
					this.show( true );
				}
			},
			update: function(a, b) {
				a = a ? a : this.getSourceValue( this.iconpickerValue );
				this._trigger( "iconpickerUpdate" );
				if (b === true) {
					a = this.setValue( a );
				} else {
					a = this.setSourceValue( a );
					this._updateFormGroupStatus( a !== false );
				}
				if (a !== false) {
					this._updateComponents();
				}
				this._trigger( "iconpickerUpdated" );
				return a;
			},
			destroy: function() {
				this._trigger( "iconpickerDestroy" );
				this.element.removeData( "iconpicker" ).removeData( "iconpickerValue" ).removeClass( "iconpicker-element" );
				this._unbindElementEvents();
				this._unbindWindowEvents();
				a( this.popover ).remove();
				this._trigger( "iconpickerDestroyed" );
			},
			disable: function() {
				if (this.hasInput()) {
					this.input.prop( "disabled", true );
					return true;
				}
				return false;
			},
			enable: function() {
				if (this.hasInput()) {
					this.input.prop( "disabled", false );
					return true;
				}
				return false;
			},
			isDisabled: function() {
				if (this.hasInput()) {
					return this.input.prop( "disabled" ) === true;
				}
				return false;
			},
			isInline: function() {
				return this.options.placement === "inline" || this.popover.hasClass( "inline" );
			}
		};
		a.iconpicker    = c;
		a.fn.iconpicker = function(b) {
			return this.each(
				function() {
					var d = a( this );
					if ( ! d.data( "iconpicker" )) {
						d.data( "iconpicker", new c( this, typeof b === "object" ? b : {} ) );
					}
				}
			);
		};
		c.defaultOptions.icons = [ "fa-500px", "fa-adjust", "fa-adn", "fa-align-center", "fa-align-justify", "fa-align-left", "fa-align-right", "fa-amazon", "fa-ambulance", "fa-american-sign-language-interpreting", "fa-anchor", "fa-android", "fa-angellist", "fa-angle-double-down", "fa-angle-double-left", "fa-angle-double-right", "fa-angle-double-up", "fa-angle-down", "fa-angle-left", "fa-angle-right", "fa-angle-up", "fa-apple", "fa-archive", "fa-area-chart", "fa-arrow-circle-down", "fa-arrow-circle-left", "fa-arrow-circle-o-down", "fa-arrow-circle-o-left", "fa-arrow-circle-o-right", "fa-arrow-circle-o-up", "fa-arrow-circle-right", "fa-arrow-circle-up", "fa-arrow-down", "fa-arrow-left", "fa-arrow-right", "fa-arrow-up", "fa-arrows", "fa-arrows-alt", "fa-arrows-h", "fa-arrows-v", "fa-asl-interpreting", "fa-assistive-listening-systems", "fa-asterisk", "fa-at", "fa-audio-description", "fa-automobile", "fa-backward", "fa-balance-scale", "fa-ban", "fa-bank", "fa-bar-chart", "fa-bar-chart-o", "fa-barcode", "fa-bars", "fa-battery-0", "fa-battery-1", "fa-battery-2", "fa-battery-3", "fa-battery-4", "fa-battery-empty", "fa-battery-full", "fa-battery-half", "fa-battery-quarter", "fa-battery-three-quarters", "fa-bed", "fa-beer", "fa-behance", "fa-behance-square", "fa-bell", "fa-bell-o", "fa-bell-slash", "fa-bell-slash-o", "fa-bicycle", "fa-binoculars", "fa-birthday-cake", "fa-bitbucket", "fa-bitbucket-square", "fa-bitcoin", "fa-black-tie", "fa-blind", "fa-bluetooth", "fa-bluetooth-b", "fa-bold", "fa-bolt", "fa-bomb", "fa-book", "fa-bookmark", "fa-bookmark-o", "fa-braille", "fa-briefcase", "fa-btc", "fa-bug", "fa-building", "fa-building-o", "fa-bullhorn", "fa-bullseye", "fa-bus", "fa-buysellads", "fa-cab", "fa-calculator", "fa-calendar", "fa-calendar-check-o", "fa-calendar-minus-o", "fa-calendar-o", "fa-calendar-plus-o", "fa-calendar-times-o", "fa-camera", "fa-camera-retro", "fa-car", "fa-caret-down", "fa-caret-left", "fa-caret-right", "fa-caret-square-o-down", "fa-caret-square-o-left", "fa-caret-square-o-right", "fa-caret-square-o-up", "fa-caret-up", "fa-cart-arrow-down", "fa-cart-plus", "fa-cc", "fa-cc-amex", "fa-cc-diners-club", "fa-cc-discover", "fa-cc-jcb", "fa-cc-mastercard", "fa-cc-paypal", "fa-cc-stripe", "fa-cc-visa", "fa-certificate", "fa-chain", "fa-chain-broken", "fa-check", "fa-check-circle", "fa-check-circle-o", "fa-check-square", "fa-check-square-o", "fa-chevron-circle-down", "fa-chevron-circle-left", "fa-chevron-circle-right", "fa-chevron-circle-up", "fa-chevron-down", "fa-chevron-left", "fa-chevron-right", "fa-chevron-up", "fa-child", "fa-chrome", "fa-circle", "fa-circle-o", "fa-circle-o-notch", "fa-circle-thin", "fa-clipboard", "fa-clock-o", "fa-clone", "fa-close", "fa-cloud", "fa-cloud-download", "fa-cloud-upload", "fa-cny", "fa-code", "fa-code-fork", "fa-codepen", "fa-codiepie", "fa-coffee", "fa-cog", "fa-cogs", "fa-columns", "fa-comment", "fa-comment-o", "fa-commenting", "fa-commenting-o", "fa-comments", "fa-comments-o", "fa-compass", "fa-compress", "fa-connectdevelop", "fa-contao", "fa-copy", "fa-copyright", "fa-creative-commons", "fa-credit-card", "fa-credit-card-alt", "fa-crop", "fa-crosshairs", "fa-css3", "fa-cube", "fa-cubes", "fa-cut", "fa-cutlery", "fa-dashboard", "fa-dashcube", "fa-database", "fa-deaf", "fa-deafness", "fa-dedent", "fa-delicious", "fa-desktop", "fa-deviantart", "fa-diamond", "fa-digg", "fa-dollar", "fa-dot-circle-o", "fa-download", "fa-dribbble", "fa-dropbox", "fa-drupal", "fa-edge", "fa-edit", "fa-eject", "fa-ellipsis-h", "fa-ellipsis-v", "fa-empire", "fa-envelope", "fa-envelope-o", "fa-envelope-square", "fa-envira", "fa-eraser", "fa-eur", "fa-euro", "fa-exchange", "fa-exclamation", "fa-exclamation-circle", "fa-exclamation-triangle", "fa-expand", "fa-expeditedssl", "fa-external-link", "fa-external-link-square", "fa-eye", "fa-eye-slash", "fa-eyedropper", "fa-fa", "fa-facebook", "fa-facebook-f", "fa-facebook-official", "fa-facebook-square", "fa-fast-backward", "fa-fast-forward", "fa-fax", "fa-feed", "fa-female", "fa-fighter-jet", "fa-file", "fa-file-archive-o", "fa-file-audio-o", "fa-file-code-o", "fa-file-excel-o", "fa-file-image-o", "fa-file-movie-o", "fa-file-o", "fa-file-pdf-o", "fa-file-photo-o", "fa-file-picture-o", "fa-file-powerpoint-o", "fa-file-sound-o", "fa-file-text", "fa-file-text-o", "fa-file-video-o", "fa-file-word-o", "fa-file-zip-o", "fa-files-o", "fa-film", "fa-filter", "fa-fire", "fa-fire-extinguisher", "fa-firefox", "fa-first-order", "fa-flag", "fa-flag-checkered", "fa-flag-o", "fa-flash", "fa-flask", "fa-flickr", "fa-floppy-o", "fa-folder", "fa-folder-o", "fa-folder-open", "fa-folder-open-o", "fa-font", "fa-font-awesome", "fa-fonticons", "fa-fort-awesome", "fa-forumbee", "fa-forward", "fa-foursquare", "fa-frown-o", "fa-futbol-o", "fa-gamepad", "fa-gavel", "fa-gbp", "fa-ge", "fa-gear", "fa-gears", "fa-genderless", "fa-get-pocket", "fa-gg", "fa-gg-circle", "fa-gift", "fa-git", "fa-git-square", "fa-github", "fa-github-alt", "fa-github-square", "fa-gitlab", "fa-gittip", "fa-glass", "fa-glide", "fa-glide-g", "fa-globe", "fa-google", "fa-google-plus", "fa-google-plus-circle", "fa-google-plus-official", "fa-google-plus-square", "fa-google-wallet", "fa-graduation-cap", "fa-gratipay", "fa-group", "fa-h-square", "fa-hacker-news", "fa-hand-grab-o", "fa-hand-lizard-o", "fa-hand-o-down", "fa-hand-o-left", "fa-hand-o-right", "fa-hand-o-up", "fa-hand-paper-o", "fa-hand-peace-o", "fa-hand-pointer-o", "fa-hand-rock-o", "fa-hand-scissors-o", "fa-hand-spock-o", "fa-hand-stop-o", "fa-hard-of-hearing", "fa-hashtag", "fa-hdd-o", "fa-header", "fa-headphones", "fa-heart", "fa-heart-o", "fa-heartbeat", "fa-history", "fa-home", "fa-hospital-o", "fa-hotel", "fa-hourglass", "fa-hourglass-1", "fa-hourglass-2", "fa-hourglass-3", "fa-hourglass-end", "fa-hourglass-half", "fa-hourglass-o", "fa-hourglass-start", "fa-houzz", "fa-html5", "fa-i-cursor", "fa-ils", "fa-image", "fa-inbox", "fa-indent", "fa-industry", "fa-info", "fa-info-circle", "fa-inr", "fa-instagram", "fa-institution", "fa-internet-explorer", "fa-intersex", "fa-ioxhost", "fa-italic", "fa-joomla", "fa-jpy", "fa-jsfiddle", "fa-key", "fa-keyboard-o", "fa-krw", "fa-language", "fa-laptop", "fa-lastfm", "fa-lastfm-square", "fa-leaf", "fa-leanpub", "fa-legal", "fa-lemon-o", "fa-level-down", "fa-level-up", "fa-life-bouy", "fa-life-buoy", "fa-life-ring", "fa-life-saver", "fa-lightbulb-o", "fa-line-chart", "fa-link", "fa-linkedin", "fa-linkedin-square", "fa-linux", "fa-list", "fa-list-alt", "fa-list-ol", "fa-list-ul", "fa-location-arrow", "fa-lock", "fa-long-arrow-down", "fa-long-arrow-left", "fa-long-arrow-right", "fa-long-arrow-up", "fa-low-vision", "fa-magic", "fa-magnet", "fa-mail-forward", "fa-mail-reply", "fa-mail-reply-all", "fa-male", "fa-map", "fa-map-marker", "fa-map-o", "fa-map-pin", "fa-map-signs", "fa-mars", "fa-mars-double", "fa-mars-stroke", "fa-mars-stroke-h", "fa-mars-stroke-v", "fa-maxcdn", "fa-meanpath", "fa-medium", "fa-medkit", "fa-meh-o", "fa-mercury", "fa-microphone", "fa-microphone-slash", "fa-minus", "fa-minus-circle", "fa-minus-square", "fa-minus-square-o", "fa-mixcloud", "fa-mobile", "fa-mobile-phone", "fa-modx", "fa-money", "fa-moon-o", "fa-mortar-board", "fa-motorcycle", "fa-mouse-pointer", "fa-music", "fa-navicon", "fa-neuter", "fa-newspaper-o", "fa-object-group", "fa-object-ungroup", "fa-odnoklassniki", "fa-odnoklassniki-square", "fa-opencart", "fa-openid", "fa-opera", "fa-optin-monster", "fa-outdent", "fa-pagelines", "fa-paint-brush", "fa-paper-plane", "fa-paper-plane-o", "fa-paperclip", "fa-paragraph", "fa-paste", "fa-pause", "fa-pause-circle", "fa-pause-circle-o", "fa-paw", "fa-paypal", "fa-pencil", "fa-pencil-square", "fa-pencil-square-o", "fa-percent", "fa-phone", "fa-phone-square", "fa-photo", "fa-picture-o", "fa-pie-chart", "fa-pied-piper", "fa-pied-piper-alt", "fa-pied-piper-pp", "fa-pinterest", "fa-pinterest-p", "fa-pinterest-square", "fa-plane", "fa-play", "fa-play-circle", "fa-play-circle-o", "fa-plug", "fa-plus", "fa-plus-circle", "fa-plus-square", "fa-plus-square-o", "fa-power-off", "fa-print", "fa-product-hunt", "fa-puzzle-piece", "fa-qq", "fa-qrcode", "fa-question", "fa-question-circle", "fa-question-circle-o", "fa-quote-left", "fa-quote-right", "fa-ra", "fa-random", "fa-rebel", "fa-recycle", "fa-reddit", "fa-reddit-alien", "fa-reddit-square", "fa-refresh", "fa-registered", "fa-remove", "fa-renren", "fa-reorder", "fa-repeat", "fa-reply", "fa-reply-all", "fa-resistance", "fa-retweet", "fa-rmb", "fa-road", "fa-rocket", "fa-rotate-left", "fa-rotate-right", "fa-rouble", "fa-rss", "fa-rss-square", "fa-rub", "fa-ruble", "fa-rupee", "fa-safari", "fa-save", "fa-scissors", "fa-scribd", "fa-search", "fa-search-minus", "fa-search-plus", "fa-sellsy", "fa-send", "fa-send-o", "fa-server", "fa-share", "fa-share-alt", "fa-share-alt-square", "fa-share-square", "fa-share-square-o", "fa-shekel", "fa-sheqel", "fa-shield", "fa-ship", "fa-shirtsinbulk", "fa-shopping-bag", "fa-shopping-basket", "fa-shopping-cart", "fa-sign-in", "fa-sign-language", "fa-sign-out", "fa-signal", "fa-signing", "fa-simplybuilt", "fa-sitemap", "fa-skyatlas", "fa-skype", "fa-slack", "fa-sliders", "fa-slideshare", "fa-smile-o", "fa-snapchat", "fa-snapchat-ghost", "fa-snapchat-square", "fa-soccer-ball-o", "fa-sort", "fa-sort-alpha-asc", "fa-sort-alpha-desc", "fa-sort-amount-asc", "fa-sort-amount-desc", "fa-sort-asc", "fa-sort-desc", "fa-sort-down", "fa-sort-numeric-asc", "fa-sort-numeric-desc", "fa-sort-up", "fa-soundcloud", "fa-space-shuttle", "fa-spinner", "fa-spoon", "fa-spotify", "fa-square", "fa-square-o", "fa-stack-exchange", "fa-stack-overflow", "fa-star", "fa-star-half", "fa-star-half-empty", "fa-star-half-full", "fa-star-half-o", "fa-star-o", "fa-steam", "fa-steam-square", "fa-step-backward", "fa-step-forward", "fa-stethoscope", "fa-sticky-note", "fa-sticky-note-o", "fa-stop", "fa-stop-circle", "fa-stop-circle-o", "fa-street-view", "fa-strikethrough", "fa-stumbleupon", "fa-stumbleupon-circle", "fa-subscript", "fa-subway", "fa-suitcase", "fa-sun-o", "fa-superscript", "fa-support", "fa-table", "fa-tablet", "fa-tachometer", "fa-tag", "fa-tags", "fa-tasks", "fa-taxi", "fa-television", "fa-tencent-weibo", "fa-terminal", "fa-text-height", "fa-text-width", "fa-th", "fa-th-large", "fa-th-list", "fa-themeisle", "fa-thumb-tack", "fa-thumbs-down", "fa-thumbs-o-down", "fa-thumbs-o-up", "fa-thumbs-up", "fa-ticket", "fa-times", "fa-times-circle", "fa-times-circle-o", "fa-tint", "fa-toggle-down", "fa-toggle-left", "fa-toggle-off", "fa-toggle-on", "fa-toggle-right", "fa-toggle-up", "fa-trademark", "fa-train", "fa-transgender", "fa-transgender-alt", "fa-trash", "fa-trash-o", "fa-tree", "fa-trello", "fa-tripadvisor", "fa-trophy", "fa-truck", "fa-try", "fa-tty", "fa-tumblr", "fa-tumblr-square", "fa-turkish-lira", "fa-tv", "fa-twitch", "fa-twitter", "fa-twitter-square", "fa-umbrella", "fa-underline", "fa-undo", "fa-universal-access", "fa-university", "fa-unlink", "fa-unlock", "fa-unlock-alt", "fa-unsorted", "fa-upload", "fa-usb", "fa-usd", "fa-user", "fa-user-md", "fa-user-plus", "fa-user-secret", "fa-user-times", "fa-users", "fa-venus", "fa-venus-double", "fa-venus-mars", "fa-viacoin", "fa-viadeo", "fa-viadeo-square", "fa-video-camera", "fa-vimeo", "fa-vimeo-square", "fa-vine", "fa-vk", "fa-volume-control-phone", "fa-volume-down", "fa-volume-off", "fa-volume-up", "fa-warning", "fa-wechat", "fa-weibo", "fa-weixin", "fa-whatsapp", "fa-wheelchair", "fa-wheelchair-alt", "fa-wifi", "fa-wikipedia-w", "fa-windows", "fa-won", "fa-wordpress", "fa-wpbeginner", "fa-wpforms", "fa-wrench", "fa-xing", "fa-xing-square", "fa-y-combinator", "fa-y-combinator-square", "fa-yahoo", "fa-yc", "fa-yc-square", "fa-yelp", "fa-yen", "fa-yoast", "fa-youtube", "fa-youtube-play", "fa-youtube-square" ];
	}
);
