| OLD | NEW |
| 1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
| 2 <html> | 2 <html> |
| 3 <head> | 3 <head> |
| 4 <meta charset="utf-8"> | 4 <meta charset="utf-8"> |
| 5 <title>User counter</title> | 5 <title>User counter</title> |
| 6 <style type="text/css"> | 6 <style type="text/css"> |
| 7 form | 7 form |
| 8 { | 8 { |
| 9 display: inline; | 9 display: inline; |
| 10 } | 10 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 return result; | 41 return result; |
| 42 } | 42 } |
| 43 | 43 |
| 44 function formatDate(date) | 44 function formatDate(date) |
| 45 { | 45 { |
| 46 return zeroPad(date.getFullYear(), 4) + "-" + zeroPad(date.getMonth() + 1,
2) + "-" + zeroPad(date.getDate(), 2); | 46 return zeroPad(date.getFullYear(), 4) + "-" + zeroPad(date.getMonth() + 1,
2) + "-" + zeroPad(date.getDate(), 2); |
| 47 } | 47 } |
| 48 | 48 |
| 49 var curMonth = null; | 49 var curMonth = null; |
| 50 var curMonthFilters = null; | 50 var curMonthFilters = null; |
| 51 var curMonthAntiadblock = null; |
| 51 var curMonthNotifications = null; | 52 var curMonthNotifications = null; |
| 52 | 53 |
| 53 function checkStats(data, fromDate, offset, callback) | 54 function checkStats(data, fromDate, offset, callback) |
| 54 { | 55 { |
| 55 var date = new Date(fromDate.getTime() + offset * MILLIS_IN_DAY); | 56 var date = new Date(fromDate.getTime() + offset * MILLIS_IN_DAY); |
| 56 | 57 |
| 57 function doDownload(url, descr, callback) | 58 function doDownload(url, descr, callback) |
| 58 { | 59 { |
| 59 var request = new XMLHttpRequest(); | 60 var request = new XMLHttpRequest(); |
| 60 request.open("GET", url); | 61 request.open("GET", url); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 } | 108 } |
| 108 } | 109 } |
| 109 } | 110 } |
| 110 | 111 |
| 111 var month = zeroPad(date.getFullYear(), 4) + zeroPad(date.getMonth() + 1,
2); | 112 var month = zeroPad(date.getFullYear(), 4) + zeroPad(date.getMonth() + 1,
2); |
| 112 if (month != curMonth) | 113 if (month != curMonth) |
| 113 { | 114 { |
| 114 doDownload("/raw/subscription/" + month + "/exceptionrules.txt.json", "a
cceptable ads data for month " + month, function(json) | 115 doDownload("/raw/subscription/" + month + "/exceptionrules.txt.json", "a
cceptable ads data for month " + month, function(json) |
| 115 { | 116 { |
| 116 curMonthFilters = json; | 117 curMonthFilters = json; |
| 117 doDownload("/raw/notification/" + month + "/notification.json.json", "
notification data for month " + month, function(json) | 118 doDownload("/raw/subscription/" + month + "/antiadblockfilters.txt.jso
n", "anti-adblock data for month " + month, function(json) |
| 118 { | 119 { |
| 119 curMonthNotifications = json; | 120 curMonthAntiadblock = json; |
| 120 curMonth = month; | 121 doDownload("/raw/notification/" + month + "/notification.json.json",
"notification data for month " + month, function(json) |
| 121 doCheckStats(curMonthFilters, "acceptable"); | 122 { |
| 122 doCheckStats(curMonthNotifications, "total"); | 123 curMonthNotifications = json; |
| 123 callback(); | 124 curMonth = month; |
| 125 doCheckStats(curMonthFilters, "acceptable"); |
| 126 doCheckStats(curMonthAntiadblock, "antiadblock"); |
| 127 doCheckStats(curMonthNotifications, "total"); |
| 128 callback(); |
| 129 }); |
| 124 }); | 130 }); |
| 125 }); | 131 }); |
| 126 } | 132 } |
| 127 else | 133 else |
| 128 { | 134 { |
| 129 doCheckStats(curMonthFilters, "acceptable"); | 135 doCheckStats(curMonthFilters, "acceptable"); |
| 136 doCheckStats(curMonthAntiadblock, "antiadblock"); |
| 130 doCheckStats(curMonthNotifications, "total"); | 137 doCheckStats(curMonthNotifications, "total"); |
| 131 callback(); | 138 callback(); |
| 132 } | 139 } |
| 133 } | 140 } |
| 134 | 141 |
| 135 function showResults(fromDate, data) | 142 function showResults(fromDate, data) |
| 136 { | 143 { |
| 137 function createCell(row, text) | 144 function createCell(row, text) |
| 138 { | 145 { |
| 139 var cell = document.createElement("td"); | 146 var cell = document.createElement("td"); |
| 140 cell.appendChild(document.createTextNode(text)); | 147 cell.appendChild(document.createTextNode(text)); |
| 141 row.appendChild(cell); | 148 row.appendChild(cell); |
| 142 } | 149 } |
| 143 | 150 |
| 144 var resultBody = document.getElementById("resultBody"); | 151 var resultBody = document.getElementById("resultBody"); |
| 145 while (resultBody.lastChild) | 152 while (resultBody.lastChild) |
| 146 resultBody.removeChild(resultBody.lastChild); | 153 resultBody.removeChild(resultBody.lastChild); |
| 147 | 154 |
| 148 for (var i = 0; i < data.length; i++) | 155 for (var i = 0; i < data.length; i++) |
| 149 { | 156 { |
| 150 var date = new Date(fromDate.getTime() + i * MILLIS_IN_DAY); | 157 var date = new Date(fromDate.getTime() + i * MILLIS_IN_DAY); |
| 151 | 158 |
| 152 var row = document.createElement("tr"); | 159 var row = document.createElement("tr"); |
| 153 createCell(row, date.toLocaleDateString()); | 160 createCell(row, date.toLocaleDateString()); |
| 154 createCell(row, data[i]["1day total"].toLocaleString()); | 161 createCell(row, data[i]["1day total"].toLocaleString()); |
| 162 createCell(row, data[i]["1day antiadblock"].toLocaleString()); |
| 155 createCell(row, data[i]["1day acceptable"].toLocaleString()); | 163 createCell(row, data[i]["1day acceptable"].toLocaleString()); |
| 156 createCell(row, (100 - data[i]["1day acceptable"] / data[i]["1day total"
] * 100).toFixed(2) + "%"); | 164 createCell(row, (100 - data[i]["1day acceptable"] / data[i]["1day total"
] * 100).toFixed(2) + "%"); |
| 157 createCell(row, data[i]["7day total"].toLocaleString()); | 165 createCell(row, data[i]["7day total"].toLocaleString()); |
| 166 createCell(row, data[i]["7day antiadblock"].toLocaleString()); |
| 158 createCell(row, data[i]["7day acceptable"].toLocaleString()); | 167 createCell(row, data[i]["7day acceptable"].toLocaleString()); |
| 159 createCell(row, (100 - data[i]["7day acceptable"] / data[i]["7day total"
] * 100).toFixed(2) + "%"); | 168 createCell(row, (100 - data[i]["7day acceptable"] / data[i]["7day total"
] * 100).toFixed(2) + "%"); |
| 160 createCell(row, data[i]["30day total"].toLocaleString()); | 169 createCell(row, data[i]["30day total"].toLocaleString()); |
| 170 createCell(row, data[i]["30day antiadblock"].toLocaleString()); |
| 161 createCell(row, data[i]["30day acceptable"].toLocaleString()); | 171 createCell(row, data[i]["30day acceptable"].toLocaleString()); |
| 162 createCell(row, (100 - data[i]["30day acceptable"] / data[i]["30day tota
l"] * 100).toFixed(2) + "%"); | 172 createCell(row, (100 - data[i]["30day acceptable"] / data[i]["30day tota
l"] * 100).toFixed(2) + "%"); |
| 163 resultBody.appendChild(row); | 173 resultBody.appendChild(row); |
| 164 } | 174 } |
| 165 | 175 |
| 166 document.getElementById("result").removeAttribute("hidden"); | 176 document.getElementById("result").removeAttribute("hidden"); |
| 167 document.getElementById("wait").setAttribute("hidden", "hidden"); | 177 document.getElementById("wait").setAttribute("hidden", "hidden"); |
| 168 } | 178 } |
| 169 | 179 |
| 170 function calculate() | 180 function calculate() |
| (...skipping 23 matching lines...) Expand all Loading... |
| 194 | 204 |
| 195 if (fromDate > toDate) | 205 if (fromDate > toDate) |
| 196 { | 206 { |
| 197 var tmp = fromDate; | 207 var tmp = fromDate; |
| 198 fromDate = toDate; | 208 fromDate = toDate; |
| 199 toDate = tmp; | 209 toDate = tmp; |
| 200 } | 210 } |
| 201 | 211 |
| 202 var data = []; | 212 var data = []; |
| 203 for (var d = fromDate; formatDate(d) <= formatDate(toDate); d = new Date(d
.getTime() + MILLIS_IN_DAY)) | 213 for (var d = fromDate; formatDate(d) <= formatDate(toDate); d = new Date(d
.getTime() + MILLIS_IN_DAY)) |
| 204 data.push({"1day total": 0, "1day acceptable": 0, "7day total": 0, "7day
acceptable": 0, "30day total": 0, "30day acceptable": 0}); | 214 data.push({"1day total": 0, "1day antiadblock": 0, "1day acceptable": 0,
"7day total": 0, "7day antiadblock": 0, "7day acceptable": 0, "30day total": 0,
"30day antiadblock": 0, "30day acceptable": 0}); |
| 205 | 215 |
| 206 var offset = -30; | 216 var offset = -30; |
| 207 var callback = function() | 217 var callback = function() |
| 208 { | 218 { |
| 209 offset++; | 219 offset++; |
| 210 if (offset >= data.length) | 220 if (offset >= data.length) |
| 211 { | 221 { |
| 212 showResults(fromDate, data); | 222 showResults(fromDate, data); |
| 213 return; | 223 return; |
| 214 } | 224 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 236 <span class="spacer"></span> | 246 <span class="spacer"></span> |
| 237 <button type="submit">Calculate</button> | 247 <button type="submit">Calculate</button> |
| 238 </form> | 248 </form> |
| 239 </p> | 249 </p> |
| 240 <p id="wait" hidden> | 250 <p id="wait" hidden> |
| 241 Please wait, data is being fetched... | 251 Please wait, data is being fetched... |
| 242 </p> | 252 </p> |
| 243 <table id="result" hidden> | 253 <table id="result" hidden> |
| 244 <tr> | 254 <tr> |
| 245 <th rowspan="2">Date</th> | 255 <th rowspan="2">Date</th> |
| 246 <th colspan="3">1-day active users</th> | 256 <th colspan="4">1-day active users</th> |
| 247 <th colspan="3">7-day active users</th> | 257 <th colspan="4">7-day active users</th> |
| 248 <th colspan="3">30-day active users</th> | 258 <th colspan="4">30-day active users</th> |
| 249 </tr> | 259 </tr> |
| 250 <tr> | 260 <tr> |
| 251 <th>Total</th> | 261 <th>Total</th> |
| 262 <th>Anti-adblock filters</th> |
| 252 <th>Acceptable ads</th> | 263 <th>Acceptable ads</th> |
| 253 <th>Opt-out rate</th> | 264 <th>Opt-out rate</th> |
| 254 <th>Total</th> | 265 <th>Total</th> |
| 266 <th>Anti-adblock filters</th> |
| 267 <th>Acceptable ads</th> |
| 268 <th>Opt-out rate</th> |
| 269 <th>Total</th> |
| 270 <th>Anti-adblock filters</th> |
| 255 <th>Acceptable ads</th> | 271 <th>Acceptable ads</th> |
| 256 <th>Opt-out rate</th> | 272 <th>Opt-out rate</th> |
| 257 </tr> | 273 </tr> |
| 258 <tbody id="resultBody"> | 274 <tbody id="resultBody"> |
| 259 </tbody> | 275 </tbody> |
| 260 </table> | 276 </table> |
| 261 </body> | 277 </body> |
| 262 </html> | 278 </html> |
| OLD | NEW |