fontawesome-iconpicker.js 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017
  1. (function(a, b) {
  2. a.ui = a.ui || {};
  3. 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;
  4. function m(a, b, c) {
  5. return [ parseFloat(a[0]) * (k.test(a[0]) ? b / 100 : 1), parseFloat(a[1]) * (k.test(a[1]) ? c / 100 : 1) ];
  6. }
  7. function n(b, c) {
  8. return parseInt(a.css(b, c), 10) || 0;
  9. }
  10. function o(b) {
  11. var c = b[0];
  12. if (c.nodeType === 9) {
  13. return {
  14. width: b.width(),
  15. height: b.height(),
  16. offset: {
  17. top: 0,
  18. left: 0
  19. }
  20. };
  21. }
  22. if (a.isWindow(c)) {
  23. return {
  24. width: b.width(),
  25. height: b.height(),
  26. offset: {
  27. top: b.scrollTop(),
  28. left: b.scrollLeft()
  29. }
  30. };
  31. }
  32. if (c.preventDefault) {
  33. return {
  34. width: 0,
  35. height: 0,
  36. offset: {
  37. top: c.pageY,
  38. left: c.pageX
  39. }
  40. };
  41. }
  42. return {
  43. width: b.outerWidth(),
  44. height: b.outerHeight(),
  45. offset: b.offset()
  46. };
  47. }
  48. a.pos = {
  49. scrollbarWidth: function() {
  50. if (c !== b) {
  51. return c;
  52. }
  53. 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];
  54. a("body").append(f);
  55. d = g.offsetWidth;
  56. f.css("overflow", "scroll");
  57. e = g.offsetWidth;
  58. if (d === e) {
  59. e = f[0].clientWidth;
  60. }
  61. f.remove();
  62. return c = d - e;
  63. },
  64. getScrollInfo: function(b) {
  65. 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;
  66. return {
  67. width: f ? a.pos.scrollbarWidth() : 0,
  68. height: e ? a.pos.scrollbarWidth() : 0
  69. };
  70. },
  71. getWithinInfo: function(b) {
  72. var c = a(b || window), d = a.isWindow(c[0]), e = !!c[0] && c[0].nodeType === 9;
  73. return {
  74. element: c,
  75. isWindow: d,
  76. isDocument: e,
  77. offset: c.offset() || {
  78. left: 0,
  79. top: 0
  80. },
  81. scrollLeft: c.scrollLeft(),
  82. scrollTop: c.scrollTop(),
  83. width: d ? c.width() : c.outerWidth(),
  84. height: d ? c.height() : c.outerHeight()
  85. };
  86. }
  87. };
  88. a.fn.pos = function(b) {
  89. if (!b || !b.of) {
  90. return l.apply(this, arguments);
  91. }
  92. b = a.extend({}, b);
  93. 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 = {};
  94. s = o(t);
  95. if (t[0].preventDefault) {
  96. b.at = "left top";
  97. }
  98. k = s.width;
  99. p = s.height;
  100. q = s.offset;
  101. r = a.extend({}, q);
  102. a.each([ "my", "at" ], function() {
  103. var a = (b[this] || "").split(" "), c, d;
  104. if (a.length === 1) {
  105. a = g.test(a[0]) ? a.concat([ "center" ]) : h.test(a[0]) ? [ "center" ].concat(a) : [ "center", "center" ];
  106. }
  107. a[0] = g.test(a[0]) ? a[0] : "center";
  108. a[1] = h.test(a[1]) ? a[1] : "center";
  109. c = i.exec(a[0]);
  110. d = i.exec(a[1]);
  111. x[this] = [ c ? c[0] : 0, d ? d[0] : 0 ];
  112. b[this] = [ j.exec(a[0])[0], j.exec(a[1])[0] ];
  113. });
  114. if (w.length === 1) {
  115. w[1] = w[0];
  116. }
  117. if (b.at[0] === "right") {
  118. r.left += k;
  119. } else if (b.at[0] === "center") {
  120. r.left += k / 2;
  121. }
  122. if (b.at[1] === "bottom") {
  123. r.top += p;
  124. } else if (b.at[1] === "center") {
  125. r.top += p / 2;
  126. }
  127. c = m(x.at, k, p);
  128. r.left += c[0];
  129. r.top += c[1];
  130. return this.each(function() {
  131. 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());
  132. if (b.my[0] === "right") {
  133. A.left -= j;
  134. } else if (b.my[0] === "center") {
  135. A.left -= j / 2;
  136. }
  137. if (b.my[1] === "bottom") {
  138. A.top -= l;
  139. } else if (b.my[1] === "center") {
  140. A.top -= l / 2;
  141. }
  142. A.left += B[0];
  143. A.top += B[1];
  144. if (!a.support.offsetFractions) {
  145. A.left = f(A.left);
  146. A.top = f(A.top);
  147. }
  148. g = {
  149. marginLeft: o,
  150. marginTop: s
  151. };
  152. a.each([ "left", "top" ], function(d, e) {
  153. if (a.ui.pos[w[d]]) {
  154. a.ui.pos[w[d]][e](A, {
  155. targetWidth: k,
  156. targetHeight: p,
  157. elemWidth: j,
  158. elemHeight: l,
  159. collisionPosition: g,
  160. collisionWidth: y,
  161. collisionHeight: z,
  162. offset: [ c[0] + B[0], c[1] + B[1] ],
  163. my: b.my,
  164. at: b.at,
  165. within: u,
  166. elem: i
  167. });
  168. }
  169. });
  170. if (b.using) {
  171. h = function(a) {
  172. var c = q.left - A.left, f = c + k - j, g = q.top - A.top, h = g + p - l, m = {
  173. target: {
  174. element: t,
  175. left: q.left,
  176. top: q.top,
  177. width: k,
  178. height: p
  179. },
  180. element: {
  181. element: i,
  182. left: A.left,
  183. top: A.top,
  184. width: j,
  185. height: l
  186. },
  187. horizontal: f < 0 ? "left" : c > 0 ? "right" : "center",
  188. vertical: h < 0 ? "top" : g > 0 ? "bottom" : "middle"
  189. };
  190. if (k < j && e(c + f) < k) {
  191. m.horizontal = "center";
  192. }
  193. if (p < l && e(g + h) < p) {
  194. m.vertical = "middle";
  195. }
  196. if (d(e(c), e(f)) > d(e(g), e(h))) {
  197. m.important = "horizontal";
  198. } else {
  199. m.important = "vertical";
  200. }
  201. b.using.call(this, a, m);
  202. };
  203. }
  204. i.offset(a.extend(A, {
  205. using: h
  206. }));
  207. });
  208. };
  209. a.ui.pos = {
  210. _trigger: function(a, b, c, d) {
  211. if (b.elem) {
  212. b.elem.trigger({
  213. type: c,
  214. position: a,
  215. positionData: b,
  216. triggered: d
  217. });
  218. }
  219. },
  220. fit: {
  221. left: function(b, c) {
  222. a.ui.pos._trigger(b, c, "posCollide", "fitLeft");
  223. 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;
  224. if (c.collisionWidth > g) {
  225. if (i > 0 && j <= 0) {
  226. k = b.left + i + c.collisionWidth - g - f;
  227. b.left += i - k;
  228. } else if (j > 0 && i <= 0) {
  229. b.left = f;
  230. } else {
  231. if (i > j) {
  232. b.left = f + g - c.collisionWidth;
  233. } else {
  234. b.left = f;
  235. }
  236. }
  237. } else if (i > 0) {
  238. b.left += i;
  239. } else if (j > 0) {
  240. b.left -= j;
  241. } else {
  242. b.left = d(b.left - h, b.left);
  243. }
  244. a.ui.pos._trigger(b, c, "posCollided", "fitLeft");
  245. },
  246. top: function(b, c) {
  247. a.ui.pos._trigger(b, c, "posCollide", "fitTop");
  248. 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;
  249. if (c.collisionHeight > g) {
  250. if (i > 0 && j <= 0) {
  251. k = b.top + i + c.collisionHeight - g - f;
  252. b.top += i - k;
  253. } else if (j > 0 && i <= 0) {
  254. b.top = f;
  255. } else {
  256. if (i > j) {
  257. b.top = f + g - c.collisionHeight;
  258. } else {
  259. b.top = f;
  260. }
  261. }
  262. } else if (i > 0) {
  263. b.top += i;
  264. } else if (j > 0) {
  265. b.top -= j;
  266. } else {
  267. b.top = d(b.top - h, b.top);
  268. }
  269. a.ui.pos._trigger(b, c, "posCollided", "fitTop");
  270. }
  271. },
  272. flip: {
  273. left: function(b, c) {
  274. a.ui.pos._trigger(b, c, "posCollide", "flipLeft");
  275. 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;
  276. if (j < 0) {
  277. o = b.left + l + m + n + c.collisionWidth - g - f;
  278. if (o < 0 || o < e(j)) {
  279. b.left += l + m + n;
  280. }
  281. } else if (k > 0) {
  282. p = b.left - c.collisionPosition.marginLeft + l + m + n - h;
  283. if (p > 0 || e(p) < k) {
  284. b.left += l + m + n;
  285. }
  286. }
  287. a.ui.pos._trigger(b, c, "posCollided", "flipLeft");
  288. },
  289. top: function(b, c) {
  290. a.ui.pos._trigger(b, c, "posCollide", "flipTop");
  291. 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;
  292. if (j < 0) {
  293. q = b.top + m + n + o + c.collisionHeight - g - f;
  294. if (b.top + m + n + o > j && (q < 0 || q < e(j))) {
  295. b.top += m + n + o;
  296. }
  297. } else if (k > 0) {
  298. p = b.top - c.collisionPosition.marginTop + m + n + o - h;
  299. if (b.top + m + n + o > k && (p > 0 || e(p) < k)) {
  300. b.top += m + n + o;
  301. }
  302. }
  303. a.ui.pos._trigger(b, c, "posCollided", "flipTop");
  304. }
  305. },
  306. flipfit: {
  307. left: function() {
  308. a.ui.pos.flip.left.apply(this, arguments);
  309. a.ui.pos.fit.left.apply(this, arguments);
  310. },
  311. top: function() {
  312. a.ui.pos.flip.top.apply(this, arguments);
  313. a.ui.pos.fit.top.apply(this, arguments);
  314. }
  315. }
  316. };
  317. (function() {
  318. var b, c, d, e, f, g = document.getElementsByTagName("body")[0], h = document.createElement("div");
  319. b = document.createElement(g ? "div" : "body");
  320. d = {
  321. visibility: "hidden",
  322. width: 0,
  323. height: 0,
  324. border: 0,
  325. margin: 0,
  326. background: "none"
  327. };
  328. if (g) {
  329. a.extend(d, {
  330. position: "absolute",
  331. left: "-1000px",
  332. top: "-1000px"
  333. });
  334. }
  335. for (f in d) {
  336. b.style[f] = d[f];
  337. }
  338. b.appendChild(h);
  339. c = g || document.documentElement;
  340. c.insertBefore(b, c.firstChild);
  341. h.style.cssText = "position: absolute; left: 10.7432222px;";
  342. e = a(h).offset().left;
  343. a.support.offsetFractions = e > 10 && e < 11;
  344. b.innerHTML = "";
  345. c.removeChild(b);
  346. })();
  347. })(jQuery);
  348. (function(a) {
  349. "use strict";
  350. if (typeof define === "function" && define.amd) {
  351. define([ "jquery" ], a);
  352. } else if (window.jQuery && !window.jQuery.fn.iconpicker) {
  353. a(window.jQuery);
  354. }
  355. })(function(a) {
  356. "use strict";
  357. var b = {
  358. isEmpty: function(a) {
  359. return a === false || a === "" || a === null || a === undefined;
  360. },
  361. isEmptyObject: function(a) {
  362. return this.isEmpty(a) === true || a.length === 0;
  363. },
  364. isElement: function(b) {
  365. return a(b).length > 0;
  366. },
  367. isString: function(a) {
  368. return typeof a === "string" || a instanceof String;
  369. },
  370. isArray: function(b) {
  371. return a.isArray(b);
  372. },
  373. inArray: function(b, c) {
  374. return a.inArray(b, c) !== -1;
  375. },
  376. throwError: function(a) {
  377. throw "Font Awesome Icon Picker Exception: " + a;
  378. }
  379. };
  380. var c = function(d, e) {
  381. this._id = c._idCounter++;
  382. this.element = a(d).addClass("iconpicker-element");
  383. this._trigger("iconpickerCreate");
  384. this.options = a.extend({}, c.defaultOptions, this.element.data(), e);
  385. this.options.templates = a.extend({}, c.defaultOptions.templates, this.options.templates);
  386. this.options.originalPlacement = this.options.placement;
  387. this.container = b.isElement(this.options.container) ? a(this.options.container) : false;
  388. if (this.container === false) {
  389. if (this.element.is(".dropdown-toggle")) {
  390. this.container = a("~ .dropdown-menu:first", this.element);
  391. } else {
  392. this.container = this.element.is("input,textarea,button,.btn") ? this.element.parent() : this.element;
  393. }
  394. }
  395. this.container.addClass("iconpicker-container");
  396. if (this.isDropdownMenu()) {
  397. this.options.templates.search = false;
  398. this.options.templates.buttons = false;
  399. this.options.placement = "inline";
  400. }
  401. this.input = this.element.is("input,textarea") ? this.element.addClass("iconpicker-input") : false;
  402. if (this.input === false) {
  403. this.input = this.container.find(this.options.input);
  404. if (!this.input.is("input,textarea")) {
  405. this.input = false;
  406. }
  407. }
  408. this.component = this.isDropdownMenu() ? this.container.parent().find(this.options.component) : this.container.find(this.options.component);
  409. if (this.component.length === 0) {
  410. this.component = false;
  411. } else {
  412. this.component.find("i").addClass("iconpicker-component");
  413. }
  414. this._createPopover();
  415. this._createIconpicker();
  416. if (this.getAcceptButton().length === 0) {
  417. this.options.mustAccept = false;
  418. }
  419. if (this.isInputGroup()) {
  420. this.container.parent().append(this.popover);
  421. } else {
  422. this.container.append(this.popover);
  423. }
  424. this._bindElementEvents();
  425. this._bindWindowEvents();
  426. this.update(this.options.selected);
  427. if (this.isInline()) {
  428. this.show();
  429. }
  430. this._trigger("iconpickerCreated");
  431. };
  432. c._idCounter = 0;
  433. c.defaultOptions = {
  434. title: false,
  435. selected: false,
  436. defaultValue: false,
  437. placement: "bottom",
  438. collision: "none",
  439. animation: true,
  440. hideOnSelect: false,
  441. showFooter: false,
  442. searchInFooter: false,
  443. mustAccept: false,
  444. selectedCustomClass: "bg-primary",
  445. icons: [],
  446. fullClassFormatter: function(a) {
  447. return "fa " + a;
  448. },
  449. input: "input,.iconpicker-input",
  450. inputSearch: false,
  451. container: false,
  452. component: ".input-group-addon,.iconpicker-component",
  453. templates: {
  454. popover: '<div class="iconpicker-popover popover"><div class="arrow"></div>' + '<div class="popover-title"></div><div class="popover-content"></div></div>',
  455. footer: '<div class="popover-footer"></div>',
  456. 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>',
  457. search: '<input type="search" class="form-control iconpicker-search" placeholder="Type to filter" />',
  458. iconpicker: '<div class="iconpicker"><div class="iconpicker-items"></div></div>',
  459. iconpickerItem: '<a role="button" href="#" class="iconpicker-item"><i></i></a>'
  460. }
  461. };
  462. c.batch = function(b, c) {
  463. var d = Array.prototype.slice.call(arguments, 2);
  464. return a(b).each(function() {
  465. var b = a(this).data("iconpicker");
  466. if (!!b) {
  467. b[c].apply(b, d);
  468. }
  469. });
  470. };
  471. c.prototype = {
  472. constructor: c,
  473. options: {},
  474. _id: 0,
  475. _trigger: function(b, c) {
  476. c = c || {};
  477. this.element.trigger(a.extend({
  478. type: b,
  479. iconpickerInstance: this
  480. }, c));
  481. },
  482. _createPopover: function() {
  483. this.popover = a(this.options.templates.popover);
  484. var c = this.popover.find(".popover-title");
  485. if (!!this.options.title) {
  486. c.append(a('<div class="popover-title-text">' + this.options.title + "</div>"));
  487. }
  488. if (this.hasSeparatedSearchInput() && !this.options.searchInFooter) {
  489. c.append(this.options.templates.search);
  490. } else if (!this.options.title) {
  491. c.remove();
  492. }
  493. if (this.options.showFooter && !b.isEmpty(this.options.templates.footer)) {
  494. var d = a(this.options.templates.footer);
  495. if (this.hasSeparatedSearchInput() && this.options.searchInFooter) {
  496. d.append(a(this.options.templates.search));
  497. }
  498. if (!b.isEmpty(this.options.templates.buttons)) {
  499. d.append(a(this.options.templates.buttons));
  500. }
  501. this.popover.append(d);
  502. }
  503. if (this.options.animation === true) {
  504. this.popover.addClass("fade");
  505. }
  506. return this.popover;
  507. },
  508. _createIconpicker: function() {
  509. var b = this;
  510. this.iconpicker = a(this.options.templates.iconpicker);
  511. var c = function(c) {
  512. var d = a(this);
  513. if (d.is("i")) {
  514. d = d.parent();
  515. }
  516. b._trigger("iconpickerSelect", {
  517. iconpickerItem: d,
  518. iconpickerValue: b.iconpickerValue
  519. });
  520. if (b.options.mustAccept === false) {
  521. b.update(d.data("iconpickerValue"));
  522. b._trigger("iconpickerSelected", {
  523. iconpickerItem: this,
  524. iconpickerValue: b.iconpickerValue
  525. });
  526. } else {
  527. b.update(d.data("iconpickerValue"), true);
  528. }
  529. if (b.options.hideOnSelect && b.options.mustAccept === false) {
  530. b.hide();
  531. }
  532. c.preventDefault();
  533. return false;
  534. };
  535. for (var d in this.options.icons) {
  536. var e = a(this.options.templates.iconpickerItem);
  537. e.find("i").addClass(this.options.fullClassFormatter(this.options.icons[d]));
  538. e.data("iconpickerValue", this.options.icons[d]).on("click.iconpicker", c);
  539. this.iconpicker.find(".iconpicker-items").append(e.attr("title", "." + this.options.icons[d]));
  540. }
  541. this.popover.find(".popover-content").append(this.iconpicker);
  542. return this.iconpicker;
  543. },
  544. _isEventInsideIconpicker: function(b) {
  545. var c = a(b.target);
  546. if ((!c.hasClass("iconpicker-element") || c.hasClass("iconpicker-element") && !c.is(this.element)) && c.parents(".iconpicker-popover").length === 0) {
  547. return false;
  548. }
  549. return true;
  550. },
  551. _bindElementEvents: function() {
  552. var c = this;
  553. this.getSearchInput().on("keyup.iconpicker", function() {
  554. c.filter(a(this).val().toLowerCase());
  555. });
  556. this.getAcceptButton().on("click.iconpicker", function() {
  557. var a = c.iconpicker.find(".iconpicker-selected").get(0);
  558. c.update(c.iconpickerValue);
  559. c._trigger("iconpickerSelected", {
  560. iconpickerItem: a,
  561. iconpickerValue: c.iconpickerValue
  562. });
  563. if (!c.isInline()) {
  564. c.hide();
  565. }
  566. });
  567. this.getCancelButton().on("click.iconpicker", function() {
  568. if (!c.isInline()) {
  569. c.hide();
  570. }
  571. });
  572. this.element.on("focus.iconpicker", function(a) {
  573. c.show();
  574. a.stopPropagation();
  575. });
  576. if (this.hasComponent()) {
  577. this.component.on("click.iconpicker", function() {
  578. c.toggle();
  579. });
  580. }
  581. if (this.hasInput()) {
  582. this.input.on("keyup.iconpicker", function(d) {
  583. 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 ])) {
  584. c.update();
  585. } else {
  586. c._updateFormGroupStatus(c.getValid(this.value) !== false);
  587. }
  588. if (c.options.inputSearch === true) {
  589. c.filter(a(this).val().toLowerCase());
  590. }
  591. });
  592. }
  593. },
  594. _bindWindowEvents: function() {
  595. var b = a(window.document);
  596. var c = this;
  597. var d = ".iconpicker.inst" + this._id;
  598. a(window).on("resize.iconpicker" + d + " orientationchange.iconpicker" + d, function(a) {
  599. if (c.popover.hasClass("in")) {
  600. c.updatePlacement();
  601. }
  602. });
  603. if (!c.isInline()) {
  604. b.on("mouseup" + d, function(a) {
  605. if (!c._isEventInsideIconpicker(a) && !c.isInline()) {
  606. c.hide();
  607. }
  608. a.stopPropagation();
  609. a.preventDefault();
  610. return false;
  611. });
  612. }
  613. return false;
  614. },
  615. _unbindElementEvents: function() {
  616. this.popover.off(".iconpicker");
  617. this.element.off(".iconpicker");
  618. if (this.hasInput()) {
  619. this.input.off(".iconpicker");
  620. }
  621. if (this.hasComponent()) {
  622. this.component.off(".iconpicker");
  623. }
  624. if (this.hasContainer()) {
  625. this.container.off(".iconpicker");
  626. }
  627. },
  628. _unbindWindowEvents: function() {
  629. a(window).off(".iconpicker.inst" + this._id);
  630. a(window.document).off(".iconpicker.inst" + this._id);
  631. },
  632. updatePlacement: function(b, c) {
  633. b = b || this.options.placement;
  634. this.options.placement = b;
  635. c = c || this.options.collision;
  636. c = c === true ? "flip" : c;
  637. var d = {
  638. at: "right bottom",
  639. my: "right top",
  640. of: this.hasInput() && !this.isInputGroup() ? this.input : this.container,
  641. collision: c === true ? "flip" : c,
  642. within: window
  643. };
  644. this.popover.removeClass("inline topLeftCorner topLeft top topRight topRightCorner " + "rightTop right rightBottom bottomRight bottomRightCorner " + "bottom bottomLeft bottomLeftCorner leftBottom left leftTop");
  645. if (typeof b === "object") {
  646. return this.popover.pos(a.extend({}, d, b));
  647. }
  648. switch (b) {
  649. case "inline":
  650. {
  651. d = false;
  652. }
  653. break;
  654. case "topLeftCorner":
  655. {
  656. d.my = "right bottom";
  657. d.at = "left top";
  658. }
  659. break;
  660. case "topLeft":
  661. {
  662. d.my = "left bottom";
  663. d.at = "left top";
  664. }
  665. break;
  666. case "top":
  667. {
  668. d.my = "center bottom";
  669. d.at = "center top";
  670. }
  671. break;
  672. case "topRight":
  673. {
  674. d.my = "right bottom";
  675. d.at = "right top";
  676. }
  677. break;
  678. case "topRightCorner":
  679. {
  680. d.my = "left bottom";
  681. d.at = "right top";
  682. }
  683. break;
  684. case "rightTop":
  685. {
  686. d.my = "left bottom";
  687. d.at = "right center";
  688. }
  689. break;
  690. case "right":
  691. {
  692. d.my = "left center";
  693. d.at = "right center";
  694. }
  695. break;
  696. case "rightBottom":
  697. {
  698. d.my = "left top";
  699. d.at = "right center";
  700. }
  701. break;
  702. case "bottomRightCorner":
  703. {
  704. d.my = "left top";
  705. d.at = "right bottom";
  706. }
  707. break;
  708. case "bottomRight":
  709. {
  710. d.my = "right top";
  711. d.at = "right bottom";
  712. }
  713. break;
  714. case "bottom":
  715. {
  716. d.my = "center top";
  717. d.at = "center bottom";
  718. }
  719. break;
  720. case "bottomLeft":
  721. {
  722. d.my = "left top";
  723. d.at = "left bottom";
  724. }
  725. break;
  726. case "bottomLeftCorner":
  727. {
  728. d.my = "right top";
  729. d.at = "left bottom";
  730. }
  731. break;
  732. case "leftBottom":
  733. {
  734. d.my = "right top";
  735. d.at = "left center";
  736. }
  737. break;
  738. case "left":
  739. {
  740. d.my = "right center";
  741. d.at = "left center";
  742. }
  743. break;
  744. case "leftTop":
  745. {
  746. d.my = "right bottom";
  747. d.at = "left center";
  748. }
  749. break;
  750. default:
  751. {
  752. return false;
  753. }
  754. break;
  755. }
  756. this.popover.css({
  757. display: this.options.placement === "inline" ? "" : "block"
  758. });
  759. if (d !== false) {
  760. this.popover.pos(d).css("maxWidth", a(window).width() - this.container.offset().left - 5);
  761. } else {
  762. this.popover.css({
  763. top: "auto",
  764. right: "auto",
  765. bottom: "auto",
  766. left: "auto",
  767. maxWidth: "none"
  768. });
  769. }
  770. this.popover.addClass(this.options.placement);
  771. return true;
  772. },
  773. _updateComponents: function() {
  774. this.iconpicker.find(".iconpicker-item.iconpicker-selected").removeClass("iconpicker-selected " + this.options.selectedCustomClass);
  775. if (this.iconpickerValue) {
  776. this.iconpicker.find("." + this.options.fullClassFormatter(this.iconpickerValue).replace(/ /g, ".")).parent().addClass("iconpicker-selected " + this.options.selectedCustomClass);
  777. }
  778. if (this.hasComponent()) {
  779. var a = this.component.find("i");
  780. if (a.length > 0) {
  781. a.attr("class", this.options.fullClassFormatter(this.iconpickerValue));
  782. } else {
  783. this.component.html(this.getHtml());
  784. }
  785. }
  786. },
  787. _updateFormGroupStatus: function(a) {
  788. if (this.hasInput()) {
  789. if (a !== false) {
  790. this.input.parents(".form-group:first").removeClass("has-error");
  791. } else {
  792. this.input.parents(".form-group:first").addClass("has-error");
  793. }
  794. return true;
  795. }
  796. return false;
  797. },
  798. getValid: function(c) {
  799. if (!b.isString(c)) {
  800. c = "";
  801. }
  802. var d = c === "";
  803. c = a.trim(c);
  804. if (b.inArray(c, this.options.icons) || d) {
  805. return c;
  806. }
  807. return false;
  808. },
  809. setValue: function(a) {
  810. var b = this.getValid(a);
  811. if (b !== false) {
  812. this.iconpickerValue = b;
  813. this._trigger("iconpickerSetValue", {
  814. iconpickerValue: b
  815. });
  816. return this.iconpickerValue;
  817. } else {
  818. this._trigger("iconpickerInvalid", {
  819. iconpickerValue: a
  820. });
  821. return false;
  822. }
  823. },
  824. getHtml: function() {
  825. return '<i class="' + this.options.fullClassFormatter(this.iconpickerValue) + '"></i>';
  826. },
  827. setSourceValue: function(a) {
  828. a = this.setValue(a);
  829. if (a !== false && a !== "") {
  830. if (this.hasInput()) {
  831. this.input.val(this.iconpickerValue);
  832. } else {
  833. this.element.data("iconpickerValue", this.iconpickerValue);
  834. }
  835. this._trigger("iconpickerSetSourceValue", {
  836. iconpickerValue: a
  837. });
  838. }
  839. return a;
  840. },
  841. getSourceValue: function(a) {
  842. a = a || this.options.defaultValue;
  843. var b = a;
  844. if (this.hasInput()) {
  845. b = this.input.val();
  846. } else {
  847. b = this.element.data("iconpickerValue");
  848. }
  849. if (b === undefined || b === "" || b === null || b === false) {
  850. b = a;
  851. }
  852. return b;
  853. },
  854. hasInput: function() {
  855. return this.input !== false;
  856. },
  857. isInputSearch: function() {
  858. return this.hasInput() && this.options.inputSearch === true;
  859. },
  860. isInputGroup: function() {
  861. return this.container.is(".input-group");
  862. },
  863. isDropdownMenu: function() {
  864. return this.container.is(".dropdown-menu");
  865. },
  866. hasSeparatedSearchInput: function() {
  867. return this.options.templates.search !== false && !this.isInputSearch();
  868. },
  869. hasComponent: function() {
  870. return this.component !== false;
  871. },
  872. hasContainer: function() {
  873. return this.container !== false;
  874. },
  875. getAcceptButton: function() {
  876. return this.popover.find(".iconpicker-btn-accept");
  877. },
  878. getCancelButton: function() {
  879. return this.popover.find(".iconpicker-btn-cancel");
  880. },
  881. getSearchInput: function() {
  882. return this.popover.find(".iconpicker-search");
  883. },
  884. filter: function(c) {
  885. if (b.isEmpty(c)) {
  886. this.iconpicker.find(".iconpicker-item").show();
  887. return a(false);
  888. } else {
  889. var d = [];
  890. this.iconpicker.find(".iconpicker-item").each(function() {
  891. var b = a(this);
  892. var e = b.attr("title").toLowerCase();
  893. var f = false;
  894. try {
  895. f = new RegExp(c, "g");
  896. } catch (g) {
  897. f = false;
  898. }
  899. if (f !== false && e.match(f)) {
  900. d.push(b);
  901. b.show();
  902. } else {
  903. b.hide();
  904. }
  905. });
  906. return d;
  907. }
  908. },
  909. show: function() {
  910. if (this.popover.hasClass("in")) {
  911. return false;
  912. }
  913. a.iconpicker.batch(a(".iconpicker-popover.in:not(.inline)").not(this.popover), "hide");
  914. this._trigger("iconpickerShow");
  915. this.updatePlacement();
  916. this.popover.addClass("in");
  917. setTimeout(a.proxy(function() {
  918. this.popover.css("display", this.isInline() ? "" : "block");
  919. this._trigger("iconpickerShown");
  920. }, this), this.options.animation ? 300 : 1);
  921. },
  922. hide: function() {
  923. if (!this.popover.hasClass("in")) {
  924. return false;
  925. }
  926. this._trigger("iconpickerHide");
  927. this.popover.removeClass("in");
  928. setTimeout(a.proxy(function() {
  929. this.popover.css("display", "none");
  930. this.getSearchInput().val("");
  931. this.filter("");
  932. this._trigger("iconpickerHidden");
  933. }, this), this.options.animation ? 300 : 1);
  934. },
  935. toggle: function() {
  936. if (this.popover.is(":visible")) {
  937. this.hide();
  938. } else {
  939. this.show(true);
  940. }
  941. },
  942. update: function(a, b) {
  943. a = a ? a : this.getSourceValue(this.iconpickerValue);
  944. this._trigger("iconpickerUpdate");
  945. if (b === true) {
  946. a = this.setValue(a);
  947. } else {
  948. a = this.setSourceValue(a);
  949. this._updateFormGroupStatus(a !== false);
  950. }
  951. if (a !== false) {
  952. this._updateComponents();
  953. }
  954. this._trigger("iconpickerUpdated");
  955. return a;
  956. },
  957. destroy: function() {
  958. this._trigger("iconpickerDestroy");
  959. this.element.removeData("iconpicker").removeData("iconpickerValue").removeClass("iconpicker-element");
  960. this._unbindElementEvents();
  961. this._unbindWindowEvents();
  962. a(this.popover).remove();
  963. this._trigger("iconpickerDestroyed");
  964. },
  965. disable: function() {
  966. if (this.hasInput()) {
  967. this.input.prop("disabled", true);
  968. return true;
  969. }
  970. return false;
  971. },
  972. enable: function() {
  973. if (this.hasInput()) {
  974. this.input.prop("disabled", false);
  975. return true;
  976. }
  977. return false;
  978. },
  979. isDisabled: function() {
  980. if (this.hasInput()) {
  981. return this.input.prop("disabled") === true;
  982. }
  983. return false;
  984. },
  985. isInline: function() {
  986. return this.options.placement === "inline" || this.popover.hasClass("inline");
  987. }
  988. };
  989. a.iconpicker = c;
  990. a.fn.iconpicker = function(b) {
  991. return this.each(function() {
  992. var d = a(this);
  993. if (!d.data("iconpicker")) {
  994. d.data("iconpicker", new c(this, typeof b === "object" ? b : {}));
  995. }
  996. });
  997. };
  998. 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-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-asterisk","fa-at","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-bold","fa-bolt","fa-bomb","fa-book","fa-bookmark","fa-bookmark-o","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-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-crop","fa-crosshairs","fa-css3","fa-cube","fa-cubes","fa-cut","fa-cutlery","fa-dashboard","fa-dashcube","fa-database","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-edit","fa-eject","fa-ellipsis-h","fa-ellipsis-v","fa-empire","fa-envelope","fa-envelope-o","fa-envelope-square","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-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-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-fonticons","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-gittip","fa-glass","fa-globe","fa-google","fa-google-plus","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-scissors-o","fa-hand-spock-o","fa-hand-stop-o","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-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-double","fa-mars-stroke","fa-mars-stroke-h","fa-mars-stroke-v","fa-maxcdn","fa-meanpath","fa-medium","fa-medkit","fa-mercury","fa-microphone","fa-microphone-slash","fa-minus","fa-minus-circle","fa-minus-square","fa-minus-square-o","fa-mobile","fa-mobile-phone","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-paw","fa-paypal","fa-pencil","fa-pencil-square","fa-pencil-square-o","fa-phone","fa-phone-square","fa-photo","fa-picture-o","fa-pie-chart","fa-pied-piper","fa-pied-piper-alt","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-puzzle-piece","fa-qq","fa-qrcode","fa-question","fa-question-circle","fa-quote-left","fa-quote-right","fa-ra","fa-random","fa-rebel","fa-recycle","fa-reddit","fa-reddit-square","fa-refresh","fa-registered","fa-remove","fa-renren","fa-reorder","fa-repeat","fa-reply","fa-reply-all","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-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-cart","fa-sign-in","fa-sign-out","fa-signal","fa-simplybuilt","fa-sitemap","fa-skyatlas","fa-skype","fa-slack","fa-sliders","fa-slideshare","fa-smile-o","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-steam","fa-steam-square","fa-star","fa-star-half","fa-star-half-empty","fa-star-half-full","fa-star-half-o","fa-star-o","fa-step-backward","fa-step-forward","fa-stethoscope","fa-sticky-note","fa-sticky-note-o","fa-stop","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-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-university","fa-unlink","fa-unlock","fa-unlock-alt","fa-unsorted","fa-upload","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-video-camera","fa-vimeo","fa-vimeo-square","fa-vine","fa-vk","fa-volume-down","fa-volume-off","fa-volume-up","fa-warning","fa-wechat","fa-weibo","fa-weixin","fa-whatsapp","fa-wheelchair","fa-wifi","fa-wikipedia-w","fa-windows","fa-won","fa-wordpress","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-youtube","fa-youtube-play","fa-youtube-square"];
  999. });