PageRenderTime 61ms CodeModel.GetById 31ms RepoModel.GetById 0ms app.codeStats 0ms

/inlinecurrency.js

https://gitlab.com/mshepherd/inlinecurrencyconverter
JavaScript | 400 lines | 383 code | 17 blank | 0 comment | 25 complexity | 317f0d0e440cd2adc8c4147c495aa056 MD5 | raw file
  1. var rates = {};
  2. var currencies = [
  3. "AUD", "BGN", "BRL", "CAD", "CHF",
  4. "CNY", "CZK", "DKK", "EUR", "GBP", "HKD",
  5. "HRK", "HUF", "IDR", "ILS", "INR",
  6. "JPY", "KRW", "MXN", "MYR", "NOK",
  7. "NZD", "PHP", "PLN", "RON", "RUB",
  8. "SEK", "SGD", "THB", "TRY", "USD", "ZAR"
  9. ];
  10. var valueRegex = /(^|\W)([A-Za-z]{3})\s?(\d+(\.\d{2})?)(-(\d+(\.\d{2})?))?($|\W)/im;
  11. var classRegex = /([A-Za-z]{3}\d+(\.\d{2})?(-\d+(\.\d{2})?)?)/igm;
  12. var currencyClass = "currency";
  13. var elementQuery = "." + currencyClass;
  14. var targetCcy = undefined;
  15. var targetCcyDefault = "EUR";
  16. var ddmIdStr = "currencyDDM";
  17. var ddmClassStr = "currencyDDM";
  18. var apiURL = "http://api.fixer.io/latest?base=" // "api/";
  19. var markTextWithClass = function(regex, classStr) {
  20. var textNodes = getTextNodesIn(jQuery("body"));
  21. textNodes.replaceWith(function() {
  22. var text = jQuery(this)[0].textContent;
  23. return text.replace(regex, '<span class="' + classStr + '">$1</span>');
  24. });
  25. };
  26. var getRates = function(targetCurrency, updateElements) {
  27. targetCurrency = targetCurrency.toUpperCase();
  28. jQuery.getJSON( apiURL + targetCurrency, function(data) {
  29. var r;
  30. if (targetCurrency in rates)
  31. r = rates[targetCurrency];
  32. else {
  33. r = {};
  34. rates[targetCurrency] = r;
  35. }
  36. jQuery.extend(r, data.rates);
  37. jQuery.each(data.rates, function(curr, val ) {
  38. if (!(curr in rates))
  39. rates[curr] = {};
  40. rates[curr][targetCurrency] = 1/val;
  41. });
  42. if (updateElements)
  43. jQuery(elementQuery).each(convertElement(targetCurrency));
  44. });
  45. };
  46. var convertElement = function(targetCurrency) {
  47. targetCurrency = targetCurrency.toUpperCase();
  48. return function(index) {
  49. var text = jQuery(this).text();
  50. var matches = valueRegex.exec(text);
  51. var baseCurrency = matches[2].toUpperCase();
  52. var value = parseFloat(matches[3]);
  53. var isRange = matches[6] ? true : false;
  54. var valueTo = isRange ? parseFloat(matches[6]) : undefined;
  55. var rate = 0;
  56. if (baseCurrency !== targetCurrency && baseCurrency in rates && targetCurrency in rates[baseCurrency])
  57. rate = rates[baseCurrency][targetCurrency];
  58. text = baseCurrency + ' ' + matches[3];
  59. if (isRange)
  60. text += '-' + matches[6];
  61. if (rate) {
  62. var valueConverted = value * rate;
  63. text += ' (' + targetCurrency + ' ' + valueConverted.toFixed(2);
  64. if (isRange) {
  65. var valueToConverted = valueTo * rate;
  66. text += '-' + valueToConverted.toFixed(2);
  67. }
  68. text += ')';
  69. }
  70. jQuery(this).html(text);
  71. };
  72. };
  73. var getTextNodesIn = function(el) {
  74. return jQuery(el).find(":not(iframe)").addBack().contents().filter(function() {
  75. return this.nodeType === 3;
  76. });
  77. };
  78. var initDropDownMenu = function(parent, idStr, classStr, defaultCurr, currs) {
  79. if (!idStr)
  80. idStr = ddmIdStr;
  81. if (!classStr)
  82. classStr = ddmClassStr;
  83. if (!defaultCurr)
  84. defaultCurr = targetCcy;
  85. if (!currs)
  86. currs = currencies;
  87. html = '<select id="' + idStr + '" class="' + classStr + '">';
  88. for (var i = 0; i < currs.length; i++)
  89. html += '<option value="' + currs[i] + '"' +
  90. (defaultCurr === currs[i] ? ' selected="selected"' : '') + '>' +
  91. currs[i] + '</option>';
  92. html += '</select>';
  93. jQuery(html).on('change', function() {
  94. setTargetCcy(jQuery(this).val(), false);
  95. getRates(targetCcy, true);
  96. }).appendTo(parent);
  97. };
  98. var getTargetCcy = function(doGetRates) {
  99. if (!targetCcy && "localStorage" in window && window.localStorage.getItem('targetCcy'))
  100. setTargetCcy(window.localStorage.getItem('targetCcy'), true);
  101. else if (!targetCcy) {
  102. jQuery.getJSON('http://ipinfo.io', function(data) {
  103. console.log(data);
  104. var country = data.country;
  105. var ccy = countryCcy[country];
  106. if (ccy) {
  107. console.log(ccy);
  108. setTargetCcy(ccy, true);
  109. if (doGetRates)
  110. getRates(targetCcy, true);
  111. }
  112. });
  113. targetCcy = targetCcyDefault;
  114. }
  115. if (doGetRates)
  116. getRates(targetCcy, true);
  117. return targetCcy;
  118. };
  119. var setTargetCcy = function(ccy, updateDDM) {
  120. targetCcy = ccy;
  121. if ("localStorage" in window)
  122. window.localStorage.setItem('targetCcy', targetCcy);
  123. if (updateDDM)
  124. jQuery('#' + ddmIdStr).val(targetCcy);
  125. return targetCcy;
  126. }
  127. jQuery(function(){
  128. markTextWithClass(classRegex, currencyClass);
  129. getTargetCcy(true);
  130. initDropDownMenu(jQuery("#ddmContainer"));
  131. });
  132. var countryCcy = {
  133. BD: "BDT",
  134. BE: "EUR",
  135. BF: "XOF",
  136. BG: "BGN",
  137. BA: "BAM",
  138. BB: "BBD",
  139. WF: "XPF",
  140. BL: "EUR",
  141. BM: "BMD",
  142. BN: "BND",
  143. BO: "BOB",
  144. BH: "BHD",
  145. BI: "BIF",
  146. BJ: "XOF",
  147. BT: "BTN",
  148. JM: "JMD",
  149. BV: "NOK",
  150. BW: "BWP",
  151. WS: "WST",
  152. BQ: "USD",
  153. BR: "BRL",
  154. BS: "BSD",
  155. JE: "GBP",
  156. BY: "BYR",
  157. BZ: "BZD",
  158. RU: "RUB",
  159. RW: "RWF",
  160. RS: "RSD",
  161. TL: "USD",
  162. RE: "EUR",
  163. TM: "TMT",
  164. TJ: "TJS",
  165. RO: "RON",
  166. TK: "NZD",
  167. GW: "XOF",
  168. GU: "USD",
  169. GT: "GTQ",
  170. GS: "GBP",
  171. GR: "EUR",
  172. GQ: "XAF",
  173. GP: "EUR",
  174. JP: "JPY",
  175. GY: "GYD",
  176. GG: "GBP",
  177. GF: "EUR",
  178. GE: "GEL",
  179. GD: "XCD",
  180. GB: "GBP",
  181. GA: "XAF",
  182. SV: "USD",
  183. GN: "GNF",
  184. GM: "GMD",
  185. GL: "DKK",
  186. GI: "GIP",
  187. GH: "GHS",
  188. OM: "OMR",
  189. TN: "TND",
  190. JO: "JOD",
  191. HR: "HRK",
  192. HT: "HTG",
  193. HU: "HUF",
  194. HK: "HKD",
  195. HN: "HNL",
  196. HM: "AUD",
  197. VE: "VEF",
  198. PR: "USD",
  199. PS: "ILS",
  200. PW: "USD",
  201. PT: "EUR",
  202. SJ: "NOK",
  203. PY: "PYG",
  204. IQ: "IQD",
  205. PA: "PAB",
  206. PF: "XPF",
  207. PG: "PGK",
  208. PE: "PEN",
  209. PK: "PKR",
  210. PH: "PHP",
  211. PN: "NZD",
  212. PL: "PLN",
  213. PM: "EUR",
  214. ZM: "ZMK",
  215. EH: "MAD",
  216. EE: "EUR",
  217. EG: "EGP",
  218. ZA: "ZAR",
  219. EC: "USD",
  220. IT: "EUR",
  221. VN: "VND",
  222. SB: "SBD",
  223. ET: "ETB",
  224. SO: "SOS",
  225. ZW: "ZWL",
  226. SA: "SAR",
  227. ES: "EUR",
  228. ER: "ERN",
  229. ME: "EUR",
  230. MD: "MDL",
  231. MG: "MGA",
  232. MF: "EUR",
  233. MA: "MAD",
  234. MC: "EUR",
  235. UZ: "UZS",
  236. MM: "MMK",
  237. ML: "XOF",
  238. MO: "MOP",
  239. MN: "MNT",
  240. MH: "USD",
  241. MK: "MKD",
  242. MU: "MUR",
  243. MT: "EUR",
  244. MW: "MWK",
  245. MV: "MVR",
  246. MQ: "EUR",
  247. MP: "USD",
  248. MS: "XCD",
  249. MR: "MRO",
  250. IM: "GBP",
  251. UG: "UGX",
  252. TZ: "TZS",
  253. MY: "MYR",
  254. MX: "MXN",
  255. IL: "ILS",
  256. FR: "EUR",
  257. IO: "USD",
  258. SH: "SHP",
  259. FI: "EUR",
  260. FJ: "FJD",
  261. FK: "FKP",
  262. FM: "USD",
  263. FO: "DKK",
  264. NI: "NIO",
  265. NL: "EUR",
  266. NO: "NOK",
  267. NA: "NAD",
  268. VU: "VUV",
  269. NC: "XPF",
  270. NE: "XOF",
  271. NF: "AUD",
  272. NG: "NGN",
  273. NZ: "NZD",
  274. NP: "NPR",
  275. NR: "AUD",
  276. NU: "NZD",
  277. CK: "NZD",
  278. XK: "EUR",
  279. CI: "XOF",
  280. CH: "CHF",
  281. CO: "COP",
  282. CN: "CNY",
  283. CM: "XAF",
  284. CL: "CLP",
  285. CC: "AUD",
  286. CA: "CAD",
  287. CG: "XAF",
  288. CF: "XAF",
  289. CD: "CDF",
  290. CZ: "CZK",
  291. CY: "EUR",
  292. CX: "AUD",
  293. CR: "CRC",
  294. CW: "ANG",
  295. CV: "CVE",
  296. CU: "CUP",
  297. SZ: "SZL",
  298. SY: "SYP",
  299. SX: "ANG",
  300. KG: "KGS",
  301. KE: "KES",
  302. SS: "SSP",
  303. SR: "SRD",
  304. KI: "AUD",
  305. KH: "KHR",
  306. KN: "XCD",
  307. KM: "KMF",
  308. ST: "STD",
  309. SK: "EUR",
  310. KR: "KRW",
  311. SI: "EUR",
  312. KP: "KPW",
  313. KW: "KWD",
  314. SN: "XOF",
  315. SM: "EUR",
  316. SL: "SLL",
  317. SC: "SCR",
  318. KZ: "KZT",
  319. KY: "KYD",
  320. SG: "SGD",
  321. SE: "SEK",
  322. SD: "SDG",
  323. DO: "DOP",
  324. DM: "XCD",
  325. DJ: "DJF",
  326. DK: "DKK",
  327. VG: "USD",
  328. DE: "EUR",
  329. YE: "YER",
  330. DZ: "DZD",
  331. US: "USD",
  332. UY: "UYU",
  333. YT: "EUR",
  334. UM: "USD",
  335. LB: "LBP",
  336. LC: "XCD",
  337. LA: "LAK",
  338. TV: "AUD",
  339. TW: "TWD",
  340. TT: "TTD",
  341. TR: "TRY",
  342. LK: "LKR",
  343. LI: "CHF",
  344. LV: "EUR",
  345. TO: "TOP",
  346. LT: "LTL",
  347. LU: "EUR",
  348. LR: "LRD",
  349. LS: "LSL",
  350. TH: "THB",
  351. TF: "EUR",
  352. TG: "XOF",
  353. TD: "XAF",
  354. TC: "USD",
  355. LY: "LYD",
  356. VA: "EUR",
  357. VC: "XCD",
  358. AE: "AED",
  359. AD: "EUR",
  360. AG: "XCD",
  361. AF: "AFN",
  362. AI: "XCD",
  363. VI: "USD",
  364. IS: "ISK",
  365. IR: "IRR",
  366. AM: "AMD",
  367. AL: "ALL",
  368. AO: "AOA",
  369. AQ: "",
  370. AS: "USD",
  371. AR: "ARS",
  372. AU: "AUD",
  373. AT: "EUR",
  374. AW: "AWG",
  375. IN: "INR",
  376. AX: "EUR",
  377. AZ: "AZN",
  378. IE: "EUR",
  379. ID: "IDR",
  380. UA: "UAH",
  381. QA: "QAR",
  382. MZ: "MZN"
  383. };