gecko/browser/components/places/content/demos/time.js

298 lines
9.2 KiB
JavaScript

/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Places
*
* The Initial Developer of the Original Code is Google Inc.
* Portions created by the Initial Developer are Copyright (C) 2006
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Brett Wilson <brettw@gmail.com> (original author)
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
window.addEventListener("load", BW_startup, false);
var BW_frame;
var BW_historyService = Components.classes["@mozilla.org/browser/nav-history-service;1"].
getService(Components.interfaces.nsINavHistoryService);
var BW_result;
var loadedIframe = false;
var loadedBretts = false;
function BW_startup() {
BW_frame = document.getElementById("theframe");
var options = BW_historyService.getNewQueryOptions();
options.sortingMode = options.SORT_BY_DATE_DESCENDING;
options.resultType = options.RESULTS_AS_VISIT;
options.maxResults = 200;
var query = BW_historyService.getNewQuery();
BW_result = BW_historyService.executeQuery(query, options);
BW_result.root.containerOpen = true;
BW_frame.contentWindow.addEventListener("load", BW_fill, true);
loadedBretts = true;
if (loadedIframe && loadedBretts)
BW_fill();
//BW_frame.onload = BW_fill;
//BW_frame.contentDocument.onLoad = BW_fill;
//BW_fill();
}
function BW_loadiframe() {
loadedIframe = true;
if (loadedIframe && loadedBretts)
BW_fill();
}
function BW_getTLD(host) {
var count = 0;
for (var i = host.length - 2; i > 0; i --) {
if (host[i] == '.') {
count ++;
if (count == 2) {
return host.substr(i + 1);
}
}
}
return host;
}
var BW_filled = false;
function BW_fill() {
if (BW_filled)
return;
BW_filled = true;
BW_frame.setAttribute('onload', '');
var container = BW_result.root;
var length = container.childCount;
dump("doc = " + BW_frame.contentDocument + "\n");
var doc = BW_frame.contentDocument;
var ios = Components.classes["@mozilla.org/network/io-service;1"].
getService(Components.interfaces.nsIIOService);
var dateformat = Components.classes["@mozilla.org/intl/scriptabledateformat;1"]
.getService(Components.interfaces.nsIScriptableDateFormat);
var table = doc.createElement('table');
doc.body.appendChild(table);
var counts = new Array(240);
for (var i = 0; i < counts.length; i ++) {
counts[i] = 0;
}
var now = new Date();
now.setHours(0);
now.setMinutes(0);
now.setSeconds(0);
now.setMilliseconds(0);
now.setDate(now.getDate()+1);
var tonightUS = now.getTime() * 1000;
var usPerHour = 3600000000;
var previousSession = -1;
var previousMS = 18437736874454810627;
var previousHost = "";
for (var i = 0; i < length; i ++) {
var child = container.getChild(i);
child.QueryInterface(Components.interfaces.nsINavHistoryVisitResultNode);
var session = child.sessionId;
var thisBin = Math.floor((tonightUS - child.time) / usPerHour);
if (thisBin >= 0 && thisBin < counts.length) {
counts[thisBin] = counts[thisBin] + 1;
}
var ms = child.time / 1000;
var addedTime = false;
if (previousMS - ms > 600000) {
addedTime = true;
var t = new Date(ms);
var tr = doc.createElement('tr');
table.appendChild(tr);
var td = doc.createElement('td');
td.setAttribute('colspan', '2');
td.setAttribute('class', 'time');
tr.appendChild(td);
var timestring = dateformat.FormatDateTime("",
dateformat.dateFormatShort,
dateformat.timeFormatNoSeconds,
t.getFullYear(),
t.getMonth(),
t.getDate(),
t.getHours(),
t.getMinutes(),
0);
var timetext = doc.createTextNode(timestring);
td.appendChild(timetext);
}
previousMS = ms;
var tr = doc.createElement('tr');
table.appendChild(tr);
// URL
var spec;
var uri;
try {
spec = child.uri;
uri = ios.newURI(spec, null, null);
} catch(e) {
spec = null;
uri = null;
}
// host name if needed on left
var td = doc.createElement('td');
td.setAttribute('valign', 'top');
td.setAttribute('align', 'right');
td.setAttribute('class', 'host');
tr.appendChild(td);
var host = BW_getTLD(uri.host);
if (addedTime || host != previousHost) {
// add host name
var hosttext = doc.createTextNode(host);
td.appendChild(hosttext);
}
previousHost = host;
// right section
var td = doc.createElement('td');
td.setAttribute('valign', 'top');
tr.appendChild(td);
if (! addedTime && (i == 0 || child.sessionId != previousSession))
td.setAttribute('class', 'itemnew');
else
td.setAttribute('class', 'item');
previousSession = session;
// title div and text
var titlediv = doc.createElement('div');
titlediv.setAttribute('class', 'title');
var imgelt = doc.createElement('img');
if (child.icon)
imgelt.setAttribute('src', child.icon.spec);
else
imgelt.setAttribute('src', 'chrome://browser/skin/places/defaultFavicon.png');
imgelt.setAttribute('width', 16);
imgelt.setAttribute('height', 16);
imgelt.setAttribute('class', 'favicon');
titlediv.appendChild(imgelt);
var titletext = doc.createTextNode(child.title);
titlediv.appendChild(titletext);
td.appendChild(titlediv);
// URL
if (spec) {
/* // this does bold host names
var host = uri.host;
var hostStart = spec.indexOf(host);
if (hostStart >= 0) {
var prehost = spec.substring(0, hostStart);
var prehosttext = doc.createTextNode(prehost);
var posthost = spec.substring(hostStart + host.length, spec.length);
var posthosttext = doc.createTextNode(posthost);
var hosttext = doc.createTextNode(host);
var boldElement = doc.createElement('b');
boldElement.appendChild(hosttext);
var urldiv = doc.createElement('div');
urldiv.setAttribute('class', 'url');
urldiv.appendChild(prehosttext);
urldiv.appendChild(boldElement);
urldiv.appendChild(posthosttext);
td.appendChild(urldiv);
}
*/
var urldiv = doc.createElement('div');
urldiv.setAttribute('class', 'url');
var urltext = doc.createTextNode(spec);
urldiv.appendChild(urltext);
td.appendChild(urldiv);
}
}
// smooth the counts
var counts2 = new Array(counts.length);
for (var i = 0; i < counts.length; i ++) {
var ttl = 0;
var acc = 0;
for (var j = -2; j <= 2; j ++) {
if (i + j < 0) continue;
if (i + j >= counts.length) continue;
var scale;
if (j == -2 || j == 2) scale = 0.33;
else if (j == -1 || j == 1) scale = 0.66;
else scale = 1.0;
acc += counts[i+j] * scale;
ttl += scale;
}
counts2[i] = Math.round(acc);
}
// fill in the day bargraphs
var daylist = document.getElementById("daylist");
for (var i = 0; i < counts2.length / 24; i ++) {
var day = document.createElement('hbox');
day.setAttribute('align', 'center');
if (i % 2)
day.setAttribute('class', 'day2');
else
day.setAttribute('class', 'day1');
daylist.appendChild(day);
var text = document.createTextNode("Today - " + i );
var description = document.createElement('description');
description.setAttribute('flex', '1');
description.appendChild(text);
day.appendChild(description);
var bars = document.createElement('vbox');
bars.setAttribute('align', 'end');
day.appendChild(bars);
for (var b = 0; b < 24; b++) {
var box = document.createElement('hbox');
box.setAttribute('width', '' + counts2[i*24 + b]);
box.setAttribute('height', '1');
box.setAttribute('class', 'green');
bars.appendChild(box);
}
}
}