
jQuery.fn.extend({
  setDatasourceUrl: function(url, options) {
    if (options && options.url)
       options.url = url; // just in case.
    var defaults = {
        url: url,
        busyClass: "ajaxActivity",
        busySelector: null,
        updateView: true,
        dataType:'json'
    };
    var optionsq = $.extend(defaults, options);
    return this.each(function() {
        this.options = optionsq;
        //$(this).bind("onDataReceived", options.onDataReceived); // creates a datareceived event for the data object.
    });
  },

  fetch: function(url, options) {
    this.setDatasourceUrl(url, options);
    this.refresh();
  },

  refresh: function() {
       return this.each(function () {
            if (this.options.busySelector) {
                $(this.options.busySelector).removeClass(this.options.busyClass);
                $(this.options.busySelector).addClass(this.options.busyClass);
            }
            $.ajax({
                  type: "GET",
                  url: this.options.url,
                  options: this.options,
                  //complete: function () { alert('this.options.url='+this.options.url)},
                  e: this,
                  success: function(data) {
                      if ((this.options) && (this.options.busySelector)){
                          $(this.options.busySelector).removeClass(this.options.busyClass);
                      }
                      this.e.data = data;
                      $(this.e).trigger('onDataReceived', [data]);
                      processCommandQue();
                  },
                  dataType: this.options.dataType
            });
       })
  }
});


var Datasource = {};
$.extend(Datasource, {
    addDatasource: function(name) {
    $('body').append("<div id='"+name+"' style='display:none'>&nbsp;</div>");
  }
});

String.prototype.trim = function() {
  return this.replace(/^\s+|\s+$/g,"");
}

   function getObj(names, value) {
    var o = {};
    values = value.split("\t");
    //if (values.length == 1)
    //   return null;
    for(var x=0;x<names.length;x++) {
      o[names[x]] = values[x];
    }

    return o;
  }

  function getTSVData(textFieldSelector, groupBy) {
      var dat = $(textFieldSelector).val();

      if (!dat)
        return [];
      dat = dat.split("\n");
      var names = $(dat[0].split("\t"));
      for(var x=0;x<names.length;x++) {
         names[x] = names[x].toLowerCase();
         names[x] = names[x].trim();
         names[x] = names[x].replace(" ", "_");
       }
      dat = dat.slice(1);
      var results;
      if (groupBy) {
         results = {};
      } else {
         results = [];
      }
      if (groupBy) {
        $(dat).each(function(i) { var o=getObj(names, this);o[groupBy]=o[groupBy];if (!results[o[groupBy]]) results[o[groupBy]] = [];results[o[groupBy]].push(o) });
      } else {
         $(dat).each(function(i) { var o=getObj(names, this);if (o!=null) results.push(o) });
      }
      return results;
  }

