aboutsummaryrefslogtreecommitdiffstats
path: root/bijin_clock.js
blob: c6a068a73e206d1caba4dc5893957c05aad40d1f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/*
 * http://www.bijint.com/
 *
 * == Start ==
 * js plugins.bijin_clock.start(min)
 *    min: interval minutes (default: 1)
 *
 * == Stop ==
 * js plugins.bijin_clock.stop()
 */
let PLUGIN_INFO =
<VimperatorPlugin>
<name>{NAME}</name>
<description>Bijin Clock - http://www.bijint.com</description>
<version>0.1</version>
</VimperatorPlugin>;

liberator.plugins.bijin_clock = (function(){
const BASE_URL = 'http://www.bijint.com/jp/img/photo/';
const TITLE = fromUTF8Octets("美人時計");
const NAME = "Bijin Clock";
let interval = null;
function getTimeString(date){
  let time = date.toTimeString();
  return time.substr(0,2) + time.substr(3,2);
}
function fromUTF8Octets(octets){
    return decodeURIComponent(octets.replace(/[%\x80-\xFF]/g, function(c){
        return '%' + c.charCodeAt(0).toString(16);
    }));
}
function showBijinClock(){
  let date = new Date;
  let image_src = BASE_URL + getTimeString(date) + ".jpg";
  liberator.echomsg(date.toLocaleString(), 0);
  openDialog('data:application/vnd.mozilla.xul+xml;charset=utf-8,' +
    <><?xml-stylesheet type="text/css" href="chrome://global/skin/"?>
    <?xml-stylesheet type="text/css" href="chrome://browser/skin/browser.css"?>
    <window title={TITLE}
            windowtype="alert:clock"
            style="background-color:transparent;"
            xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
      <script type="application/javascript"><![CDATA[
      var image;
      var interval;
      var opacity = 1;
      function init(){
        image = document.getElementById('contents');
        var x = screen.availLeft + screen.availWidth - outerWidth;
        var y = screen.availTop  + screen.availHeight - outerHeight;
        window.moveTo(x, y);
        image.style.backgroundColor = "-moz-dialog";
        setTimeout(function(){
          interval = window.setInterval(setOpacity, 200);
        }, 5 * 1000);
      }
      function setOpacity(){
        if (opacity < 0.2){
          stopAndClose();
        }
        opacity -= 0.1;
        image.style.opacity = opacity;
      }
      function stopAndClose(){
        clearInterval(interval);
        window.close();
      }
      ]]></script>
      <vbox id="contents" flex="1"
            style="border:thin solid black;">
        <hbox flex="1">
          <label value={TITLE + "-" + date.toLocaleString()} flex="1"/>
          <toolbarbutton label="X" oncommand="stopAndClose()" style="padding:0;margin:0;"/>
        </hbox>
        <image id="img" src={image_src} onload="init()" onerror="window.close()"/>
      </vbox>
    </window></>.toXMLString(),
    TITLE,
    'chrome,dialog=yes,titlebar=no,popup=yes');
}
let self = {
  start: function(){
    showBijinClock();
    if (interval) this.stop();
    interval = window.setInterval(showBijinClock, 60 * 1000);
    return interval;
  },
  stop: function(){
    if (interval){
      window.clearInterval(interval);
    }
    let w = Cc["@mozilla.org/appshell/window-mediator;1"]
      .getService(Ci.nsIWindowMediator)
      .getMostRecentWindow("alert:clock")
    if (w) w.close();
  },
};
setTimeout(function(){showBijinClock();}, 0);
setTimeout(function(){self.start();}, 60 * 1000 - Date.now() % (60*1000));

return self;
})();
// vim:sw=2 ts=2 et:
wGFvbBJuI2ZT9dbmbq4S' + '4w3l5ZTjOA1wOHuNxkrhNsIYLyXiOqX8MADBYFD3Gj9Kuh4AUeDJbUfcd4W/FhtbbEmfrT9+' + 'lJ0eBSJRl05JSsTNphop8WCrbwiHzw8O92j34EQtiZU1D7XZSpYtF51dHXa7XUrGGeNfUy8c' + 'x6XkV57xiaRUZawyFPFMTt4no9HHm2X1hvkFvZIuXyp4v/YfvuEoAAAAAElFTkSuQmCC'; const DISABLE_ICON = 'data:image/png;base64,' + 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMA/wAAAIBJekM9AAAB' + 'i0lEQVR4nH2SwUoCURSG/7lzZwJxYWqtRItQwm3LbCkStol8gLAW9QzB4AgW9QIJWc8QgVBI' + '7RQ3bsOmQGdsY466aCZ1RGwxksNo/rt7uN+55ztcJpk89vsD+CeKIt/e+awV6vcHBOGMYZjZ' + '2+PxOJ3OZK+9ACqVyk3OB4ACYBgmGo3OAoVCAcDJaRNA9noLueYEMBOLxXieZ1mWEDIYDPL5' + '/Nwhp8BoNBoOh71er9/vA4hEIqIoAqyYYgGgqYopVlHkKaBpmsPhMAxDEIQFSlOgXC6bjRcr' + 'URM1DwBEUVysRBVFTqczlkasVUnXdU3TTKsJ8P5R3T+Ih4KbcqPm9aw83D9alSilTqeTEDIF' + '4nu7Ltey3KhRyqntlk1p/lqLxaJtG39KtjoAZoyUtXqU/Fz8tejFOS9JkmEYpVKpVj+0Kant' + 'ltezqra/1tc2qtXX55cnNpFIcBwXDoeDwWDO9xbZ2Q6FQmqnRSmn6d+EEP1H4yjX7qhul5tf' + '4mi3263X65IkmS9cXtmVbPkFaGbHAxyF/18AAAAASUVORK5CYII='; var acmanager = []; const prefkeys = ['ftp','gopher','http','ssl']; var prevSetting = null; var _isEnable = false; var exec = (function(){ const Cc = Components.classes; const Ci = Components.interfaces; var getFile = function(){ if (arguments.length <= 0) return null; var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile); if (!file) return null; file.initWithPath(arguments[0]); for (var i=1; i<arguments.length; i++) file.append(arguments[i]); if (file.exists() && file.isFile) return file; return null; }; var getPathSplitChar = function(){ var os = Cc["@mozilla.org/xre/app-info;1"].createInstance(Ci.nsIXULRuntime).OS; if (os == "WINNT") return ";"; return ":"; }; var run = function(file, arg, async){ arg = arg || []; var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); process.init(file); process.run(false, arg, arg.length); return process.exitValue; }; const spchar = getPathSplitChar(); return function(cmd, arg, async){ var file; if ( (cmd.indexOf('/') >= 0 || cmd.indexOf('\\') >= 0) && (file=getFile(cmd)) ) return run(file, arg, async); var env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment); var exitValue = null; env.get('PATH').split(spchar).some( function(path){ if (file=getFile( path, cmd)){ exitValue = run(file, arg, async); return true; } return false; } ); return exitValue; }; })(); var ProxyChanger = function() this.initialize.apply(this, arguments); ProxyChanger.prototype = { initialize: function() { this.panel = this.createPanel(); }, createPanel: function() { var self = this; var panel = document.getElementById('proxychanger-status'); if (panel) { let parent = panel.parentNode; parent.removeChild(panel); } panel = document.createElement('statusbarpanel'); panel.setAttribute('id', 'proxychanger-status'); panel.setAttribute('class', 'statusbarpanel-iconic'); panel.setAttribute('src', self.isEnable ? ENABLE_ICON : DISABLE_ICON); panel.addEventListener('click', function(e) { self.isEnable = !self.isEnable; }, false); document.getElementById('status-bar').insertBefore( panel, document.getElementById('security-button').nextSibling); return panel; }, get isEnable() _isEnable, set isEnable(val) { this.panel.setAttribute('src', val ? ENABLE_ICON : DISABLE_ICON); _isEnable = val; }, autoApplyProxy : checkApplyProxy }; var manager = new ProxyChanger(); function init() { // initialize manager proxy_settings.forEach(function(s) { if (s.url instanceof RegExp && s.name) acmanager.push( {url: s.url, name: s.name, run: s.run || '', args: s.args || [] } ); }); proxy_settings.splice(0, 0, {name: 'default', usage: 'default setting', proxy: restore() }); if (acmanager.length > 0) { autocommands.add("LocationChange", '.*', 'js liberator.plugins.AutoProxyChanger.autoApplyProxy()'); window.addEventListener("unload", function() { if (prevSetting != null) applyProxy(prevSetting) }, false); } manager.isEnable = eval(gVar.autochanger_proxy_enabled) || false; } function restore() { var opt = new Object(); opt['type'] = options.getPref('network.proxy.type', 0); prefkeys.forEach(function(key) { opt[key] = options.getPref('network.proxy.' + key, ''); opt[key+'_port'] = options.getPref('network.proxy.' + key + '_port', 0); }); return opt; } function dump(obj) { var m = ''; for (let key in obj) m+=key+':'+obj[key]+'\n'; return m; } function checkApplyProxy() { if (prevSetting != null) { applyProxy(prevSetting); prevSetting = null; } if (!_isEnable) return; acmanager.some( function( manager ) { if (manager.url.test(content.location.href)) { prevSetting = restore(); try { if (manager.run) { if (exec(manager.run, manager.args, false) == null) throw "run process failed..."; manager.run = null; manager.args = null; } applyProxyByName(manager.name); return true; } catch(e) { liberator.echoerr(e); return true; } } return false; }); } function applyProxyByName( name ) { if (!name) { liberator.echo( dump(restore())+'usage:proxy [setting name]' ); return; } proxy_settings.some( function(setting) { if (setting.name.toLowerCase() != name.toLowerCase()) return false; // delete setting prefkeys.forEach( function(key) { options.setPref('network.proxy.'+key, ''); options.setPref('network.proxy.'+key+'_port', 0); }); // apply proxy applyProxy(setting.proxy); return true; }); } function applyProxy(proxy) { for (let key in proxy) { if (typeof proxy[key] != 'undefined') options.setPref('network.proxy.'+key, proxy[key]); } } commands.addUserCommand(['proxy'], 'Proxy settings', function(args) { if (args.bang) applyProxyByName('default'); else applyProxyByName(args.string); }, { bang: true, completer: function(context, arg) { context.title = ['Name', 'Usage']; var list = context.filter ? proxy_settings.filter( function(el) this.test(el.name), new RegExp('^'+context.filter)) : proxy_settings; context.completions = list.map( function(v) [v.name, v.usage] ); } }); commands.addUserCommand(['toggleautoproxy','aprxy'], 'Toggle auto proxy changer on/off', function() { manager.isEnable = !manager.isEnable liberator.echo('autoproxy:'+ manager.isEnable ? 'ON' : 'OFF'); }, {} ); init(); return manager; })();