       
   var map = null;
   var geocoder = null;
   var mgr;
   var G_markers_info = [];
   var G_blue_markers_info = [];
   var G_makers_currentRed_hidden = -1;  // set to hidden red object in prev_G_marker() and next_G_marker()
   var GMap_zoomed = false;    
   var GMap_CurrentZoomLevel = 14;    
   var GDrag_offset_x = 0;   // used in showMarkerTitle to calculate new title position
   var GDrag_offset_y = 0;

   /**
    *  this object is  used in the onsumbit handler, addpageSubmitHandler(), to
    *  construct the wiki page name.  Currently the region member is ignored.
    *  It is reset each time a new location is selected
    *  See makeG_MapAddressName(), geoidOptsOnChange(),setGMapGoBox 
    *  The set function is set_pageLocationSpecs()
   */
   var pageLocationSpecs = { country:"Canada", city:"Winnipeg", region:"Manitoba",
                                     lat:49.89942, lng:97.14074 };

   /** saves data for pageLocationSpecs for use with Options array
    * recreated in setGMapGoBox() after each ajax call and accessed in
    * geoidOptsOnChange(), the Options onChange handler
   */
   var optionsPageLocations = new Array();  


   function load() {

       var Gdrag_start_center;
       var Gdrag_start_bounds;
       var Gdrag_end_center;
       var Gdrag_end_bounds;
       var start_center =0;
       var end_center =0;
       if (GBrowserIsCompatible()) {    
          map = new GMap2(document.getElementById("map"));
          showPoint(new GLatLng(G_CountryLatLngIni.lat, G_CountryLatLngIni.lng), 14);
          map.clearOverlays();      
          map.addControl(new GSmallMapControl());
          geocoder = new GClientGeocoder();
          mgr = new MarkerManager(map, {trackMarkers:true});

       // This listener is set on the map
       // the ones set for marker manager are set on individual markers
          GEvent.addListener(map, "zoomend", function(oldLevel, newLevel) {            
                   setGMap_zoomed(true);
                   GMap_CurrentZoomLevel = newLevel;
          });

          GEvent.addListener(map, "movestart", function() {            
                  hideMarkerTitle();
          });


          GEvent.addListener(map, "moveend", function() {            

                 Gdrag_end_center =  map.getCenter();
                 end_center = map.fromLatLngToDivPixel(Gdrag_end_center);

                 GDrag_offset_x = start_center.x - end_center.x;
                 GDrag_offset_y = start_center.y - end_center.y;
          });

         
    	 	window.setTimeout(setupCityScapeMarkers, 0);
         }

            //reset the Addpage onclick handler to ours
         var inputs = document.getElementsByTagName('input');             
         for(var i=0; i< inputs.length; i++) {                  
             if(inputs[i].type=='submit') {
                  if(inputs[i].value.match(/Add\s+page/i)) {  
                      inputs[i].onclick = set_Name;
                   }
             }
         }
         if(document.getElementById('hidden_map')) {
                document.getElementById('hidden_map').style.display = 'none';
         }

         Gdrag_start_center =  map.getCenter();
         Gdrag_end_center =  map.getCenter();
         start_center = map.fromLatLngToDivPixel(Gdrag_start_center);                  
    }


    function setGMap_zoomed(bool) {
       GMap_zoomed = bool;    
    }


     // truncates decimal portion of latitude and longitudes for display under Go box
    function truncateNumber(num,len) {
         var Nstr = num.toString();  
         var elems = Nstr.split('.');
         if(!elems[1]) return num;
         if(elems[1].length > len) {
           num = num.toFixed(len);    
         }
         return num;
    }


    function toggleGMapInstructions(addsite_display, msg_display) {
        return;
        document.getElementById("addsite").style.display=addsite_display;
        document.getElementById("G_instructmsg").style.display=msg_display;
    }

    function displayLatLng(point) {
         var lat = truncateNumber(point.y,9);
         var lng = truncateNumber(point.x,9);           
         document.getElementById("result").innerHTML =  "Latitude: " + lat + ", Longitude: " + lng ;
    }


    function showPoint(point, z) {
         if(!point.x || ! point.y) return; 
         var zoom = z ? z : map.getZoom();
         if(isNaN(zoom) || !zoom ) zoom = 16;  
         displayLatLng(point);     
         map.setCenter(point,zoom );
         displayLatLng(point);
    }
    

    /* Go Input box submit handler */
    function showAddress(address) {  
     if (geocoder) {
        geocoder.getLatLng(
          address,
          function(point) {
              if (!point) {
                      var elems = address.split(/,/);
                      var possible = "";
                      var msg = address + ":  not found.\n"
                      if(elems.length > 2) {
                         possible = elems[0] + "," + elems[elems.length -1];
                         if(confirm(msg + "\nTry \"" + possible + '"?')) {
                              document.getElementById("GMap_address").value = possible
                         }
                         return;
                      }   
                      alert(msg);
              } else {
               showPoint(point);
               geocode_getCity(point.y,point.x, address);
               toggleGMapInstructions("block","none");
              }
          }
       );
     }

   }


   function G_media(url) {
        alert(url);
   }

    function goBoxOnChange(el) {
          
    }

    function set_pageLocationSpecs(country, city, region, lat, lng) {
        pageLocationSpecs.country = country;
        pageLocationSpecs.city = city;
        pageLocationSpecs.region = region;
        pageLocationSpecs.lat = lat;
        pageLocationSpecs.lng = lng;
    }


     // makes initial location name from Maxmind's geoip.js
    function makeG_MapAddressName() {

         var address = "";
         if(window.geoip_city)
             address += geoip_city() +  ' ';
     
   
         if(window.geoip_region) 
             address += geoip_region() + ' ';

  
         if(window.geoip_country_name)
             address += geoip_country_name();
     
         set_pageLocationSpecs(geoip_country_name(),geoip_city(),geoip_region(),geoip_latitude(), geoip_longitude());
         displayLatLng(new GLatLng(geoip_latitude(),geoip_longitude()));
         return address;
    }


      // get initial google GLatLng point from Maxmind's geoip.js coordinates
    function geoipToPoint() {
      var lat = "";
      var lng = "";
        if(window.geoip_latitude && window.geoip_longitude) {
          var lat = geoip_latitude();
          var lng = geoip_longitude();
        }

        if(!lat || !lng) {
               lat = '49.89942';
               lng = '-97.14074';
               document.getElementById("GMap_address").value = 'Winnipeg MB Canada';
        }
        lng = Number(lng);
        lat = Number(lat);
        return new GLatLng(lat,lng);
    }


    function geocode_getCity(lat,lng, address) {

      var url = "getCitySQLJ.php?";
      var qstr = "lat=" + lat + "&lng=" + lng;
      if(address) {
          qstr = qstr + "&address=" + address;
      }
      qstr = qstr.replace(/\&amp;/g,"&");
      var httpXMLobj = getHTTPObject();
      if (httpXMLobj) {      
        httpXMLobj.open("GET", url + qstr, true);   
        httpXMLobj.onreadystatechange = function() {

            if (httpXMLobj.readyState == 4) {
                if (httpXMLobj.responseText.indexOf('invalid') == -1) {
                   var myObject = eval('(' + httpXMLobj.responseText + ')');                  
                   setGMapGoBox(myObject);
               }
            }
        };
        httpXMLobj.send(null);
      }
    }


    function parseOjbect(myObject) {
         var str = "";
         for(var obj in  myObject) {
               str += obj + "=" + myObject[obj] + "\n";
         }
         return str;
    }


    function makeLocationString(location_name) {
              var elems = location_name.split(',');
              var location_str = elems[0] + ',' + elems[1];
              if(location_str.length > 30) {
                   location_str =  location_str.substring(0,27) + '...';
              }
              return location_str;
    }


    function geoidOptsOnChange(sel) {
        for(var i = 0; i < sel.options.length; i++) {
            if(sel.options[i].selected) {
                  document.getElementById("GMap_address").value = sel.options[i].value;
                  var geoidRow = optionsPageLocations[i];
                  showPoint(new GLatLng(geoidRow['latitude'],geoidRow['longitude']));
                  set_pageLocationSpecs(geoidRow['country'],geoidRow['asciiname'],
                             geoidRow['admin1_place'], geoidRow['latitude'],geoidRow['longitude']);
                  displayLatLng(new GLatLng(geoidRow['latitude'],geoidRow['longitude']));
                  break; 
            }
        }
    }

    function setGMapGoBox(geoidObj) {
        var address = ""; 
        var geonameid = 0;
        var geoidRow;
        optionsPageLocations = new Array();

        if(geoidObj['diff'] > .075) {
           if(geoidObj['f_diff'] < geoidObj['c_diff']) {
              geoidRow = geoidObj['f_hits']['best'];
           }
           else {
                geoidRow = geoidObj['c_hits']['best'];
           }
        }
        else {
              if(geoidObj['c_hits']['best']) {
                   geoidRow = geoidObj['c_hits']['best'];
              }
              else
              if(geoidObj['f_hits']['best']) {
                  geoidRow = geoidObj['f_hits']['best'];
              }
        }

      address = truncate_Location(geoidRow['location_name']);
      geonameid = geoidRow['geonameid'];
      document.getElementById("GMap_address").value = address;

      set_pageLocationSpecs(geoidRow['country'],geoidRow['asciiname'],geoidRow['admin1_place'],
                             geoidRow['latitude'],geoidRow['longitude']);


      var SelectOpts = document.getElementById('geoidOpts');

      SelectOpts.options.length = 0;
  
      SelectOpts.options[0] = new Option(makeLocationString(address),address,true,true);
      optionsPageLocations[0]=geoidRow;

      var opt_index = 1;

      var f_hits =  geoidObj['f_hits']['saves'];
       for(var i=0;i<f_hits.length; i++) {          
              if(f_hits[i]['geonameid'] == geonameid) continue;
              var location_str = makeLocationString(f_hits[i]['location_name']);
              SelectOpts.options[opt_index] = new Option(location_str,
                                           truncate_Location(f_hits[i]['location_name']));
              //SelectOpts.options[opt_index].setAttribute('style', 'color:red');
              optionsPageLocations[opt_index]=f_hits[i];
           
              opt_index++;
       }

       var c_hits =  geoidObj['c_hits']['saves'];
       for(var i=0;i<c_hits.length; i++) {
              if(c_hits[i]['geonameid'] == geonameid) continue;
              var location_str = makeLocationString(c_hits[i]['location_name']);
              SelectOpts.options[opt_index] = new Option(location_str,
                                             truncate_Location(c_hits[i]['location_name']));
              //SelectOpts.options[opt_index].setAttribute('style', 'color:red');
              optionsPageLocations[opt_index]=c_hits[i];
              opt_index++;
       }

     document.getElementById('geodid_selections').style.display = 'block';    

     if(SelectOpts.options.length < 2 ) {
        SelectOpts.options.length = 0;
        document.getElementById('geodid_selections').style.display = 'none';    
     }
     else {
        document.getElementById('geodid_selections').style.display = 'block';    
     }

    }

   function truncate_Location(address) {
      return address; 
      var elems = address.split(/,/);
      if(elems) {
          if(elems.length == 3) {
                address = elems[0] + ',' + elems[2];
          }
      }
     return address;
   }

    if(!window.geoip_city && !window.geoip_country_code) {
        function geoip_country_code() { return 'CA'; }
        function geoip_country_name() { return 'Canada'; }
        function geoip_city()         { return 'Winnipeg'; }
        function geoip_region()       { return 'MB'; }
    }
    if(!window.geoip_latitude) {
        function geoip_latitude()     { return '49.8833'; }
        function geoip_longitude()    { return '-97.1668'; }
    }

                



    /* 
     *   markers are loaded in main.php with a require:
     *       require_once DOKU_INC .  "lib/tpl/default/jjson_markers.php"; 
    */
    function setupCityScapeMarkers() {
     if(!window.countryGMarkers) return;

      for (var i in countryGMarkers) {
        var layer = countryGMarkers[i];

        var markers = [];
        for (var j in layer["places"]) {
          var place = layer["places"][j];
          var title = place["name"];
          var posn = new GLatLng(place["posn"][0], place["posn"][1]);
          var namespace = place["ns"];   

         /* 
          *  by pushing blue before red, the red markers appear on top of the blue 
          *  so hiding the red, reveals the blue and vice versa   
          *  See next_G_marker() and G_hide_marker() et. al. in main.php
          */
          var marker = createMarker(posn,title,G_blueIcon, namespace); 
          markers.push(marker);
                       // global, holds blue marker info
          G_blue_markers_info.push({ ns:namespace, point: posn, title:title, marker: marker } ); 
           //     G_markers_info[G_makers_currentRed_hidden]['marker'].hide();   
          var marker = createMarker(posn,title,G_DEFAULT_ICON, namespace); 
          markers.push(marker);
                       // global, holds red marker info
          G_markers_info.push({ ns:namespace, point: posn, title:title, marker: marker } );  


        }
        mgr.addMarkers(markers, layer["zoom"][0], layer["zoom"][1]);
      }
        GEvent.addListener(mgr, "changed", function(bound, num) {   // hide titles when map moves
            if(GMap_zoomed && G_makers_currentRed_hidden >= 0 ) {   // marker out of map window
               G_markers_info[G_makers_currentRed_hidden]['marker'].hide(); 
               showMarkerTitle(G_makers_currentRed_hidden);
            }
               setGMap_zoomed(false);
               if(GMap_CurrentZoomLevel < 12) {
                  hideMarkerTitle();
               }
        });

       mgr.refresh();

    }


    function createMarker(posn, title, icon, namespace) {
      var marker = new GMarker(posn, {title: title, icon: icon });

      GEvent.addListener(marker, 'click', function() {
                displayLatLng(posn);
                if(namespace) {
                     elems = namespace.split(':');
                     elems.shift();
                     namespace = elems.join(':');  
                     window.location="doku.php?id=" + namespace;
                }
           } 
      ); 
      return marker;
    }




