]> git.wh0rd.org - chrome-ext/web-power-switch.git/blob - popup.js
fix dark theme
[chrome-ext/web-power-switch.git] / popup.js
1 // Written by Mike Frysinger <vapier@gmail.com>. Released into the public domain. Suck it.
2
3 var url_base, user, pass;
4
5 function fetchpage(url, callback) {
6 url = url_base + '/' + url;
7
8 var xhr = new XMLHttpRequest();
9 xhr.setstatus = false;
10 try {
11 xhr.onreadystatechange = function(state) {
12 if (xhr.readyState == 4) {
13 if (xhr.status == 200) {
14 callback(xhr, state);
15 } else {
16 xhr.setstatus = true;
17 setstatus(
18 'Could not connect;<br>check your ' +
19 '<a id="open-settings" href="">settings</a>'
20 );
21 document.getElementById('open-settings').onclick = open_settings_page;
22 console.log('connect error', state);
23 }
24 }
25 }
26 xhr.onerror = function(error) {
27 if (!xhr.setstatus)
28 setstatus('onerror; see console');
29 console.log('xhr error:', error);
30 }
31
32 console.log('fetching', url)
33 xhr.withCredentials = true;
34 xhr.open('GET', url, true, user, pass);
35 xhr.responseType = 'document';
36 // The user/pass options above don't seem to work, so do it ourselves.
37 xhr.setRequestHeader('Authorization', 'Basic ' + btoa(user + ':' + pass));
38 xhr.send();
39 } catch(e) {
40 setstatus('Exception; see console');
41 console.log('exception:', e);
42 }
43 }
44
45 function onoff(o) {
46 return o.toUpperCase() === 'ON' ? 'OFF' : 'ON';
47 }
48
49 function toggleit(button) {
50 var outlet_num = button.id;
51 var old_status = button.data;
52 var new_status = onoff(button.data);
53 var url = 'outlet?' + outlet_num + '=' + new_status;
54
55 fetchpage(url, function(xhr, state) {
56 console.log('switch ' + outlet_num + ': ' + old_status + ' -> ' + new_status);
57 button.value = 'Switch ' + old_status;
58 button.data = new_status;
59 });
60 }
61 function toggle() {
62 toggleit(this);
63 }
64
65 function toggle_confirmed() {
66 clearTimeout(this.timeout);
67 this.onclick = toggle_confirm;
68 toggleit(this);
69 }
70
71 function toggle_confirm() {
72 var button = this;
73 this.onclick = toggle_confirmed;
74 this.oldvalue = this.value;
75 this.value = 'Confirm!?';
76 this.timeout = setTimeout(function() {
77 button.value = button.oldvalue;
78 button.onclick = toggle_confirm;
79 }, 5000);
80 }
81
82 function trim(str) {
83 return str.replace(/^\s+|\s+$/, '');
84 }
85
86 function initpopup(xhr, state) {
87 var tbl = document.getElementById('buttons');
88 var row, cell, button;
89
90 console.log(xhr, state);
91
92 // There is no clean API for extracting the current state.
93 // Example result:
94 /*
95 <tr>
96 <th bgcolor="#DDDDFF" align=left>
97 Controller: !!!Web Power Switch 6
98 </th>
99 </tr>
100 */
101
102 var th, ths = state.currentTarget.responseXML.querySelectorAll('th');
103 for (var i = 0; th = ths[i]; ++i) {
104 if (th.bgColor != '#DDDDFF')
105 continue;
106
107 var controller_name = trim(th.innerText);
108 if (controller_name.slice(0, 12) != 'Controller: ')
109 continue;
110
111 row = tbl.insertRow(-1);
112 cell = row.insertCell(-1);
113 cell.colSpan = 2;
114 cell.align = 'center';
115 cell.innerText = controller_name.slice(12);
116 cell.innerHTML = '<a href="' + url_base + '" target="_blank">' + cell.innerHTML + '</a>'
117 }
118
119 /*
120 <tr bgcolor="#F4F4F4"><td align=center>1</td>
121 <td>Outlet 1</td><td>
122 <b><font color=red>OFF</font></b></td><td>
123 <a href=outlet?1=ON>Switch ON</a>
124 </td><td>
125 <!-- <a href=outlet?1=CCL>Cycle</a> -->
126 </td></tr>
127 */
128
129 var tr, trs = state.currentTarget.responseXML.querySelectorAll('tr');
130 for (var i = 0; tr = trs[i]; ++i) {
131 if (tr.bgColor != '#F4F4F4')
132 continue;
133
134 var outlet_num = trim(tr.children[0].innerText);
135 var outlet_name = trim(tr.children[1].innerText);
136 var current_status = trim(tr.children[2].innerText);
137 var new_status = trim(tr.children[3].innerText);
138 var confirmable = tr.children[3].children[0].hasAttribute('onclick');
139
140 row = tbl.insertRow(-1);
141 cell = row.insertCell(-1);
142 if (outlet_name === '')
143 cell.innerHTML = '<i>unnamed</i>';
144 else
145 cell.innerText = outlet_name + ':';
146 cell = row.insertCell(-1);
147 button = document.createElement('input');
148 button.type = 'button';
149 button.id = outlet_num;
150 button.value = new_status;
151 button.data = current_status;
152 button.onclick = confirmable ? toggle_confirm : toggle;
153 cell.appendChild(button);
154 }
155
156 setstatus();
157 }
158
159 function setstatus(msg) {
160 var status = document.getElementById('status');
161 status.innerHTML = msg;
162 status.style.visibility = msg ? '' : 'hidden';
163 status.style.float = msg ? '' : 'left';
164 status.style.position = msg ? '' : 'absolute';
165 }
166
167 function open_settings_page() {
168 chrome.runtime.openOptionsPage();
169 }
170
171 document.addEventListener('DOMContentLoaded', function() {
172 storage.get(settings_keys, function(settings) {
173 url_base = settings['url'] || settings_defaults['url'];
174 user = settings['user'] || settings_defaults['user'];
175 pass = settings['pass'] || settings_defaults['pass'];
176 chrome.permissions.contains({
177 origins: [url_base + '/*']
178 }, function(granted) {
179 if (granted) {
180 fetchpage('index.htm', initpopup);
181 } else {
182 setstatus(
183 'Missing permissions;<br>please visit the ' +
184 '<a id="open-settings" href="">settings page</a>' +
185 '<br>to grant access.<br>' +
186 '<center><input id=retry type=submit value=Retry></center>'
187 );
188 document.getElementById('open-settings').onclick = open_settings_page;
189 // Work around http://crbug.com/125706.
190 document.getElementById('retry').onclick = function() {
191 chrome.permissions.request({origins: [url_base + '/*']});
192 fetchpage('index.htm', initpopup);
193 };
194 }
195 });
196 });
197 });