var GSpreadsheet = function(key, mySubSheet, json, options) {
  this.key = key;
  this.options = options || {};
  this.data = [];
  this.headers = [];
  this.index = [];
  
  <!-- Get Query String Value - default HOME if no Query String -->
var query_string=document.location.search;
query_string=query_string.split('=');
var query_string_value
if (query_string[1]) {query_string_value=query_string[1]} else {query_string_value='home'};
<!-- end -->

  // initialize the data
  for (var x = 0; x < json.feed.entry.length; x++) {
    var entry = json.feed.entry[x];
    var row = {};
    for (var i in entry) {
      if (i.indexOf('gsx$') == 0) {
        var key = i.substring(4);

        if (x == 0) { // add to the headers on the first time around
          this.headers.push(key);
        }
        
        if (key == this.options['index']) { // save the index'd ite
          this.index[entry[i].$t] = x;
        }
        row[key] = entry[i].$t;
      }
    }
    this.data.push(row);
  }
  
  this.each = function(callback) {
    for (var x = 0; x < this.data.length; x++) {
      callback(this.data[x]);
    }
  };
  
  this.getQueryAll = function(row) {
	  for (var i = 1; i <= 1000; i++) {
	  x = query_string_value + i;
	  
	  if (this.select(x) == null) {
	  break;
	  }
	  
	  row(this.select(x));
	  continue;
	  
	  }
  };
  
  this.getRows = function(row, myRow, myRowEnd) {
	if (myRowEnd > this.data.length) {
		myRowEnd = this.data.length - 1;
	}
    for (var x = myRow; x <= myRowEnd; x++) {
      row(this.data[x]);
    }
  };
  
  /*
   * Take either a key (e.g. 'firstname') or the row id that you want
   */
  this.select = function(id) {
    if (typeof id == 'string') {
      return this.data[this.index[id]];
    } else {
      return this.data[id];
    }
  };
  
  // -- Debugging Helpers
  this.displayAll = function(inlineCSS) {
    if (!inlineCSS) inlineCSS = '';
    var table = "<table cellpadding='5' cellspacing='0' " + inlineCSS + "><tr>";
    for (var x = 0; x < this.headers.length; x++) {
      table += "<th style='background-color: black; color: white;'>" + this.headers[x] + "</th>";
    }
    table += "</tr>";

    var self = this;
    this.each(function(row) {
      var tr = "<tr>";
      for (var x = 0; x < self.headers.length; x++) {
        tr += "<td style='border: 1px solid grey;'>" + row[self.headers[x]] + "</td>";
      }
      tr += "</tr>";
      table += tr;
    });

    table += "</table>";
    return table;
  };
  
  this.displayRow = function(id) {
    var row = this.select(id);
    var keyvalues = [];
    for (var x in row) {
      keyvalues.push(x + ' = ' + row[x]);
    }
    return keyvalues.join(', ');
  }
  
  this.getHeaderLength = function() {
  	var headerLength = this.headers.length;
	return headerLength;
  }
  
  this.getColumnLength = function() {
  	var columnLength = json.feed.entry.length;
	return columnLength;
  }
  
  this.getHeaderData = function() {
	var self = this;
	var rowArray = []
	
	this.getQueryAll(function(row) {
	  var entryArray = [];
      
	  for (var x = 0; x < self.headers.length; x++) {
		var myDiv = row[self.headers[x]];
        entryArray.push(myDiv);
      }
	  
	  rowArray.push(entryArray);
    });
	
	return rowArray;
  }
  
  this.getHeaderData2 = function(myRow, myRowEnd) {
	var self = this;
	var rowArray = []
	
	this.getRows(function(row) {
	  var entryArray = [];
      
	  for (var x = 0; x < self.headers.length; x++) {
        entryArray.push(row[self.headers[x]]);
      }
	  
	  rowArray.push(entryArray);
    }, myRow, myRowEnd);
	
	return rowArray;
  }
  
  this.getColumnData = function() {
	var columnData = "<div>"
	var self = this;
	this.each(function(row) {
		var dataDiv = "<div>"
        dataDiv += "<div>"+row[self.headers[0]]+"</div>";
		dataDiv += "</div>"
		columnData += dataDiv;
		columnData += "</div>"
    });
	return columnData;
  }
  
  
  
  
}

/*
 * This is a static method that loads in spreadsheets and returns GSpreadsheets, passing them into their callback
 */
GSpreadsheet.load = function(key, mySubSheet, options, callback) {
  if (!options['worksheet']) options['worksheet'] = mySubSheet;
  var worksheet = options['worksheet'];
  
  var callbackName = "GSpreadsheet.loader_" + key.replace("\-","_").replace("\-","_")+"_" + worksheet;
  eval(callbackName + " = function(json) { var gs = new GSpreadsheet(key, mySubSheet, json, options); callback(gs); }");
  
  var script = document.createElement('script');

  script.setAttribute('src', 'http://spreadsheets.google.com/feeds/list/' + key + '/' + worksheet + '/public/values' +
                        '?alt=json-in-script&callback=' + callbackName);
  script.setAttribute('id', 'jsonScript');
  script.setAttribute('type', 'text/javascript');
  document.documentElement.firstChild.appendChild(script);
}


var Blogger = function(replaceText6, replaceText4, replaceText13, json) {
  this.replaceText6 = replaceText6;
  this.replaceText4 = replaceText4;
  this.replaceText13 = replaceText13;
  
  this.listEntries = function() {
	return json;
  }
}

// Retrieve the JSON feed.
Blogger.load = function(replaceText6, replaceText4, replaceText13, callback) {
	
	var callbackName;
    eval(callbackName + " = function(json) { var gs = new Blogger(replaceText6, replaceText4, replaceText13, json); callback(gs); }");
	
	var script = document.createElement('script');
			  script.setAttribute('src', 'http://'+ replaceText6 +'/feeds/posts/' + replaceText4 + '?alt=json-in-script&callback=' + callbackName + replaceText13);
			  script.setAttribute('id', 'jsonScript');
			  script.setAttribute('type', 'text/javascript');
			  document.documentElement.firstChild.appendChild(script); 
			  <!-- END -->
}