lib/utils/router.js   A
last analyzed

Complexity

Total Complexity 36
Complexity/F 1.71

Size

Lines of Code 150
Function Count 21

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 36
eloc 92
mnd 15
bc 15
fnc 21
dl 0
loc 150
rs 9.52
bpm 0.7141
cpm 1.7142
noi 0
c 0
b 0
f 0

12 Functions

Rating   Name   Duplication   Size   Complexity  
A router.js ➔ getLang 0 8 2
A router.js ➔ fullUrl 0 6 2
A router.js ➔ gotoLink 0 10 4
A router.js ➔ gotoNode 0 7 3
B router.js ➔ generateLink 0 18 6
A router.js ➔ removeTarget 0 5 2
B router.js ➔ customRoute 0 39 8
A router.js ➔ addTarget 0 3 1
A router.js ➔ addView 0 3 1
A router.js ➔ view 0 7 2
A router.js ➔ setData 0 3 1
A router.js ➔ resetView 0 5 4
1
define(['Navigo'], function (Navigo) {
2
  'use strict';
3
4
  return function (language) {
5
    var init = false;
6
    var objects = {};
7
    var targets = [];
8
    var views = {};
9
    var current = {};
10
    var state = { lang: language.getLocale(), view: 'map' };
11
12
    function resetView() {
13
      targets.forEach(function (t) {
14
        t.resetView();
15
      });
16
    }
17
18
    function gotoNode(d) {
19
      if (objects.nodeDict[d.nodeId]) {
20
        targets.forEach(function (t) {
21
          t.gotoNode(objects.nodeDict[d.nodeId], objects.nodeDict);
22
        });
23
      }
24
    }
25
26
    function gotoLink(d) {
27
      var link = objects.links.filter(function (value) {
28
        return value.id === d.linkId;
29
      });
30
      if (link) {
31
        targets.forEach(function (t) {
32
          t.gotoLink(link);
33
        });
34
      }
35
    }
36
37
    function view(d) {
38
      if (d.view in views) {
39
        views[d.view]();
40
        state.view = d.view;
41
        resetView();
42
      }
43
    }
44
45
    function customRoute(lang, viewValue, node, link, zoom, lat, lng) {
46
      current = {
47
        lang: lang,
48
        view: viewValue,
49
        node: node,
50
        link: link,
51
        zoom: zoom,
52
        lat: lat,
53
        lng: lng
54
      };
55
56
      if (lang && lang !== state.lang && lang === language.getLocale(lang)) {
57
        location.reload();
58
      }
59
60
      if (!init || viewValue && viewValue !== state.view) {
61
        if (!viewValue) {
62
          viewValue = state.view;
63
        }
64
        view({ view: viewValue });
65
        init = true;
66
      }
67
68
      if (node) {
69
        gotoNode({ nodeId: node });
70
      } else if (link) {
71
        gotoLink({ linkId: link });
72
      } else if (lat) {
73
        targets.forEach(function (t) {
74
          t.gotoLocation({
75
            zoom: parseInt(zoom, 10),
76
            lat: parseFloat(lat),
77
            lng: parseFloat(lng)
78
          });
79
        });
80
      } else {
81
        resetView();
82
      }
83
    }
84
85
    var router = new Navigo(null, true, '#!');
86
87
    router
88
      .on(/^\/?#?!?\/([\w]{2})?\/?(map|graph)?\/?([a-f\d]{12})?([a-f\d\-]{25})?\/?(?:(\d+)\/(-?[\d.]+)\/(-?[\d.]+))?$/, customRoute)
89
      .on({
90
        '*': function () {
91
          router.fullUrl();
92
        }
93
      });
94
95
    router.generateLink = function generateLink(data, full, deep) {
96
      var result = '#!';
97
98
      if (full) {
99
        data = Object.assign({}, state, data);
100
      } else if (deep) {
101
        data = Object.assign({}, current, data);
102
      }
103
104
      for (var key in data) {
105
        if (!data.hasOwnProperty(key) || data[key] === undefined) {
106
          continue;
107
        }
108
        result += '/' + data[key];
109
      }
110
111
      return result;
112
    };
113
114
    router.fullUrl = function fullUrl(data, e, deep) {
115
      if (e) {
116
        e.preventDefault();
117
      }
118
      router.navigate(router.generateLink(data, !deep, deep));
119
    };
120
121
    router.getLang = function getLang() {
122
      var lang = location.hash.match(/^\/?#!?\/([\w]{2})\//);
123
      if (lang) {
124
        state.lang = language.getLocale(lang[1]);
125
        return lang[1];
126
      }
127
      return null;
128
    };
129
130
    router.addTarget = function addTarget(d) {
131
      targets.push(d);
132
    };
133
134
    router.removeTarget = function removeTarget(d) {
135
      targets = targets.filter(function (e) {
136
        return d !== e;
137
      });
138
    };
139
140
    router.addView = function addView(k, d) {
141
      views[k] = d;
142
    };
143
144
    router.setData = function setData(data) {
145
      objects = data;
146
    };
147
148
    return router;
149
  };
150
});
151