fontawesome-iconpicker.js 51 KB

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