var mgr = {
    onLoad: function(){
        this.resetLabel();
        this.box = document.getElementById("console");

        var consoleService = Components.classes["@mozilla.org/consoleservice;1"]
            .getService(Components.interfaces.nsIConsoleService);
        consoleService.registerListener(this);
    },
    openLog: function(){
        var ios = this.Cc["@mozilla.org/network/io-service;1"].
            getService(this.Ci.nsIIOService);
        var file = this.Cc['@mozilla.org/file/directory_service;1']
            .getService(this.Ci.nsIProperties) .get('ProfD', this.Ci.nsIFile);

        file.append("foxmarks.log");
        var uri = ios.newFileURI(file);
        openDialog("chrome://browser/content/browser.xul", "_blank",
            "chrome,all,dialog=no", uri.spec);
    },
    resetLabel: function( server){
        var label = document.getElementById("currServer");

        if(server === undefined){
            var ps = this.Cc["@mozilla.org/preferences-service;1"].
                    getService(this.Ci.nsIPrefService);
                
            var prefs = ps.getBranch("foxmarks.");

            try {
                txt = prefs.getCharPref('host-bookmarks');
                switch(txt){
                    case "sync.staging.foxmarks.com":
                        server = "Staging";
                        break;
                    case "sync.dev.foxmarks.com":
                        server = "Dev";
                        break;
                    case "sync-local.staging.foxmarks.com:5000":
                        server = "Max";
                        break;
                    case "sync.foxmarks.com":
                    default:
                        server = "Production";
                        break;

                }
            } catch(e){
                server = "Production";
            }

        }

        label.setAttribute("value", "Current Server: " + server);
    },
    testrun: function(){
        var txt = this._gatherInfo();
        window.openDialog(
            "chrome://foxmarksdevtool/content/unittest.xul",
            "Foxmarks", "chrome,dialog,centerscreen"
        );
    },
    /*
    testff2: function(){
        var lm = Components.classes["@mozilla.org/login-manager;1"].
            getService(Components.interfaces.nsILoginManager);
        var nsli = new 
            Components.Constructor
("@mozilla.org/login-manager/loginInfo;1",
            Components.interfaces.nsILoginInfo, "init");
        var newli = new nsli("sync.staging.foxmarks.com", "", null, 
            "willwagner_testdel", "claire", "", "");
        lm.addLogin(newli);

    },
    */
    testerror: function(){
        var check = {value: false}; 
        var input = {value: "4"};
        var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
            .getService(Components.interfaces.nsIPromptService);
        if(ps.prompt(null, "Foxmarks Dev Tool", "Enter Error Number", 
            input, null, check)){
            
            var os = Components.classes["@mozilla.org/observer-service;1"]
                .getService(Components.interfaces.nsIObserverService);

            os.notifyObservers(null, "foxmarks-unittesterror", 
                input.value );
        }
    },
    aboutConfig: function(){
        var wm = this.Cc['@mozilla.org/appshell/window-mediator;1'].
            getService(this.Ci.nsIWindowMediator);
        var topWindow = wm.getMostRecentWindow('navigator:browser');
        if (topWindow) {
            var content = topWindow.document.getElementById('content');
            content.selectedTab =
                content.addTab("about:config");
            topWindow.focus();
        }
    },
    openSettings: function(pane){
        var os = this.Cc["@mozilla.org/observer-service;1"].
            getService(this.Ci.nsIObserverService);

        os.notifyObservers(null, "foxmarks-showsettingpane", 
            pane );
    },
    _foxmarksExtensionManagerLiteral: function(value) {
        var rdfs = Components.classes["@mozilla.org/rdf/rdf-service;1"].
            getService(Components.interfaces.nsIRDFService);
        var ds = Components.classes["@mozilla.org/extensions/manager;1"].
            getService(Components.interfaces.nsIExtensionManager).datasource;
        var s = rdfs.GetResource("urn:mozilla:item:foxmarks@kei.com");
        var p = rdfs.GetResource("http://www.mozilla.org/2004/em-rdf#" + value);
        var t = ds.GetTarget(s, p, true);
        if (t instanceof Components.interfaces.nsIRDFLiteral)
            return t.Value;
        else
            return "unknown";
    },
    setLogging: function(turnOn){
        var ps = this.Cc["@mozilla.org/preferences-service;1"].
                getService(this.Ci.nsIPrefService);
        var prefs = ps.getBranch("javascript.options.");
        prefs.setBoolPref("showInConsole", turnOn);
        prefs = ps.getBranch("extensions.logging.");
        prefs.setBoolPref("enabled", turnOn);
    },

    _gatherInfo: function(){
        var result = [];

        result.push('<?xml version="1.0"?>');
        result.push("<FoxmarksInfo>");
        result.push("  <Foxmarks>");
        result.push("    <version>" +
            this._foxmarksExtensionManagerLiteral("version") + 
            "</version>");
        result.push("  </Foxmarks>");
        result.push("  <ConfigVars>");
        var ps = this.Cc["@mozilla.org/preferences-service;1"].
                getService(this.Ci.nsIPrefService);
        var prefs = ps.getBranch("foxmarks.");
        var ext = ps.getBranch("extensions.");
        var obj = {};
        var list;
        list = prefs.getChildList("",obj)
        var len = list.length;
        while(len--){
            var valtype = prefs.getPrefType(list[len]);
            var val = "error";
            switch(valtype){
                case prefs.PREF_STRING:
                    val = prefs.getCharPref(list[len]);
                    break;
                case prefs.PREF_INT:
                    val = prefs.getIntPref(list[len]).toString();
                    break;
                case prefs.PREF_BOOL:
                    val = prefs.getBoolPref(list[len]).toString();
                    break;
            }
            result.push("    <" +
                list[len] +  ">" +
                val + "</" + list[len] + ">");
        }
        result.push("  </ConfigVars>");


        result.push("  <MachineInfo>");
        result.push("    <platform>" + navigator.platform + "</platform>");
        result.push("    <appname>" + navigator.appName + "</appname>");
        result.push("    <buildid>" + navigator.buildID + "</buildid>");
        result.push("    <language>" + navigator.language + "</language>");
        result.push("    <online>" + navigator.onLine + "</online>");
        result.push("    <os>" + navigator.oscpu + "</os>");
        result.push( "    <extensions>" +
            ext.getCharPref("enabledItems") + "</extensions>");
        result.push("  </MachineInfo>");

        result.push("  <ErrorLog>");
        result.push("<![CDATA[");
        var consoleService = Components.classes["@mozilla.org/consoleservice;1"]
                .getService(Components.interfaces.nsIConsoleService);
        var csArray = {};
        var csCt = {};

        consoleService.getMessageArray(csArray, csCt);
        for(var x = 0; x < csCt.value; x++){
            result.push("    " + csArray.value[x].message);
        }

        result.push("]]>");
        result.push("  </ErrorLog>");

        result.push("  <LogFile>");
        result.push("<![CDATA[");
        var file = this.Cc['@mozilla.org/file/directory_service;1']
            .getService(this.Ci.nsIProperties)
                .get('ProfD', this.Ci.nsIFile);

        file.append("foxmarks.log");
        var converter = this.Cc["@mozilla.org/intl/scriptableunicodeconverter"]
            .createInstance(this.Ci.nsIScriptableUnicodeConverter);
        converter.charset = "UTF-8";

                                 
        var logStream;
        try {
            logStream = this.Cc["@mozilla.org/network/file-input-stream;1"]
                .createInstance(this.Ci.nsIFileInputStream);

            logStream.init(file, -1, 0x01, 0);
            var lr = logStream.QueryInterface(
                this.Ci.nsILineInputStream);
            var buf;
            var lineData = {};
            var cont = true;
            var sizeToWrite = 10 * 1024;
            while(cont && logStream.available() > sizeToWrite){
                cont = lr.readLine(lineData);
            }
            while(cont){
                cont = lr.readLine(lineData);
                line = converter.ConvertToUnicode(lineData.value);
                result.push("    " + line);
            }
            logStream.close();
        }
        catch (e) {
            logStream.close();
        }
        result.push("]]>");
        result.push("  </LogFiles>");
        result.push("</FoxmarksInfo>");

        return result.join("\n");
    },
    gatherInfo: function(){
        var txt = this._gatherInfo();
        window.openDialog(
            "chrome://foxmarksdevtool/content/gather.xul",
            "Foxmarks", "chrome,dialog,centerscreen",
            txt
        );
    },
    Cc: Components.classes,
    Ci: Components.interfaces,
    clearBooks: function(){
        var ps = this.Cc["@mozilla.org/preferences-service;1"].
                getService(this.Ci.nsIPrefService);
            
        var prefs = ps.getBranch("foxmarks.");
        var obj = {};
        var list;
        list = prefs.getChildList("",obj)
        var len = list.length;
        var re = new RegExp("^[a-f,0-9]{16}\.");

        while(len--){
            var m = re.exec(list[len]);
            if(m !== null){
                prefs.clearUserPref(list[len]);
            }
        }
    },
    setEnvironment: function(type){
        var ps = this.Cc["@mozilla.org/preferences-service;1"].
                getService(this.Ci.nsIPrefService);
            
        var prefs = ps.getBranch("foxmarks.");

        switch(type){
            case 'prod':
                try {
                    prefs.clearUserPref('host-bookmarks');
                }
                catch(e){}
                try {
                    prefs.clearUserPref('host-passwords');
                }
                catch(e){}
                try {
                    prefs.clearUserPref('host-login');
                }
                catch(e){}
                try {
                    prefs.clearUserPref('host');
                }
                catch(e){}
                try {
                    prefs.clearUserPref('acctMgrHost');
                }
                catch(e){}
                try {
                    prefs.clearUserPref('wizardUrl');
                }
                catch(e){}
                break;
            case 'staging':
                prefs.setCharPref('host-bookmarks',
                    'sync.staging.foxmarks.com');
                prefs.setCharPref('host-passwords',
                    'sync.staging.foxmarks.com');
                prefs.setCharPref('host-login',
                    'login.staging.foxmarks.com');
                prefs.setCharPref('wizardUrl',
                    'http://login.staging.foxmarks.com/wizard');
                break;
            case 'dev':
                prefs.setCharPref('host-bookmarks',
                    'sync.dev.foxmarks.com');
                prefs.setCharPref('host-passwords',
                    'sync.dev.foxmarks.com');
                prefs.setCharPref('host-login',
                    'login.dev.foxmarks.com');
                prefs.setCharPref('wizardUrl',
                    'http://login.dev.foxmarks.com/wizard');
                break;
            case 'max':
                prefs.setCharPref('host-bookmarks',
                    'sync-local.staging.foxmarks.com:5000');
                prefs.setCharPref('host-passwords',
                    'sync-local.staging.foxmarks.com:5014');
                prefs.setCharPref('host-login',
                    'login-local.staging.foxmarks.com:5001');
                prefs.setCharPref('wizardUrl',
                    'http://login-local.staging.foxmarks.com:5001/wizard');
                break;
        }
        alert("environment changed");
        this.resetLabel();
    },

    /* console listener */
    observe: function(msg){
        try {
            var err = msg.QueryInterface(this.Ci.nsIScriptError);
        } catch(e){}

        if(err){
            if(err.flags != 1){
                var txt = err.toString();
                var style = "margin-left: 4px;";
                if(err.flags == 0 || err.flags == 4)
                    style += "font-weight: bold;";
                if(txt.indexOf("foxmarks") >= 0)
                    style += "color: red;";
                var frag; 
                if(style.length > 0){
                    frag = "<html:p style='" +
                        style + "'>"
                        + txt + "</html:p>";
                } else {
                    frag = "<html:p>" + txt+ "</html:p>";
                }
                try {
                    frag = frag.replace("<", "&lt;");
                    frag = frag.replace(">", "&gt;");
                    this.box.innerHTML += frag;
                    this.box.scrollTop = this.box.scrollHeight;
                } catch(e){}
            }
        }

    }
};

