/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

var view = 
{
    onRun : function()
    {
        runQueue.mArray = new Array();
        var sels = this.boxObject.view.selection,a=new Object(),b=new Object(),k;
        var rowResource, name, path;
        for (k=0;k<sels.getRangeCount();k++){
            sels.getRangeAt(k,a,b);
            for (var l=a.value;l<=b.value;l++) {
                rowResource = this.builder.getResourceAtIndex(l);
                itemCache.getItem(rowResource);
            }
        }
        runQueue.run();
    },
    displayTest : function()
    {
        var current = this.boxObject.view.selection.currentIndex;
        var rowResource = this.builder.getResourceAtIndex(current);
        var item = itemCache.getItem(rowResource);
    },
    browseForRDF : function()
    {
        var fp = doCreateRDFFP('Xalan Description File',
                               nsIFilePicker.modeOpen);
        var res = fp.show();

        if (res == nsIFilePicker.returnOK) {
            var furl = fp.fileURL;
            this.setDataSource(fp.fileURL.spec);
        }
    },
    dump_Good : function()
    {
        var enumi = this.mResultDS.GetSources(krTypeSucc, kGood, true);
        var k = 0;
        while (enumi.hasMoreElements()) {
            k += 1;
            dump(enumi.getNext().QueryInterface(nsIRDFResource).Value+"\n");
        }
        dump("found "+k+" good tests\n");
    },
    prune_ds : function()
    {
        if (this.mResultDS) {
            this.mResultDS.QueryInterface(nsIRDFPurgeableDataSource).Sweep();
        }
        regressionStats.init()
        itemCache.mArray = new Array();
    },
    setDataSource : function(aSpec)
    {
        var baseSpec;
        if (aSpec) {
            baseSpec = aSpec;
        }
        else {
            baseSpec = document.getElementById("xalan_rdf").value;
        }
        if (this.mXalanDS && this.mXalanDS.URI == baseSpec) {
            this.mXalanDS.QueryInterface(nsIRDFRemoteDataSource);
            this.mXalanDS.Refresh(true);
        }
        else {
            if (this.mXalanDS) {
                this.database.RemoveDataSource(view.mXalanDS);
            }
            this.mXalanDS = kRDFSvc.GetDataSourceBlocking(baseSpec);
            if (!this.mXalanDS) {
                alert("Unable do load DataSource: "+baseSpec);
                return;
            }
            this.database.AddDataSource(this.mXalanDS);
        }
        regressionStats.init();
        if (!this.mResultDS) {
            this.mResultDS = doCreate(kRDFInMemContractID,
                                      nsIRDFDataSource);
            this.database.AddDataSource(view.mResultDS);
            if (!this.mResultDS) {
                alert("Unable to create result InMemDatasource");
                return;
            }
        }

        this.builder.rebuild();
        document.getElementById("xalan_rdf").value = baseSpec;
        runItem.prototype.kXalan.init(runItem.prototype.kXalan.URLTYPE_STANDARD,
                                      0, baseSpec, null, null);
    },
    loadHtml : function(aUrl, aListener)
    {
        const nsIIRequestor = Components.interfaces.nsIInterfaceRequestor;
        const nsIWebProgress = Components.interfaces.nsIWebProgress;
        var req = this.mIframe.webNavigation.QueryInterface(nsIIRequestor);
        var prog = req.getInterface(nsIWebProgress);
        prog.addProgressListener(aListener, nsIWebProgress.NOTIFY_ALL);
        this.mIframe.webNavigation.loadURI(aUrl, 0,null,null,null);
    },
    fillItemContext : function()
    {
        var index = view.boxObject.view.selection.currentIndex;
        var res = view.builder.getResourceAtIndex(index);
        var purp = view.mXalanDS.GetTarget(res, krTypePurp, true);
        return (purp != null);
    }
}

regressionStats =
{
    observe: function(aSubject, aTopic, aData)
    {
        if (aTopic != 'success') {
            return;
        }
        var arc = (aData == "true") ? krTypeSuccCount : krTypeFailCount;
        this.assertNewCount(aSubject, arc, 1);
    },
    init: function()
    {
        if (this.mRegressionDS) {
            this.mRegressionDS.QueryInterface(nsIRDFPurgeableDataSource).Sweep();
        }
        else {
            this.mRegressionDS = 
                doCreate(kRDFInMemContractID, nsIRDFDataSource);
            view.database.AddDataSource(this.mRegressionDS);
        }
    },
    getParent: function(aDS, aSource)
    {
        // parent chached?
        var parent = this.mRegressionDS.GetTarget(aSource, krTypeParent, true);
        if (!parent) {
            var labels = view.mXalanDS.ArcLabelsIn(aSource);
            while (labels.hasMoreElements()) {
                var arc = labels.getNext().QueryInterface(nsIRDFResource);
                if (arc.Value.match(this.mChildRE)) {
                    parent = view.mXalanDS.GetSource(arc, aSource, true);
                    // cache the parent
                    this.mRegressionDS.Assert(aSource, krTypeParent,
                                              parent, true);
                }
            }
        }
        return parent;
    },
    assertNewCount: function(aSource, aArc, aIncrement)
    {
        var root = kRDFSvc.GetResource('urn:root');
        var count = 0;
        // parent chached?
        var parent = this.getParent(view.XalanDS, aSource);
        while (parent && !parent.EqualsNode(root)) {
            var countRes = view.mResultDS.GetTarget(parent, aArc, true);
            if (countRes) {
                count = countRes.QueryInterface(nsIRDFInt).Value;
            }
            var newCountRes = kRDFSvc.GetIntLiteral(count + aIncrement);
            if (!newCountRes) {
                return;
            }

            if (countRes) {
                view.mResultDS.Change(parent, aArc, countRes, newCountRes);
            }
            else {
                view.mResultDS.Assert(parent, aArc, newCountRes, true);
            }
            parent = this.getParent(view.XalanDS, parent);
        }
    },
    mRegressionDS: 0,
    mChildRE: /http:\/\/www\.w3\.org\/1999\/02\/22-rdf-syntax-ns#_/
}

function rdfObserve(aSubject, aTopic, aData)
{
    if (aTopic == "success") {
        var target = (aData == "true") ? kGood : kBad;
        view.mResultDS.Assert(aSubject, krTypeSucc, target, true);

        regressionStats.observe(aSubject, aTopic, aData);
    }
}

runItem.prototype.kObservers.push(rdfObserve);