helper.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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 haversine() {
  42. var radians = Array.prototype.map.call(arguments, function(deg) { return deg / 180.0 * Math.PI })
  43. var lat1 = radians[0], lon1 = radians[1], lat2 = radians[2], lon2 = radians[3]
  44. var R = 6372.8 // km
  45. var dLat = lat2 - lat1
  46. var dLon = lon2 - lon1
  47. var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2)
  48. var c = 2 * Math.asin(Math.sqrt(a))
  49. return R * c
  50. }
  51. return { buildUrl: buildUrl
  52. , request: request
  53. , getJSON: getJSON
  54. , dictGet: dictGet
  55. , haversine: haversine
  56. }
  57. })