helper.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. "use strict"
  2. define([ "bacon" ], function (Bacon) {
  3. function get(url) {
  4. return Bacon.fromBinder(function(sink) {
  5. var req = new XMLHttpRequest()
  6. req.open("GET", url)
  7. req.onload = function() {
  8. if (req.status === 200)
  9. sink(new Bacon.Next(req.response))
  10. else
  11. sink(new Bacon.Error(req.statusText))
  12. sink(new Bacon.End())
  13. }
  14. req.onerror = function() {
  15. sink(new Bacon.Error("network error"))
  16. sink(new Bacon.End())
  17. }
  18. req.send()
  19. return function () {}
  20. })
  21. }
  22. function getJSON(url) {
  23. return get(url).map(JSON.parse)
  24. }
  25. function buildUrl(ip, object, param) {
  26. var url = "http://[" + ip + "]/cgi-bin/" + object
  27. if (param) url += "?" + param
  28. return url
  29. }
  30. function request(ip, object, param) {
  31. return getJSON(buildUrl(ip, object, param))
  32. }
  33. function dictGet(dict, key) {
  34. var k = key.shift()
  35. if (!(k in dict))
  36. return null
  37. if (key.length === 0)
  38. return dict[k]
  39. return dictGet(dict[k], key)
  40. }
  41. function localizeNumber(d) {
  42. var sep = ','
  43. return d.replace('.', sep)
  44. }
  45. function formatNumberFixed(d, digits) {
  46. return localizeNumber(d.toFixed(digits))
  47. }
  48. function formatNumber(d, digits) {
  49. digits--
  50. for (var v = d; v >= 10 && digits > 0; v /= 10)
  51. digits--
  52. // avoid toPrecision as it might produce strings in exponential notation
  53. return formatNumberFixed(d, digits)
  54. }
  55. function haversine() {
  56. var radians = Array.prototype.map.call(arguments, function(deg) { return deg / 180.0 * Math.PI })
  57. var lat1 = radians[0], lon1 = radians[1], lat2 = radians[2], lon2 = radians[3]
  58. var R = 6372.8 // km
  59. var dLat = lat2 - lat1
  60. var dLon = lon2 - lon1
  61. var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2)
  62. var c = 2 * Math.asin(Math.sqrt(a))
  63. return R * c
  64. }
  65. function _(s) {
  66. var i, lang, langs, dict = {
  67. "de": {
  68. "Node": "Knoten",
  69. "Distance": "Entfernung",
  70. "Inactive": "Inaktiv",
  71. "Node name": "Knotenname",
  72. "Contact": "Kontakt",
  73. "Model": "Modell",
  74. "Primary MAC": "Primäre MAC",
  75. "IP Address": "IP-Adresse",
  76. "Automatic updates": "Automatische Updates",
  77. "Overview": "Übersicht",
  78. "used": "belegt",
  79. "Uptime": "Laufzeit",
  80. "Load average": "Systemlast",
  81. "Transmitted": "Gesendet",
  82. "Received": "Empfangen",
  83. "Forwarded": "Weitergeleitet",
  84. "Day": "Tag",
  85. "Days": "Tage",
  86. "connected": "verbunden",
  87. "not connected": "nicht verbunden",
  88. "Packets/s": "Pakete/s",
  89. "Statistic": "Statistik",
  90. "Neighbors": "Nachbarknoten",
  91. "Mesh VPN": "Mesh-VPN",
  92. "enabled": "aktiviert",
  93. "disabled": "deaktiviert"
  94. },
  95. "ru": {
  96. "Node": "Узел",
  97. "Distance": "Дальность",
  98. "Inactive": "Не активен",
  99. "Node name": "Имя узла",
  100. "Contact": "Контакт",
  101. "Model": "Модель",
  102. "Primary MAC": "Основной MAC",
  103. "IP Address": "IP Адрес",
  104. "Automatic updates": "Автоматические обновления",
  105. "Overview": "Обзор",
  106. "used": "используется",
  107. "Uptime": "Время работы",
  108. "Load average": "Загрузка системы",
  109. "Gateway": "Шлюз",
  110. "Clients": "Клиенты",
  111. "Transmitted": "Передано",
  112. "Received": "Получено",
  113. "Forwarded": "Переправленно",
  114. "Day": "День",
  115. "Days": "Дней",
  116. "connected": "подключено",
  117. "not connected": "не подключено",
  118. "Packets/s": "Пакетов/c",
  119. "Statistic": "Статистика",
  120. "Traffic": "Трафик",
  121. "Neighbors": "Соседи",
  122. "Firmware": "Прошивка",
  123. "Branch": "Ветка"
  124. }
  125. }
  126. if (navigator.languages)
  127. langs = navigator.languages
  128. else if (navigator.language)
  129. langs = [navigator.language]
  130. else
  131. langs = []
  132. for (i=0; i<langs.length; i++) {
  133. lang = langs[i].split('-')[0]
  134. if (lang == "en")
  135. return s
  136. else if (lang in dict && s in dict[lang])
  137. return dict[lang][s]
  138. }
  139. return s
  140. }
  141. return { buildUrl: buildUrl
  142. , request: request
  143. , getJSON: getJSON
  144. , dictGet: dictGet
  145. , formatNumber: formatNumber
  146. , formatNumberFixed: formatNumberFixed
  147. , haversine: haversine
  148. , _: _
  149. }
  150. })