


/**
 * Map
 */
_mPreferMetric=true;                                 //to make size sure for IE too
var map = new GMap2(document.getElementById("map"), {size:new GSize(580,380)});
map.setCenter(new GLatLng(37.879916691579866,-122.28052140242449), 13);
map.setUIToDefault();
map.openInfoWindowHtml(map.getCenter(),"Nice to see you.");
map.closeInfoWindow(); //preloading infowindow


/**
 * parseCsv()
 * @return an array of GLatLng() objects
 * @param opt_options object {lat, lng} integers defining the csv cells of coordinates (default: {lat:1, lng:0})
 * @author Esa 2008
 */
String.prototype.parseCsv = function(opt_options){
  var results = [];
  var opts = opt_options||{};
  var iLat = opts.lat||1;
  var iLng = opts.lng||0;
  var lines = this.split("\n");
  for (var i=0; i<lines.length; i++) {
    var blocks = lines[i].split('"');
    //finding commas inside quotes. Replace them with '::::'
    for(var j=0;j<blocks.length;j++){
      if(j%2){
        blocks[j]=blocks[j].replace(/,/g,'::::');
      }
    }  //@author Esa 2008, keep this note.
    lines[i] = blocks.join("");
    var lineArray = lines[i].split(",");
    var lat = parseFloat(lineArray[iLat]);
    var lng = parseFloat(lineArray[iLng]);
    var point = new GLatLng(lat,lng);
    //after splitting by commas, we put hidden ones back
    for(var cell in lineArray){
      lineArray[cell] = lineArray[cell].replace(/::::/g,',');
    } //corrupted line step-over
    if(!isNaN(lat+lng)){
      point.textArray = lineArray;
      results.push(point);
    }
  }
  return results;
}




/**
 * create the markers
 */
function populateMap(points, opt_options){
  var opts = opt_options||{};
  var color = opts.color||'red';
  for (var i=0; i < points.length; i++) {
    var label = points[i].textArray[2];
    points[i].marker = new GMarker(points[i],{title: label});
    map.addOverlay(points[i].marker);
    createInfoWindow(points[i]);
    addToSideBar(points[i], opts);
  }
}


/**
 * A general helper function for creating html elements. <div> as default element type
 * @author Esa 2008 
 * used for infowindows and sidebar
 */
function createElem(opt_className, opt_html, opt_tagName) {
  var tag = opt_tagName||"div";
  var elem = document.createElement(tag);
  if (opt_html) elem.innerHTML = opt_html;
  if (opt_className) elem.className = opt_className;
  return elem;
}

/**
 * create infowindow
 */
function createInfoWindow(point){
  var iwNode = createElem("info-window");
  for(var i=2; i<point.textArray.length; i++)
  iwNode.appendChild(createElem("iw-cell-"+i, point.textArray[i]));
  point.marker.bindInfoWindow(iwNode,{maxWidth:300});
}

/**
 * Populate sidebar
 */
var sideBar = document.getElementById("sidebar");
function addToSideBar(point,opt_options){
  var opts = opt_options||{};
  var iLabel = opts.iLabel||2;
  var label = createElem("sidebar-entry", point.textArray[iLabel], "a");
  label.href = "#";
  label.style.display = "block";
  label.onclick = function(){GEvent.trigger(point.marker,'click'); return false};//x-browser
  label.onfocus = function(){GEvent.trigger(point.marker,'click'); return false};
  sideBar.appendChild(label);
  GEvent.addListener(point.marker,'click',function(){label.focus(); map.setZoom(16); map.setCenter(point); return false});
  return point;
}

/**
 * This function triggers the downloading and parsing of a selected text file
 * marker, sidebar and infowindow data is extracted from the file
 */
function ajaxLoad(fileName,opt_options){
  var opts = opt_options||{};
  var process = function(material){
    var entries = material.parseCsv(material, opts);
    populateMap(entries, opts);
  }
  GDownloadUrl(fileName, process);
}


window.onload = function(){ajaxLoad("fairports.htm")};


