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