Merge pull request #512 from galfert/node_binary_fix
[remotestorage.js] / build / client.js
1 window.onload = function() {
2   var fileLinkBase = document.body.getAttribute('data-file-link-base');
3   var buildServer = document.body.getAttribute('data-build-server');
4   var form = document.createElement('form');
5   form.method = 'POST';
6   form.action = buildServer;
7   document.getElementById('wrapper').appendChild(form);
8
9   var groupTemplate = document.querySelector('script[data-template-name="group"]').
10     innerHTML;
11
12   var xhr = new XMLHttpRequest();
13   xhr.open('GET', buildServer, true);
14   var i = 0;
15   xhr.onload = function() {
16     var components = JSON.parse(xhr.responseText);
17     var defaults = [];
18     for(var key in components.groups) {
19       var group = components.groups[key];
20       if(group.hidden) continue;
21
22       group.name = key;
23
24       if(group.required || group.default) defaults.push(group.name);
25
26       i++;
27
28       group.class = i % 2 == 1 ? 'odd' : '';
29
30       group.files = group.files.map(function(fileName) {
31         return {
32           name: fileName,
33           desc: components.files[fileName] || '-',
34           href: fileLinkBase + fileName
35         };
36       });
37
38       if(group.depends) {
39         group.depends = group.depends.map(function(dependName) {
40           var dependency = components.groups[dependName];
41           if(! dependency.reverseDepends) {
42             dependency.reverseDepends = [];
43           }
44           dependency.reverseDepends.push(group.name);
45           return {
46             name: dependName,
47             label: dependency.label,
48             desc: dependency.desc
49           };
50         });
51         console.log('group', group.name, 'depends', group.depends);
52       } else {
53         group.noDepends = true;
54       }
55
56       form.innerHTML += Mustache.render(groupTemplate, group);
57     }
58     var submit = document.createElement('input');
59     submit.type = 'submit';
60     submit.value = 'Download';
61     form.appendChild(submit);
62
63     function setGroupState(groupName, state) {
64       console.log('set state', groupName, state);
65       var checkbox = document.getElementById('group-' + groupName)
66       if(checkbox) {
67         checkbox.checked = state;
68         updateGroupState({ target: checkbox });
69       }
70     }
71
72     function processDepends(groupName, value) {
73       var group = components.groups[groupName];
74       if(value && group.depends) {
75         group.depends.forEach(function(group) {
76           setGroupState(group.name, true);
77         });
78       } else if( !value && group.reverseDepends) {
79         group.reverseDepends.forEach(function(groupName) {
80           setGroupState(groupName, false);
81         });
82       }
83     }
84
85     function updateGroupState(event) {
86       var checkbox = event.target, classList = checkbox.parentElement.classList;
87       if(checkbox.checked) {
88         classList.remove('disabled');
89       } else {
90         classList.add('disabled');
91       }
92       processDepends(checkbox.getAttribute('value'), checkbox.checked);
93     }
94     
95     Array.prototype.forEach.call(
96       document.getElementsByClassName('group-control'), function(checkbox) {
97         checkbox.addEventListener('change', updateGroupState);
98       }
99     );
100
101     setTimeout(function() {
102
103     defaults.forEach(function(groupName) {
104       setGroupState(groupName, true);
105     });
106
107     }, 0);
108   };
109   xhr.send();
110 }