var theProject; var ui = {}; var Refine = { refineHelperService: "http://1.refine-helper.stefanomazzocchi.user.dev.freebaseapps.com" }; Refine.reportException = function(e) { if (window.console) { console.log(e); } }; function resize() { var header = $("#header"); var leftPanelWidth = 300; var width = $(window).width(); var top = $("#header").outerHeight(); var height = $(window).height() - top; var leftPanelPaddings = ui.leftPanelDiv.outerHeight(true) - ui.leftPanelDiv.height(); ui.leftPanelDiv .css("top", top + "px") .css("left", "0px") .css("height", (height - leftPanelPaddings) + "px") .css("width", leftPanelWidth + "px"); var leftPanelTabsPaddings = ui.leftPanelTabs.outerHeight(true) - ui.leftPanelTabs.height(); ui.leftPanelTabs.height(ui.leftPanelDiv.height() - leftPanelTabsPaddings); var rightPanelVPaddings = ui.rightPanelDiv.outerHeight(true) - ui.rightPanelDiv.height(); var rightPanelHPaddings = ui.rightPanelDiv.outerWidth(true) - ui.rightPanelDiv.width(); ui.rightPanelDiv .css("top", top + "px") .css("left", leftPanelWidth + "px") .css("height", (height - rightPanelVPaddings) + "px") .css("width", (width - leftPanelWidth - rightPanelHPaddings) + "px"); ui.viewPanelDiv.height((height - ui.toolPanelDiv.outerHeight() - rightPanelVPaddings) + "px"); var processPanelWidth = 400; ui.processPanelDiv .css("width", processPanelWidth + "px") .css("left", Math.floor((width - processPanelWidth) / 2) + "px"); } function resizeTabs() { var totalHeight = ui.leftPanelDiv.height(); var headerHeight = ui.leftPanelTabs.find(".ui-tabs-nav").outerHeight(true); var visibleTabPanels = ui.leftPanelTabs.find(".ui-tabs-panel:not(.ui-tabs-hide)"); var paddings = visibleTabPanels.outerHeight(true) - visibleTabPanels.height(); var allTabPanels = ui.leftPanelTabs.find(".ui-tabs-panel"); allTabPanels.height(totalHeight - headerHeight - paddings - 1); } function resizeAll() { resize(); resizeTabs(); ui.extensionBar.resize(); ui.browsingEngine.resize(); ui.processPanel.resize(); ui.historyPanel.resize(); ui.dataTableView.resize(); } function initializeUI(uiState) { $("#loading-message").hide(); $("#project-title").show(); $("#project-controls").show(); $("#body").show(); $('#project-name-button').click(Refine._renameProject); $('#project-permalink-button').mouseenter(function() { this.href = Refine.getPermanentLink(); }); Refine.setTitle(); ui = DOM.bind($("#body")); ui.extensionBar = new ExtensionBar(ui.extensionBarDiv); // construct the menu first so we can resize everything else ui.exporterManager = new ExporterManager($("#export-button")); ui.leftPanelTabs.tabs({ selected: 0 }); resize(); resizeTabs(); ui.summaryBar = new SummaryBar(ui.summaryBarDiv); ui.browsingEngine = new BrowsingEngine(ui.facetPanelDiv, uiState.facets || []); ui.processPanel = new ProcessPanel(ui.processPanelDiv); ui.historyPanel = new HistoryPanel(ui.historyPanelDiv, ui.historyTabHeader); ui.dataTableView = new DataTableView(ui.viewPanelDiv); ui.leftPanelTabs.bind('tabsshow', function(event, tabs) { if (tabs.index === 0) { ui.browsingEngine.resize(); } else if (tabs.index === 1) { ui.historyPanel.resize(); } }); $(window).bind("resize", resizeAll); if (uiState.facets) { Refine.update({ engineChanged: true }); } } Refine.setTitle = function(status) { var title = theProject.metadata.name + " - Google Refine"; if (status) { title = status + " - " + title; } document.title = title; $("#project-name-button").text(theProject.metadata.name); }; Refine.reinitializeProjectData = function(f) { Ajax.chainGetJSON( "/command/core/get-project-metadata?" + $.param({ project: theProject.id }), null, function(data) { theProject.metadata = data; }, "/command/core/get-models?" + $.param({ project: theProject.id }), null, function(data) { for (var n in data) { if (data.hasOwnProperty(n)) { theProject[n] = data[n]; } } }, f ); }; Refine._renameProject = function() { var name = window.prompt("New project name:", theProject.metadata.name); if (name == null) { return; } name = $.trim(name); if (theProject.metadata.name == name || name.length == 0) { return; } $.ajax({ type: "POST", url: "/command/core/rename-project", data: { "project" : theProject.id, "name" : name }, dataType: "json", success: function (data) { if (data && typeof data.code != 'undefined' && data.code == "ok") { theProject.metadata.name = name; Refine.setTitle(); } else { alert("Failed to rename project: " + data.message); } } }); }; /* * Utility state functions */ Refine.createUpdateFunction = function(options, onFinallyDone) { var functions = []; var pushFunction = function(f) { var index = functions.length; functions.push(function() { f(functions[index + 1]); }); }; pushFunction(function(onDone) { ui.historyPanel.update(onDone); }); if (options.everythingChanged || options.modelsChanged || options.columnStatsChanged) { pushFunction(Refine.reinitializeProjectData); } if (options.everythingChanged || options.modelsChanged || options.rowsChanged || options.rowMetadataChanged || options.cellsChanged || options.engineChanged) { pushFunction(function(onDone) { ui.dataTableView.update(onDone); }); pushFunction(function(onDone) { ui.browsingEngine.update(onDone); }); } functions.push(onFinallyDone || function() {}); return functions[0]; }; Refine.update = function(options, onFinallyDone) { var done = false; var dismissBusy = null; Refine.setAjaxInProgress(); Refine.createUpdateFunction(options, function() { Refine.clearAjaxInProgress(); done = true; if (dismissBusy) { dismissBusy(); } if (onFinallyDone) { onFinallyDone(); } })(); window.setTimeout(function() { if (!done) { dismissBusy = DialogSystem.showBusy(); } }, 500); }; Refine.postCoreProcess = function(command, params, body, updateOptions, callbacks) { Refine.postProcess("core", command, params, body, updateOptions, callbacks); }; Refine.postProcess = function(moduleName, command, params, body, updateOptions, callbacks) { updateOptions = updateOptions || {}; callbacks = callbacks || {}; params = params || {}; params.project = theProject.id; body = body || {}; if (!("includeEngine" in updateOptions) || updateOptions.includeEngine) { body.engine = JSON.stringify( "engineConfig" in updateOptions ? updateOptions.engineConfig : ui.browsingEngine.getJSON() ); } var done = false; var dismissBusy = null; function onDone(o) { done = true; if (dismissBusy) { dismissBusy(); } Refine.clearAjaxInProgress(); if (o.code == "error") { if ("onError" in callbacks) { try { callbacks.onError(o); } catch (e) { Refine.reportException(e); } } else { alert(o.message); } } else { if ("onDone" in callbacks) { try { callbacks.onDone(o); } catch (e) { Refine.reportException(e); } } if (o.code == "ok") { Refine.update(updateOptions, callbacks.onFinallyDone); if ("historyEntry" in o) { ui.processPanel.showUndo(o.historyEntry); } } else if (o.code == "pending") { if ("onPending" in callbacks) { try { callbacks.onPending(o); } catch (e) { Refine.reportException(e); } } ui.processPanel.update(updateOptions, callbacks.onFinallyDone); } } } Refine.setAjaxInProgress(); $.post( "/command/" + moduleName + "/" + command + "?" + $.param(params), body, onDone, "json" ); window.setTimeout(function() { if (!done) { dismissBusy = DialogSystem.showBusy(); } }, 500); }; Refine.setAjaxInProgress = function() { $(document.body).attr("ajax_in_progress", "true"); }; Refine.clearAjaxInProgress = function() { $(document.body).attr("ajax_in_progress", "false"); }; /* * Utility model functions */ Refine.cellIndexToColumn = function(cellIndex) { var columns = theProject.columnModel.columns; for (var i = 0; i < columns.length; i++) { var column = columns[i]; if (column.cellIndex == cellIndex) { return column; } } return null; }; Refine.columnNameToColumn = function(columnName) { var columns = theProject.columnModel.columns; for (var i = 0; i < columns.length; i++) { var column = columns[i]; if (column.name == columnName) { return column; } } return null; }; Refine.columnNameToColumnIndex = function(columnName) { var columns = theProject.columnModel.columns; for (var i = 0; i < columns.length; i++) { var column = columns[i]; if (column.name == columnName) { return i; } } return -1; }; Refine.preparePool = function(pool) { for (var id in pool.recons) { if (pool.recons.hasOwnProperty(id)) { var recon = pool.recons[id]; if (recon.m) { recon.m = pool.reconCandidates[recon.m]; } if (recon.c) { for (var j = 0; j < recon.c.length; j++) { recon.c[j] = pool.reconCandidates[recon.c[j]]; } } } } }; Refine.fetchRows = function(start, limit, onDone, sorting) { var body = { engine: JSON.stringify(ui.browsingEngine.getJSON()) }; if (sorting) { body.sorting = JSON.stringify(sorting) } $.post( "/command/core/get-rows?" + $.param({ project: theProject.id, start: start, limit: limit }) + "&callback=?", body, function(data) { theProject.rowModel = data; // Un-pool objects Refine.preparePool(data.pool); for (var r = 0; r < data.rows.length; r++) { var row = data.rows[r]; for (var c = 0; c < row.cells.length; c++) { var cell = row.cells[c]; if ((cell) && ("r" in cell)) { cell.r = data.pool.recons[cell.r]; } } } if (onDone) { onDone(); } }, "jsonp" ); }; Refine.getPermanentLink = function() { var params = [ "project=" + escape(theProject.id), "ui=" + escape(JSON.stringify({ facets: ui.browsingEngine.getFacetUIStates() })) ]; return "project?" + params.join("&"); }; /* * Loader */ function onLoad() { var params = URL.getParameters(); if ("project" in params) { var uiState = {}; if ("ui" in params) { try { uiState = JSON.parse(params.ui); } catch (e) { } } Refine.reinitializeProjectData(function() { initializeUI(uiState); }); } } $(onLoad);