var PLUGIN_INFO =
  autoproxychanger
  setting proxy
  proxyの設定・自動切り替え
  0.1.3
  pekepeke
  2.0pre
  2.0pre
  http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/autoproxychanger.js
  ||
      let autochanger_proxy_settings = "[{ name:'disable', usage: 'direct connection', proxy:{type:0} }]"
      let autochanger_proxy_enabled = "true"
      ||<
      or your can set it using inline JavaScript.
      >||
      liberator.globalVariables.autochanger_proxy_enabled = true;
      liberator.globalVariables.autochanger_proxy_settings = [{
          name  : 'disable',
          usage : 'direct connection',
          proxy :{
            type      :0,
          },
        },{
          name  : 'http',
          usage : 'localhost proxy',
          proxy :{
            type      : 1,
            http      : 'localhost',
            http_port : 8080,
          },
          url   : /http:\/\/www.nicovideo.jp/,
          run   : 'java.exe',
          args  : ['C:\Personal\Apps\Internet\NicoCacheNl\NicoCache_nl.jar'],
        }];
      EOM
      ||<
  ]]>
;
liberator.plugins.AutoProxyChanger = (function() {
var gVar = liberator.globalVariables;
var proxy_settings = gVar.autochanger_proxy_settings;
if (!proxy_settings) {
  proxy_settings = [{
    name  : 'disable',
    usage : 'direct connection',
    proxy : {
      type      : 0,
    },
  }, {
    name  : 'http',
    usage : 'localhost:8080',
    proxy : {
      type      : 1,
      http      : 'localhost',
      http_port : 8080,
    },
  }];
}
const ENABLE_ICON = 'data:image/png;base64,'
  + 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMA/wAAAIBJekM9AAAB'
  + 'mElEQVR4nIWS3StDYRzHv895njOvaWy4WWPJcquE8nIrbSW54mrGjWsppbQtCuXajZd/QDKs'
  + 'UNxoLpYbKc1b2zm4mJ2NsGPNOC6OnHXGfO+eb8/neX6fp4e43aNWax3+iCgKK6uW3IZZrXXT'
  + '01OEkPzdiqL4fLPja04Al6H97aU3AAwAIcTmmMsHIoFJAIvDfgDja31Y8n8Dapw97cUGSilH'
  + 'CUlnshuB41+H1IDMJ5QsMb2cc3LMALha4fXOAPB6KIAKYcfroaIoaMBTKltaSqvlWGElDQgd'
  + 'nwBwtf6jxFRUXQDfYxRQYqIo+Hyz+eepSm/y+3MqI6czmvTVdbh/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= 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;
})();