﻿var static_businesses = [
{city: 'WI'}, {city: 'IL'}, {city: 'MN'}, {city: 'Lansing,MI'}, {city: 'TX'}, {city: 'CA'}, {city: 'OH'}, {city: 'GA'}];

var businesses = [
{pin: '&#934;&#934; 1', name: 'Eric Malinowski', city: 'Ballwin, MO', lat: 38.576239, lng: -90.527075},
{pin: '&#934;&#934; 2', name: 'Timothy Fuss', city: 'Rochester, NY', lat: 43.174716, lng: -77.561479},
{pin: '&#934;&#934; 3', name: 'Carl L. Bowman', city: 'International Falls, MN', lat: 48.583437, lng: -93.397666},
{pin: '&#934;&#934; 4', name: 'Terry J. Szapa', city: 'Green Bay, WI', lat: 44.56487, lng: -88.102907},
{pin: '&#934;&#934; 5', name: 'Robert Wilson', city: 'Los Altos Hills, CA', lat: 37.352737, lng: -122.089612},
{pin: '&#934;&#934; 6', name: 'Kevin J. Alder', city: 'Brighton, MI', lat: 42.512516, lng: -83.781888},
{pin: '&#934;&#934; 8', name: 'Kelly D. Jackson', city: 'St. Clair, MI', lat: 42.838508, lng: -82.513770},
{pin: '&#934;&#934; 11', name: 'Michael Coley', city: 'Sterling Heights, MI', lat: 42.563418, lng: -83.068639},
{pin: '&#934;&#934; 12', name: 'Steven J. Nicholas', city: 'South Range, MI', lat: 47.070361, lng: -88.641083},
{pin: '&#934;&#934; 13', name: 'Christian J. Andersen', city: 'Cadillac, MI', lat: 44.246385, lng: -85.440921},
{pin: '&#934;&#934; 14', name: 'Gary E. McGraw', city: 'Bethlehem, PA', lat: 40.652024, lng: -75.376049},
{pin: '&#934;&#934; 15', name: 'Walter Lechniak', city: 'Roseville, MI', lat: 42.506206, lng: -82.937879},
{pin: '&#934;&#934; 16', name: 'Jon W. Cook', city: 'Allegan, MI', lat: 42.529251, lng: -85.857937},
{pin: '&#934;&#934; 17', name: 'Greggory A. Parker', city: 'Katy, TX', lat: 29.739488, lng: -95.802931},
{pin: '&#934;&#934; 18', name: 'Carleton E. Britt', city: 'Austin, TX', lat: 30.215370, lng: -97.856124},
{pin: '&#934;&#934; 19', name: 'Mahmoud Foroughi', city: 'Barrie, ON, Canada', lat: 44.226700, lng: -79.415480},
{pin: '&#934;&#934; 20', name: 'Steven Schnurer', city: 'New Berlin, WI', lat: 42.979472, lng: -88.095070},
{pin: '&#934;&#934; 21', name: 'Christopher Heyl', city: 'El Paso, TX', lat: 31.763721, lng: -106.296334},
{pin: '&#934;&#934; 22', name: 'Carl Sattelberg', city: 'Fort Gratiot, MI', lat: 43.072209, lng: -82.490525},
{pin: '&#934;&#934; 23', name: 'Jeffrey S. Nelson', city: 'Midlothian, VA', lat: 37.529341, lng: -77.648258},
{pin: '&#934;&#934; 25', name: 'Alan Esche', city: 'Crystal Lake, IL', lat: 42.269568, lng: -88.312501},
{pin: '&#934;&#934; 26', name: 'Martin Shonts', city: 'Burton, MI', lat: 42.972542, lng: -83.669775},
{pin: '&#934;&#934; 27', name: 'Paul Habermas', city: 'Pearland, TX', lat: 29.561632, lng: -95.276242},
{pin: '&#934;&#934; 28', name: 'Thomas G. Troher', city: 'Plymouth, MI', lat: 42.380450, lng: -83.496700},
{pin: '&#934;&#934; 29', name: 'Kevin L. Sherman', city: 'Essex Junction, VT', lat: 44.499829, lng: -73.093378},
{pin: '&#934;&#934; 30', name: 'James Proctor', city: 'Allen, TX', lat: 33.107958, lng: -96.694298},
{pin: '&#934;&#934; 31', name: 'Carroll Hooks', city: 'Altadena, CA', lat: 34.190882, lng: -118.139281},
{pin: '&#934;&#934; 32', name: 'Thomas E. Young', city: 'Fort Wayne, IN', lat: 41.196278, lng: -85.115064},
{pin: '&#934;&#934; 34', name: 'Mitchell L. Brown', city: 'Berkley, MI', lat: 42.497384, lng: -83.184683},
{pin: '&#934;&#934; 35', name: 'Mark J. Carter', city: 'Midland, MI', lat: 43.621475, lng: -84.268518},
{pin: '&#934;&#934; 36', name: 'Joseph S. Heinemann', city: 'Lakeville, MN', lat: 44.669588, lng: -93.269086},
{pin: '&#934;&#934; 37', name: 'John R. Jackson', city: 'Fenton, MI', lat: 42.786689, lng: -83.728563},
{pin: '&#934;&#934; 38', name: 'Dale B. Sundstrom', city: 'Rockford, IL', lat: 42.326000, lng: -89.022356},
{pin: '&#934;&#934; 39', name: 'John D. Vala', city: 'Plymouth, MI', lat: 42.370355, lng: -83.486670},
{pin: '&#934;&#934; 40', name: 'Brian L. Warner', city: 'McBain, MI', lat: 44.221719, lng: -85.208367},
{pin: '&#934;&#934; 41', name: 'Kenneth L. Thorp', city: 'Vassar, MI', lat: 43.367749, lng: -83.575932},
{pin: '&#934;&#934; 42', name: 'Steven T. Porritt', city: 'Ann Arbor, MI', lat: 42.304093, lng: -83.709538},
{pin: '&#934;&#934; 43', name: 'Scott P. Luce', city: 'Grand Rapids, MI', lat: 42.943222, lng: -85.618940},
{pin: '&#934;&#934; 44', name: 'Richard A. Rakoczy', city: 'Decatur, GA', lat: 33.773551, lng: -84.293078},
{pin: '&#934;&#934; 45', name: 'Kevin J. Merlo', city: 'Rochester Hills, MI', lat: 42.661769, lng: -83.127305},
{pin: '&#934;&#934; 46', name: 'Todd A. Tageson', city: 'Batavia, IL', lat: 41.846961, lng: -88.312627},
{pin: '&#934;&#934; 47', name: 'Thomas J. Kispert', city: 'Appleton, WI', lat: 44.246130, lng: -88.377164},
{pin: '&#934;&#934; 48', name: 'James M. Niemczyk', city: 'Suwanee, GA', lat: 34.059639, lng: -84.087678},
{pin: '&#934;&#934; 49', name: 'David S. Kaufman', city: 'Oak Park, IL', lat: 41.871650, lng: -87.788284},
{pin: '&#934;&#934; 50', name: 'Kevin M. Philbin', city: 'Ypsilanti, MI', lat: 42.227719, lng: -83.633543},
{pin: '&#934;&#934; 51', name: 'Timothy P. Elwart', city: 'Ortonville, MI', lat: 42.837020, lng: -83.431134},
{pin: '&#934;&#934; 52', name: 'Mark D. Arnold', city: 'Canton, MI', lat: 42.291068, lng: -83.478729},
{pin: '&#934;&#934; 53', name: 'Gregory A. Wejrowski', city: 'Unionville, IN', lat: 39.263854, lng: -86.397153},
{pin: '&#934;&#934; 54', name: 'Randall G. Cerne', city: 'Milford, MI', lat: 42.567779, lng: -83.591991},
{pin: '&#934;&#934; 55', name: 'William E. Corbin', city: 'Newburgh, NY', lat: 41.522437, lng: -74.036735},
{pin: '&#934;&#934; 56', name: 'Michael C. De Lano', city: 'Harrison Twp., MI', lat: 42.582373, lng: -82.835724},
{pin: '&#934;&#934; 57', name: 'Jeffrey W. Goodwin', city: 'Westminster, MD', lat: 39.557058, lng: -76.986079},
{pin: '&#934;&#934; 58', name: 'James L. Williams', city: 'Lawrenceville, GA', lat: 33.998914, lng: -84.014051},
{pin: '&#934;&#934; 59', name: 'Daniel A. Newton', city: 'Laguna Hills, CA', lat: 33.600293, lng: -117.705200},
{pin: '&#934;&#934; 60', name: 'Anthony L. Malburg', city: 'Farmington, MN', lat: 44.657724, lng: -93.159147},
{pin: '&#934;&#934; 61', name: 'Kevin G. Ackerman', city: 'Muskegon, MI', lat: 43.233938, lng: -86.184060},
{pin: '&#934;&#934; 62', name: 'Carl L. Stone', city: 'Arlington, VA', lat: 38.842320, lng: -77.088978},
{pin: '&#934;&#934; 63', name: 'Edmund M. Balcer', city: 'De Pere, WI', lat: 44.427704, lng: -88.085200},
{pin: '&#934;&#934; 64', name: 'Timothy J. Wise', city: 'Elk Grove, IL', lat: 42.007905, lng: -87.993691},
{pin: '&#934;&#934; 65', name: 'Thomas O. Michals', city: 'Howell, MI', lat: 42.593600, lng: -83.911803},
{pin: '&#934;&#934; 66', name: 'David C. Williams', city: 'Gladstone, MI', lat: 45.854958, lng: -87.039460},
{pin: '&#934;&#934; 67', name: 'Eric M. Olson', city: 'Holland, MI', lat: 42.772744, lng: -86.107353},
{pin: '&#934;&#934; 68', name: 'Raymond P. Giroux', city: 'San Francisco, CA', lat: 37.771011, lng: -122.442654},
{pin: '&#934;&#934; 69', name: 'William L. Cooke', city: 'Canal Fulton, OH', lat: 40.889169, lng: -81.578860},
{pin: '&#934;&#934; 70', name: 'William D. Bingham', city: 'Clarkston, MI', lat: 42.721045, lng: -83.406224},
{pin: '&#934;&#934; 71', name: 'Richard Sutter', city: 'Grand Blanc, MI', lat: 42.924490, lng: -83.635754},
{pin: '&#934;&#934; 72', name: 'John K. Mangum', city: 'Royal Oak, MI', lat: 42.519386, lng: -83.165247},
{pin: '&#934;&#934; 73', name: 'Donald J. Kolehmainen', city: 'Laguna Niguel, CA', lat: 33.532722, lng: -117.701022},
{pin: '&#934;&#934; 74', name: 'Dennis G. Hjelmquist', city: 'Kendallville, IN', lat: 41.445417, lng: -85.263208},
{pin: '&#934;&#934; 76', name: 'Wayne A. Bradeen', city: 'Hersey, MI', lat: 43.836537, lng: -85.410957},
{pin: '&#934;&#934; 77', name: 'James G. Seaser', city: 'Dwayonno, MN', lat: 44.080136, lng: -93.226073},
{pin: '&#934;&#934; 78', name: 'David L. Dewolf', city: 'Brighton, MI', lat: 42.525473, lng: -83.795897},
{pin: '&#934;&#934; 79', name: 'Michael A. Gorski', city: 'Portland, OR', lat: 45.529359, lng: -122.643261},
{pin: '&#934;&#934; 80', name: 'Steven E. Williams', city: 'Howell, MI ', lat: 42.607000, lng: -83.925803},
{pin: '&#934;&#934; 81', name: 'Stanley J. Brownell', city: 'Oldwick, NJ', lat: 40.672077, lng: -74.749375},
{pin: '&#934;&#934; 82', name: 'Timothy W. Zeigler', city: 'Maple Plain, MN', lat: 45.008180, lng: -93.686252},
{pin: '&#934;&#934; 83', name: 'James L. Wise', city: 'Sykesville, MD', lat: 39.399297, lng: -76.964686},
{pin: '&#934;&#934; 84', name: 'Joseph J. Allen', city: 'Benton Harbor, MI', lat: 42.108045, lng: -86.425415},
{pin: '&#934;&#934; 85', name: 'Robert M. Marzonie', city: 'Novi, MI', lat: 42.469762, lng: -83.518247},
{pin: '&#934;&#934; 86', name: 'Timothy E. Peters', city: 'Seattle, WA', lat: 47.648729, lng: -122.395701},
{pin: '&#934;&#934; 87', name: 'Douglas C. Holmberg', city: 'Wausau, WI', lat: 44.953166, lng: -89.667720},
{pin: '&#934;&#934; 88', name: 'Rick W. Schultz', city: 'Floyds Knobs, IN', lat: 38.348378, lng: -85.888907},
{pin: '&#934;&#934; 89', name: 'Scott J. Priest', city: 'Royal Oak, MI', lat: 42.529386, lng: -83.175247},
{pin: '&#934;&#934; 90', name: 'Dana McGrew', city: 'New Era, MI', lat: 43.551351, lng: -86.381762},
{pin: '&#934;&#934; 91', name: 'Stephen R. Damschroder', city: 'Ft. Wayne, IN', lat: 41.216269, lng: -85.125049},
{pin: '&#934;&#934; 92', name: 'Scott Goheen', city: 'Ozark, MO', lat: 37.015922, lng: -93.209733},
{pin: '&#934;&#934; 93', name: 'Steven P. Rooke', city: 'Fishers, IN', lat: 39.966356, lng: -86.013233},
{pin: '&#934;&#934; 94', name: 'Steven G. Carter', city: 'Carrollton, TX', lat: 33.004524, lng: -96.895989},
{pin: '&#934;&#934; 95', name: 'Edward J. Corpe', city: 'Atlanta, GA', lat: 33.6403, lng: -84.3952},
{pin: '&#934;&#934; 96', name: 'Ronald W. Bonatz', city: 'Northville, MI', lat: 42.4346, lng: -83.4993},
{pin: '&#934;&#934; 98', name: 'Thomas G. Livernois', city: 'Plymouth, MI', lat: 42.3863, lng: -83.5125},
{pin: '&#934;&#934; 99', name: 'Daniel J. Czarnecki', city: 'Comstock Park, MI', lat: 43.0682, lng: -85.6853},
{pin: '&#934;&#934; 100', name: 'Robert F. Cassidy', city: 'West Bloomfield, MI', lat: 42.4723, lng: -83.2940}];

/**
 * The map object, null until script loads in.
 * @type {GMap2}
 */
var map = null;  

/**
 * The bounds of the markers once loaded in.
 * @type {GLatLngBounds}
 */
var bounds = null;

/**
 * The marker with currently opened info window.
 * @type {GMarker}
 */
var currentMarker = null;

/**
 * The dom element that the map is loaded into
 * @type {Element}
 */
var mapDiv = null;

/**
 * The dom element that everything is a child of.
 * @type {Element}
 */
var containerDiv = null;

/**
 * Position of mouse click (clientX) on map div when in static mode.
 * @type {Number}
 */
var clickedX = 0;

/**
 * Position of mouse click (clientY) on map div when in static mode.
 * @type {Number}
 */
var clickedY = 0;

/**
 * Indicates whether we've created a script tag with Maps API yet
 * @type {Boolean}
 */
var isLoaded = false;


/**
 * Called after script is asynchronously loaded in.
 * Creates the GMap2, GMarker objects and performs actions according to 
 * what the user did to trigger the map load (search, zoom, click etc).
 */
function loadMap() {
  if (GBrowserIsCompatible()) {
    mapDiv.style.background = '#fff';
    mapDiv.style.cursor = '';
    map = new GMap2(mapDiv, {logoPassive: true});
    map.addControl(new GLargeMapControl3D());
    map.setCenter(new GLatLng(40, -98), 4);
    bounds = new GLatLngBounds();
    for (var i = 0; i < businesses.length; i++) {
      bounds.extend(new GLatLng(businesses[i].lat, businesses[i].lng));
    }
    var latSpan = bounds.toSpan().lat();
    
    // The static map server gives markers more space when calculating
    // bounds and zoom level, so sometimes the API will give a higher
    // zoom level than was used by the static map server.
    // The .98 value is just a guess right now, may need tweaking.
    var newBounds = map.getBounds();
    var newLatSpan = newBounds.toSpan().lat();
    if (latSpan/newLatSpan > .9) { map.zoomOut(); }

    for (var i = 0; i < businesses.length; i++) {
      var marker = createMarker(i);
      var latlng = marker.getLatLng();
      var pixel = map.fromLatLngToDivPixel(latlng);
      if (Math.abs(pixel.x - clickedX) < 12 && Math.abs(pixel.y - clickedY) < 20) {
        //GEvent.trigger(marker, 'click');
      }
      map.addOverlay(marker);
    }
  }
}

/**
 * Zooms to the viewport that fits all the markers.
 */
function zoomToAll() {
  map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
}

/**
 * Creates a marker for the given business.
 * @param {Number} ind
 * @return {GMarker}
 */
function createMarker(ind) {
  var business = businesses[ind];
  var marker = new GMarker(new GLatLng(business.lat, business.lng));
  GEvent.addListener(marker, 'click', function() {
    marker.html = ['<b>', business.name, '</b><br>', business.pin + '<br/>', business.city + '<br/>', '<a href="javascript:zoomToAll()">View all members</a>'].join('');
    currentMarker = marker;
    marker.openInfoWindowHtml(marker.html);
  });
  return marker;
}

/**
 * Convenience function for creating an element and assigning an id to it.
 * @param {String} elementType
 * @param {String} id
 * @return {Element} 
 */
function _cel(elementType, id) {
  var element = document.createElement(elementType);
  element.id = id;
  return element;
}

/**
 * Loads in the Maps API script. This is called after some sort of user interaction.
 * The script loads asynchronously and calls loadMap once it's in.
 */
function loadScript() {
  if (!isLoaded) {
    isLoaded = true;
    var div = document.createElement('div');
    div.className = 'message';
    div.innerHTML = 'Loading...';
    div.style.left = (500/2 - 53) + 'px';
    div.style.top = 500/2 + 'px'; 
    mapDiv.appendChild(div);
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = 'http://maps.google.com/maps?file=api&amp;v=2' + '&async=2&callback=loadMap&key=ABQIAAAAwL9G6gVVS0Zwg9RpjQDf2BQZWl73sG7SXFdj5Ahuma2kMmGuaBQz7vLjA67TEoYO6_TdVTK3Eih5nQ';
    document.body.appendChild(script);
  }
}

/**
 * Sets up the gadget by setting CSS and click events.
 */
function loadMapGadget() {
  containerDiv = document.getElementById('container');
  mapDiv = document.getElementById('map');

  mapDiv.onclick = function (e) {
    clickedX = (window.event && window.event.offsetX) || e.clientX;
    clickedY = (window.event && window.event.offsetY) || e.clientY;
    loadScript(); 
  };

  mapDiv.style.cursor = 'pointer';

  /**var urlString = ['http://maps.google.com/staticmap?markers='];*/
  var urlString = ['http://maps.google.com/maps/api/staticmap?center=40,-98&zoom=4&format=jpg&size=595x400&maptype=roadmap'];
  var markerString = [];  
  for (var i = 0; i < static_businesses.length; i++) {
       markerString.push('&markers=color:purple|size:mid'+ '|' + static_businesses[i].city);
  }
  
  urlString.push(markerString.join('|'));
  urlString.push('&sensor=false&key=ABQIAAAAjU0EJWnWPMv7oQ-jjS7dYxSPW5CJgpdgO_s4yyMovOaVh_KvvhSfpvagV18eOyDWu7VytS6Bi1CWxw');
  mapDiv.style.background = 'url(\'' + urlString.join('') + '\')';

}

