var PLUGIN_INFO =
{NAME}
Vimperator plugin for Greasemonkey
teramako
0.6c
2.0pre
2.0pre
http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/gmperator.js
 (:
                                 - filename   : {String}
                                 - name       : {String}
                                 - namespace  : {String}
                                 - description: {String}
                                 - enabled    : {Boolean}
                                 - includes   : {String[]}
                                 - encludes   : {String[]}
                              )
]]>
;
(function(){
const Cc = Components.classes;
const Ci = Components.interfaces;
const gmID = '@greasemonkey.mozdev.org/greasemonkey-service;1';
if (!Cc[gmID]){
    liberator.log('Greasemonkey is not installed',0);
    return;
}
liberator.plugins.gmperator = (function(){ //{{{
    // -----------------------
    // PUBLIC section
    // -----------------------
    // {{{
    var manager = {
        register: function (uri,sandbox,script){
            var panelID = getPanelID(sandbox.window);
            if (!panelID) return;
            var gmCon;
            if (containers[panelID] && containers[panelID].uri == uri){
                gmCon = containers[panelID];
            } else {
                gmCon = new GmContainer(uri,sandbox);
                containers[panelID] = gmCon;
                this.__defineGetter__(panelID,function() gmCon);
                //liberator.log('gmpeartor: Registered: ' + panelID + ' - ' + uri,8);
            }
            gmCon.sandbox = sandbox;
            gmCon.addScript(script);
            gmCon.uri = uri;
            triggerGMEvent('GMInjectedScript',uri,script._filename);
            if (panelID == this.currentPanel){
                triggerGMEvent('GMActiveScript',uri,script._filename);
            }
        },
        get gmScripts() GM_getConfig().scripts,
        get allItem() containers,
        get currentPanel() getBrowser().mCurrentTab.linkedPanel,
        get currentContainer() containers[this.currentPanel] || null,
        get currentSandbox(){
            var id = this.currentPanel;
            return containers[id] ? containers[id].sandbox : null;
        },
        getSandboxFromWindow: function(win){
            for each (let c in containers){
                if (c.sandbox.window == win) return sandbox;
            }
            return null;
        },
        getContainersFromURI: function(uri){
            var list = [];
            for each (let c in containers){
                if (c.uri == uri) list.push(c);
            }
            return list.length > 0 ? list : null;
        }
    };
    // }}}
    // -----------------------
    // PRIVATE section
    // -----------------------
    // {{{
    var containers = {};
    var gmSvc = Cc[gmID].getService().wrappedJSObject;
    function appendCode(target,name,func){
        var original = target[name];
        target[name] = function(){
            var tmp = original.apply(target,arguments);
            func.apply(this,arguments);
            return tmp;
        };
    }
    appendCode(gmSvc,'evalInSandbox',function(code,uri,sandbox,script){
        liberator.plugins.gmperator.register(uri,sandbox,script);
    });
    function getPanelID(win){
        var tabs = getBrowser().mTabs;
        for (let i=0,l=tabs.length; i>;
        var scripts = GM_getConfig().scripts;
        var reg;
        if (args.bang || args.string == 'full'){
            reg = new RegExp();
        } else if (args.string){
            reg = new RegExp(args.string,'i');
        }
        if (reg){
            for each (let s in scripts){
                if (reg.test(s.name) || reg.test(s._filename)){
                    xml += scriptToString(s);
                }
            }
        } else {
            let table = ;
            let tr;
            for each (let script in scripts){
                tr = |
;
                if (script.enabled){
                    tr.* += {script.name};
                } else {
                    tr.* += | {script.name};
                }
                tr.* += | ({script._filename});
                table.* += tr;
            }
            xml += table;
        }
        liberator.echo(xml,true);
        function scriptToString(script){
            var table = ;
            [['FileName','_filename'],['NameSpace','namespace'],['Description','description'],
             ['Includes','includes'],['Excludes','excludes'],['Enabled','enabled']].forEach(function(prop){
                let tr = | 
                    | {prop[0]} | 
;
                let contents = script[prop[1]];
                if (typeof contents == 'string' || typeof contents == 'boolean'){
                    tr.* += {contents};
                } else {
                    let td = | ;
                    for (let i=0,l=contents.length; i;
                    }
                    tr.* += td;
                }
                table.* += tr;
            });
            return table;
        }
    },{
        bang:true
    }
); //}}}
commands.addUserCommand(['gmlo[ad]'],'load Greasemonkey scripts', //{{{
    function(args){
        if (!args.string){
            liberator.echoerr('Usage: :gmlo[ad][!] {name|filename}');
            return;
        }
        var scripts = GM_getConfig().scripts;
        var script;
        for (let i=0,l=scripts.length; i |