var FreebaseExtension = { handlers: {} };

FreebaseExtension.handlers.editSchemaAlignment = function(reset) {
    new SchemaAlignmentDialog(
        reset ? null : theProject.overlayModels.freebaseProtograph, function(newProtograph) {});
};

FreebaseExtension.handlers.loadIntoFreebase = function() {
    new FreebaseLoadingDialog();
};

FreebaseExtension.handlers.browseToDataLoad = function() {
    // The form has to be created as part of the click handler. If you create it
    // inside the getJSON success handler, it won't work.
    
    var form = document.createElement("form");
    $(form)
        .css("display", "none")
        .attr("method", "GET")
        .attr("target", "dataload");

    document.body.appendChild(form);
    var w = window.open("about:blank", "dataload");
    
    $.getJSON(
        "/command/core/get-preference?" + $.param({ project: theProject.id, name: "freebase.load.jobID" }),
        null,
        function(data) {
            if (data.value == null) {
                alert("You have not tried to load the data in this project into Freebase yet.");
            } else {
                $(form).attr("action", "http://refinery.freebaseapps.com/load/" + data.value);
                form.submit();
                w.focus();
            }
            document.body.removeChild(form);
        }
    );
};

FreebaseExtension.handlers.importQAData = function() {
    Refine.postProcess(
        "freebase-extension",
        "import-qa-data",
        {},
        {},
        { cellsChanged: true }
    );
};

ExtensionBar.addExtensionMenu({
    "id" : "freebase",
    "label" : "Freebase",
    "submenu" : [
        {
            "id" : "freebase/schema-alignment",
            label: "Edit Schema Aligment Skeleton ...",
            click: function() { FreebaseExtension.handlers.editSchemaAlignment(false); }
        },
        {
            "id" : "freebase/reset-schema-alignment",
            label: "Reset Schema Alignment Skeleton ...",
            click: function() { FreebaseExtension.handlers.editSchemaAlignment(true); }
        },
        {},
        {
            "id" : "freebase/load-info-freebase",
            label: "Load into Freebase ...",
            click: function() { FreebaseExtension.handlers.loadIntoFreebase(); }
        },
        {
            "id" : "freebase/browse-load",
            label: "Browse to Data Load ...",
            click: function() { FreebaseExtension.handlers.browseToDataLoad(); }
        },
        {
            "id" : "freebase/import-qa-data",
            label: "Import QA Data",
            click: function() { FreebaseExtension.handlers.importQAData(); }
        }
    ]
});

DataTableColumnHeaderUI.extendMenu(function(column, columnHeaderUI, menu) {
    var columnIndex = Refine.columnNameToColumnIndex(column.name);
    var doAddColumnFromFreebase = function() {
        var o = DataTableView.sampleVisibleRows(column);
        new ExtendDataPreviewDialog(
            column, 
            columnIndex, 
            o.rowIndices, 
            function(extension) {
                Refine.postProcess(
                    "freebase-extension",
                    "extend-data", 
                    {
                        baseColumnName: column.name,
                        columnInsertIndex: columnIndex + 1
                    },
                    {
                        extension: JSON.stringify(extension)
                    },
                    { rowsChanged: true, modelsChanged: true }
                );
            }
        );
    };

    MenuSystem.insertAfter(
        menu,
        [ "core/edit-column", "core/add-column-by-fetching-urls" ],
        {
            id: "freebase/add-columns-from-freebase",
            label: "Add Columns From Freebase ...",
            click: doAddColumnFromFreebase
        }
    );
});