function SpreadsheetsLayerCallback(json, spreadsheetsLayer) {
  var bounds = new GLatLngBounds();      

  for (var i = 0; i < json.feed.entry.length; i++) {
    var entry = json.feed.entry[i];
    if(entry["gsx$" + spreadsheetsLayer.options.column_lat]) {
      var label = this.getColumnVal(entry, spreadsheetsLayer.options.column_title);
      var url = this.getColumnVal(entry, spreadsheetsLayer.options.column_desc);
      var notes = this.getColumnVal(entry, spreadsheetsLayer.options.column_notes);

      var lat = parseFloat(this.getColumnVal(entry, spreadsheetsLayer.options.column_lat));
      var lng = parseFloat(this.getColumnVal(entry, spreadsheetsLayer.options.column_lng));
      var latlng = new GLatLng(lat, lng);
	  
	  var notes_parsed = "";
	  var foundAt = 0 ;
	  var begtag;
	  var endtag;
	  var nth_line ;
	  var endStr = notes ;
	  var newbeg = 0 ;
	  
	  while (newbeg != -1) {
	    endtag = -1 ;
	    begtag = -1 ;
	  
	    nth_line = endStr.substring(0,36) ;
		
	    if (nth_line.length == 0){
		  newbeg = -1 ;
		}
		else {
	  
			newbeg = 36 ;
			endStr = endStr.substring(newbeg) ;			
			
			foundAt = endStr.indexOf(" ") ;
			if (foundAt != -1){
			  nth_line = nth_line + endStr.substring(0,foundAt) ;
			  newbeg = foundAt + 1;
			  endStr = endStr.substring(newbeg) ;
			}
			
		    begtag = nth_line.indexOf("<") ;
			
			if (begtag != -1){
			  endtag = nth_line.indexOf(">") ;
			  if (endtag == -1){
			    endtag = endStr.indexOf(">") ;
			    nth_line = nth_line + endStr.substring(0,endtag) ;				
     			nth_line = nth_line.substring(0,begtag - 1) + "<br>" + nth_line.substring(begtag) ;			
				newbeg = endtag + 1 ;
				endStr = endStr.substring(newbeg) ;			
			  }
			}
		  
		    notes_parsed = notes_parsed + nth_line + "<br>";
		}

	  }
	  
      var div = document.createElement('div');
      div.innerHTML += '<strong>' + this.getColumnVal(entry, spreadsheetsLayer.options.column_title) + 	
		'</strong><br><br>' + notes_parsed +
		'<br><br>' ;
	  
      var link = document.createElement('a');
      link.href = url;
      link.target = '_blank';
      link.appendChild(document.createTextNode('Click to view Project Info'));
      div.appendChild(link);

      var marker = this.createMarker(spreadsheetsLayer, latlng, label, div);
      spreadsheetsLayer.mgr.addMarker(marker, 0);
      bounds.extend(latlng);
    }
  }
}

SpreadsheetsLayerCallback.prototype.getColumnVal = function(entry, columnName) {
  var columnVal = '';
  if (entry["gsx$" + columnName]) {
    columnVal = entry["gsx$" + columnName].$t;
  }
  return columnVal;
}

SpreadsheetsLayerCallback.prototype.createMarker = function(spreadsheetsLayer, latlng, label, div) {
  var marker = new GMarker(latlng, {icon: spreadsheetsLayer.markerIcon, title: label});

  GEvent.addListener(marker, "click", function() {
    marker.openInfoWindow(div);
  });

  return marker;
}


function SpreadsheetsLayer(map, userOptions) {
  var me = this;
  me.ids = {};
  me.map = map;
  me.options = {
    key: 'pgRkJFS0H9To01Q1tme_AAA',
    id: 'default',
    query: '',
    video_width: '400px',
    video_height: '300px',
    column_title: "title",
    column_desc: "description",
	column_notes: "notes",
    column_lat: "latitude",
    column_lng: "longitude",
    icon_color: "green"
  };

  for (optionName in userOptions) {
    if (userOptions.hasOwnProperty(optionName)) {
      me.options[optionName] = userOptions[optionName];
    }
  }

  me.mgr = new MarkerManager(map, {maxZoom: 19});

  var icon = new GIcon(G_DEFAULT_ICON);
  icon.image = 'pics/voaz_mrkr.png';
  icon.shadow = null;
  icon.iconSize = new GSize(16, 15);
  icon.shadowSize = new GSize(0, 0);
  icon.iconAnchor = new GPoint(10, 10);
  icon.infoWindowAnchor = new GPoint(9, 2);
  icon.infoShadowAnchor = new GPoint(18, 15);
  me.markerIcon = icon;

  me.enabled = false;
}

SpreadsheetsLayer.prototype.enable = function() {
  this.enabled = true;
  this.load();
}

SpreadsheetsLayer.prototype.disable = function() {
  this.enabled = false;
  this.mgr.clearMarkers();
  this.ids = {};
}

SpreadsheetsLayer.prototype.getEnabled = function() {
  return this.enabled;
}

SpreadsheetsLayer.prototype.load = function() {
  var me = this;
  var uniqueID = "";
  for (optionName in me.options) {
    if (me.options.hasOwnProperty(optionName)) {
      var optionVal = "" + me.options[optionName] + "";
      uniqueID += optionVal.replace(/[^\w]+/g,"");
//	  alert(optionVal) ;
    }
  }
  var callbackName = "SpreadsheetsLayerCallback.loader" + uniqueID;
  eval(callbackName + " = function(json) { var pa = new SpreadsheetsLayerCallback(json, me);}");
 
  var script = document.createElement('script');
  script.setAttribute('src', 'http://spreadsheets.google.com/feeds/list'
                         + '/' + me.options.key + '/' + me.options.id + '/public/values' +
                        '?alt=json-in-script&callback=' + callbackName + '&' + me.options.query);
  script.setAttribute('type', 'text/javascript');
//  alert(script.getAttribute('src')) ;
  document.documentElement.firstChild.appendChild(script);
}

