docs: function(csv, options, callback) {
        var options = (options !== undefined ? options : {});
        var config = {};
        config.callback = ((callback !== undefined && typeof(callback) === 'function') ? callback : false);
        config.separator = 'separator' in options ? options.separator : $.csv.defaults.separator;
        config.delimiter = 'delimiter' in options ? options.delimiter : $.csv.defaults.delimiter;
        config.headers = 'headers' in options ? options.headers : $.csv.defaults.headers;
        options.start = 'start' in options ? options.start : 1;
        
        // account for headers
        if(config.headers) {
          options.start++;
        }
        if(options.end && config.headers) {
          options.end++;
        }
        
        // setup
        var lines = [];
        var data = [];
        
        var options = {
          delimiter: config.delimiter,
          separator: config.separator,
          onParseEntry: options.onParseEntry,
          onParseValue: options.onParseValue,
          start: options.start,
          end: options.end,
          state: {
            rowNum: 1,
            colNum: 1
          },
          match: false
        };
  
        // fetch the headers
        var headerOptions = {
          delimiter: config.delimiter,
          separator: config.separator,
          start: 1,
          end: 1,
          state: {
            rowNum:1,
            colNum:1
          }
        }
        var headerLine = $.csv.parsers.splitLines(csv, headerOptions);
        var headers = $.csv.toArray(headerLine[0], options);
  
        // fetch the data
        var lines = $.csv.parsers.splitLines(csv, options);
        
        // reset the state for re-use
        options.state.colNum = 1;
        if(headers){
          options.state.rowNum = 2;
        } else {
          options.state.rowNum = 1;
        }
        
        // convert data to objects
        for(var i=0, len=lines.length; i<len; i++) {
          var entry = $.csv.toArray(lines[i], options);
          var object = {};
          for(var j in headers) {
            object[headers[j]] = entry[j];
          }
          data.push(object);
          
          // update row state
          options.state.rowNum++;
        }
  
        // push the value to a callback if one is defined
        if(!config.callback) {
          return data;
        } else {
          config.callback('', data);
        }
      }