var SPARQLer = {};
SPARQLer.default_endpoint = "http://"+ document.location.host + "/sparql";
SPARQLer.default_endpoint = "http://sparql.org/books";
SPARQLer.endpoint = SPARQLer.default_endpoint;



SPARQLer.initialize = function (endpoint) {
  SPARQLer.endpoint = endpoint;
  SPARQLer.sparql = new SPARQL.Service(endpoint);
  SPARQLer.sparql.setPrefix("foaf", "http://xmlns.com/foaf/0.1/");
  SPARQLer.sparql.setPrefix("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
  SPARQLer.sparql.setPrefix("dc", "http://purl.org/dc/elements/1.1/");
  SPARQLer.sparql.setPrefix("ical", "http://www.w3.org/2002/12/cal/icaltzd#");
  SPARQLer.sparql.setPrefix("rdfs", "http://www.w3.org/2000/01/rdf-schema#");
  SPARQLer.dsmgr = SPARQL.UI.DataSetManager(document.getElementById("graphs"));
}

SPARQLer.setEndpoint = function(newEndpoint){
	if (SPARQLer.endpoint != newEndpoint){
		SPARQLer.initialize(newEndpoint);	
	}
}

SPARQL.UI = {};

SPARQL.UI.DataSetManager = function(o) {
  var table = o;
  var st = null;

  const NAMED_GRAPH = "named";
  const DEFAULT_GRAPH = "default";

  function _init() {
    var headers = document.createElement('tr');
    var vars = ["","Name","URL","Status","Default"];
    var types = [];
    for(i = 0; i < vars.length; i++) {
      var header = document.createElement('td');
      header.appendChild(document.createTextNode(vars[i]));
      headers.appendChild(header);
      types.push("String");
    }
    if(!table.tHead) table.createTHead();
    if(table.tBodies.length == 0) table.appendChild(document.createElement('tbody'));
    table.tHead.appendChild(headers);

    st = new SortableTable(table,types);
  };

  function _findRow(nameOrIndexOrUrl) {
    return table.rows[nameOrIndexOrUrl];
  };

  function _enableGraph(nameOrIndexOrUrl, enable) {
    var row = _findRow(nameOrIndexOrUrl);
    if(!row) return;
    _addClassName(row, enable ? "odd" : "even");
    _removeClassName(row, enable ? "even" : "odd");
    row.cells[0].firstChild.disabled = !enable;
    row.cells[0].firstChild.checked = enable;
    row.graphEnabled = enable;
  };

  function _setURL(nameOrIndexOrUrl, url) {
    var row = _findRow(nameOrIndexOrUrl);
    row.graphURL = url;
    row.cells[2].innerHTML = url;
  }

  function _setRealURL(nameOrIndexOrUrl, url) {
    var row = _findRow(nameOrIndexOrUrl);
    row.graphRealURL = url;
  }

  function _appendStatus(nameOrIndexOrUrl, msg) {
    var row = _findRow(nameOrIndexOrUrl);
    row.cells[3].innerHTML += "<div>" + msg +"</div>";
  }

  function _setStatus(nameOrIndexOrUrl, msg) {
    var row = _findRow(nameOrIndexOrUrl);
    row.cells[3].innerHTML = "<div>" + msg +"</div>";
  }

  function _trim(str) { 
    return str.replace(/^\s+|\s+$/, ''); 
  };

  function _getSelectedGraphs() {
    var urls = [];
    for(var i = 1; i < table.rows.length; i++) {
      var row = table.rows[i];
      if(!row.graphEnabled) continue;
      if(row.cells.length == 0) continue;
      if(!row.cells[0].hasChildNodes()) continue;
      if(!row.cells[0].firstChild.checked) continue;
      urls.push(row);
    }
    return urls;
  };

  function _addGraph(type, url, name) {
    var row = document.createElement('tr');

    row.graphName = name || "no name";
    row.graphURL = url;
    row.graphRealURL = url;
    row.graphType = type;
    row.graphEnabled = false;
    
    var checkBox = document.createElement('td');
    var nameCell = document.createElement('td');
    var urlCell = document.createElement('td');
    var statusCell = document.createElement('td');
    var defaultCell = document.createElement('td');
    var cb = document.createElement('input');
    cb.type = "checkbox";
    checkBox.appendChild(cb);
    nameCell.appendChild(document.createTextNode(name || "no name"));
    urlCell.appendChild(document.createTextNode(url));
    statusCell.appendChild(document.createTextNode(""));
    defaultCell.appendChild(document.createTextNode(type ==DEFAULT_GRAPH ? "*" : ""));
    row.appendChild(checkBox);
    row.appendChild(nameCell);
    row.appendChild(urlCell);
    row.appendChild(statusCell);
    row.appendChild(defaultCell);
    table.tBodies[0].appendChild(row);
    _enableGraph(row.rowIndex, true);
  };

  this.addDefaultGraph = function(url, name) { _addGraph(DEFAULT_GRAPH, url, name); };
  this.addNamedGraph = function(url, name) { _addGraph(NAMED_GRAPH, url, name); };

  function _buildDataSet(q) {
    var urls = _getSelectedGraphs();
    for(var i = 0; i < urls.length; i++) {
      if(urls[i].graphType == NAMED_GRAPH)
      q.addNamedGraph(urls[i].graphRealURL);
      if(urls[i].graphType == DEFAULT_GRAPH)
      q.addDefaultGraph(urls[i].graphRealURL);
    }
  }
  
  this.buildDataSet = _buildDataSet;

  // helpers

  function _addClassName(el, class) {
    var classes = el.className.split(" ");
    if(classes.some(function(c) { return c == class; }))
      return;
    classes.push(class);
    el.className = classes.join(" ");
  };

  function _removeClassName(el, class) {
    el.className = el.className.split(" ").filter(
      function(c) { return c != class; }).join(" ");
  };

  _init();

  return this;
};

