Skip to content
Snippets Groups Projects
gmap.module 51.6 KiB
Newer Older
webgeer's avatar
webgeer committed
<?php
/* $Id$ */

/**
 * @file
 * GMap Filters is a module to include Google Map in a module
 *
 * GMap filter allows the insertion of a googlemap in a module.  It has
 * a page to creat a macro and then a filter to convet the macro into the
 * html and javascript code required to insert a google map.
 */

webgeer's avatar
webgeer committed

function gmap_help($section) {
  switch ($section) {
    case 'admin/modules#description':
      return t('Filter to allow insertion of a google map into a node');
      break;
  }
}

function gmap_perm() {
  return array('create macro', 'override defaults', 'show user map', 'user locations');
webgeer's avatar
webgeer committed
}

/**
 *
 * Returns the html required to insert a map from a gmap associative array.
 *
 * @param $gmap
 * An associative array with the following variables set:
 *
 *  id - the id of the map every map on a page must have a unique id
 *  width - width of the map
 *  height - height of the map
webgeer's avatar
webgeer committed
 *  center - a string of the longitude and latitude of the centre of the map
webgeer's avatar
webgeer committed
 *  zoom - the zoom factor of the google map
 *  align - the alignment of the map 'right', 'left' or 'center'
 *  control - the control shown on the map 'Large', 'Small', or 'None'
 *  tcontrol - whether the type control is on the map or not: 'off' or 'on'
webgeer's avatar
webgeer committed
 *  type - 'Map', 'Hybrid' or 'Satellite'
 *  drag - 'yes' or 'no' map is draggable.  Default is 'yes'
 *  points - an array of associative arrays for the points.
 *  shapes - an array of associative arrays for the overlays.
 *  track - a file containing a series of points in .plt format to be
 *  inserted into the node.
 *
 *  Xmaps must be enabled for circle and polygon to work.
webgeer's avatar
webgeer committed
 *
 * @param $javascript
 * Some javascript to insert into function after drawing the map.
 * note that '{id}' will be replaced with the map id.
webgeer's avatar
webgeer committed
 *
 * @return
 * A string with the google map ready to be inserted into a node.
 *
 */


function gmap_from_var ($gmap,$javascript='') {
  global $base_url;
    _gmap_doheader();
webgeer's avatar
webgeer committed
    (!isset($gmap['width'])) ? $gmap['width']=variable_get('gmap_default_width', 300): NULL;
    (!isset($gmap['height'])) ? $gmap['height']=variable_get('gmap_default_height', 200):NULL;
    (!isset($gmap['zoom'])) ? $gmap['zoom']=variable_get('gmap_default_zoom', 7):NULL;
    (!isset($gmap['align'])) ? $gmap['align']='':NULL;
    (!isset($gmap['id'])) ? $gmap['id']='map':NULL;
    (!isset($gmap['control'])) ? $gmap['control']='Small':NULL;
    (!isset($gmap['type'])) ? $gmap['type']='Map':NULL;
    (!isset($gmap['tcontrol'])) ? $gmap['tcontrol']='off':NULL;
    (!isset($gmap['drag'])) ? $gmap['drag']='yes':NULL;
webgeer's avatar
webgeer committed

webgeer's avatar
webgeer committed
    if (!isset($gmap['center'])&& isset($gmap['latlong'])){
      //backwards compatible with macros created by previous version of this program
      $gmap['center']=$gmap['latlong'];
    }
    elseif (!isset($gmap['center'])){
      $gmap['center']=variable_get('gmap_default_latlong', '-123.1, 49.2');
    }

    $style='width: '.gmap_todim($gmap['width']).'; height: '.gmap_todim($gmap['height']).';';
webgeer's avatar
webgeer committed

    switch (strtolower($gmap['align'])) {
      case 'left':
        $style .= ' float: left;';
        break;
      case 'right':
        $style .= ' float: right;';
        break;
      case 'center':
      case 'centre':
        $style .= ' margin-left: auto; margin-right: auto;';
    $outtext.='<div id="'.$gmap['id'].'" style="'.$style.'"></div>
              <script type="text/javascript" type="text/javascript">
webgeer's avatar
webgeer committed
              //<![CDATA[
              //initialize gmap variables
              var mycontrol=null;
              var mytypecontrol=null;
              var '.$gmap['id'].'=null;
webgeer's avatar
webgeer committed
              gmap_torun.push(\'gmap_load_'.$gmap['id'].'();\');
              function gmap_load_'.$gmap['id'].'() {
                 '.$gmap['id'].' = new GMap(document.getElementById("'.$gmap['id'].'"));
webgeer's avatar
webgeer committed
                 '.$gmap['id'].'.centerAndZoom(new GPoint('.$gmap['center'].'), '.$gmap['zoom'].');
webgeer's avatar
webgeer committed
                 ';
    switch (strtolower($gmap['control'])) {
      case 'small':
        $outtext .='mycontrol=new GSmallMapControl();
webgeer's avatar
webgeer committed
                '.$gmap['id'].'.addControl(mycontrol);
                 ';
        break;
      case 'large':
      $outtext .='mycontrol=new GLargeMapControl();
webgeer's avatar
webgeer committed
              '.$gmap['id'].'.addControl(mycontrol);
              ';
    }
webgeer's avatar
webgeer committed

    if (strtolower($gmap['tcontrol'])=='on' || strtolower($gmap['tcontrol'])=='yes') {
      $outtext .= $gmap['id'].'.addControl(mytypecontrol=new GMapTypeControl());
                ';
    }

webgeer's avatar
webgeer committed
    switch (strtolower($gmap['type'])) {
      case 'hybrid':
        $outtext .= $gmap['id'].".setMapType(G_HYBRID_TYPE); \n";
        break;
webgeer's avatar
webgeer committed
        $outtext .= $gmap['id'].".setMapType(G_SATELLITE_TYPE); \n";
    }
    if (isset($gmap['drag']) && strtolower($gmap['drag'])=='no') {
      $outtext .= $gmap['id'].".disabledragging(); \n";
    }
    $outext .= $gmap['id'].'.centerAndZoom(new GPoint('.$gmap['center'].'), '.$gmap['zoom'].");\n";
webgeer's avatar
webgeer committed

    if (isset($gmap['track'])) {
      foreach ($gmap['track'] as $value) {
        $tt=$value;
        $tt['type']='line';
        //open file parse into points
        $tt['points']=array();
        if($trackFH = fopen($tt['filename'], "r")) {
          while(!feof($trackFH)) {
            $line = fgets($trackFH, 4096);
            $line_exploded = explode(",", $line);
            if(count($line_exploded) == 7) {
              $tt['points'][]= trim($line_exploded[0]).', '.trim($line_exploded[1]);
            }
          }
          fclose($trackFH);
        }
webgeer's avatar
webgeer committed
      }
    }

    if (isset($gmap['markers'])) {
      $lastmarker='';
      foreach ($gmap['markers'] as $item) {
        $mymarker='';
        $mytext='';
        if (isset($item['markername'])){
          if ($item['markername']==$lastmarker) {
            $i++;
          }
          else {
            $lastmarker=$item['markername'];
            $i=1;
          }
          if (file_exists(variable_get('gmap_markerfiles','modules/gmap/markers').'/'.$item['markername'].$i.'.png')) {
            $mymarker=$base_url.'/'.variable_get('gmap_markerfiles','modules/gmap/markers').'/'.$item['markername'].$i.'.png';
          }
          elseif (file_exists(variable_get('gmap_markerfiles','modules/gmap/markers').'/'.$item['markername'].'.png')) {
            $mymarker=$base_url.'/'.variable_get('gmap_markerfiles','modules/gmap/markers').'/'.$item['markername'].'.png';
          }
        }
        if (isset($item['label']) && strlen($item['label'])>0) {
          $mytext=$item['label'];
webgeer's avatar
webgeer committed
        }
        $outtext .=$gmap['id'].'.addOverlay(createGMarker(new GPoint('.$item['point'].'),\''.$mytext.'\',\''.$mymarker."'));\n";
webgeer's avatar
webgeer committed
      }
    }
    if (isset($gmap['shape']) && !variable_get('gmap_xmaps',0)) {
      //if xmaps is not enabled then just show the lines using gma;
      foreach ($gmap['shape'] as $value) {
        $style ='';
        if (trim($value['type'])=='line') {
          if (isset($value['color'])) {
            $style .=",'".$value['color']."'";
            if (isset($value['width'])) {
              $style .=','.$value['width'];
              if (isset($value['opacity'])) {
                $style .=','.$value['opacity'];
              }
            }
          }
          foreach ($value['points'] as $lvalue) {
            if (strlen($linetxt)>0) {
              $linetxt .= ', ';
            }
            $linetxt .="new GPoint(".$lvalue.")";
          }
          $outtext .="\n".$gmap['id'].".addOverlay(new GPolyline([$linetxt] $style));";
    elseif (isset($gmap['shape'])) {
      foreach ($gmap['shape'] as $value) {
        $linestyle=array();
        $fillstyle=array();
          $linestyle[] = 'color: "'.$value['color'].'" ';
          $linestyle[] = 'weight: '.$value['width'];
          $linestyle[] = 'opacity: '.$value['opacity'];
          $linestyle[] = 'pattern: ['.$value['pattern'].'] ';
          $linestyle[] = 'text: "'.$value['text'].'" ';
          $fillstyle[] = 'color: "'.$value['fillcolor'].'" ';
        }
        if (isset($value['fillopacity'])){
          $fillstyle[] = 'opacity: '.$value['fillopacity'];
        $outtext .= 'var lineStyle = {'.implode(',',$linestyle)."};\n";
        if (count($fillstyle)>0) {
          $outtext .= 'var fillStyle = {'.implode(',',$fillstyle)."};\n";
webgeer's avatar
webgeer committed
        }
        else {
          $outtext .= "var fillStyle = null;\n";
        }

        switch ($value['type']) {
          case 'line':
            $outtext .= "var points = []; \n";

            foreach ($value['points'] as $lvalue) {
              $outtext .="points.push(new GPoint(".$lvalue."));\n";
            }
            $outtext .= $gmap['id'].".addOverlay(new XPolyline(points, lineStyle));\n";
            break;
          case 'circle':
            //create a circle by using a radius in km
            if (empty($value['sides'])){
              $value['sides']=36;
            }
            $outtext .= 'var radius = new XDistance('.$value['radius'].",XDistance.KM);\n";
            $outtext .= 'var centre = new GPoint('.$value['center'].");\n";
            $outtext .= $gmap['id'].".addOverlay(XPolygon.createRegularPolygonFromRadius(centre, radius, ".$value['sides'].", 0, lineStyle, fillStyle));\n";
            break;
          case 'rpolygon':
            if (isset($value['sides'])){
              $value['sides']=36;
            }
            $outtext .= "var centre = new GPoint(".$value['center'].");\n";
            $outtext .= $gmap['id'].".addOverlay(XPolygon.createRegularPolygonFromPoint( new GPoint(".$value['center']."), new GPoint(".$value['point']."), 36, lineStyle, fillStyle));\n";
            break;
          case 'polygon':
            $outtext .= "var points=[];\n";
            foreach ($value['points'] as $pvalue) {
              $outtext .= "points.push(new GPoint($pvalue));\n";
            }
            $outtext .= $gmap['id'].".addOverlay(new XPolygon(points, lineStyle, fillStyle));\n";
    if (strlen($javascript)>0) {
      $javascript=str_replace('{id}',$gmap['id'],$javascript);
      $outtext .=$javascript;
    }
    $outtext .="\n } \n   //]]>
               </script>";
webgeer's avatar
webgeer committed
    return $outtext;
}

/**
 *
 * Cleans the gmap variables to prevent javascript interjection
 *
 * @param $gmap
 * A Gmap variable
 *
 * @return
 * A GMap variable with any dangerous text removed.
webgeer's avatar
webgeer committed
 *
 * This does not really do much of anything right now.
webgeer's avatar
webgeer committed
 */

function gmap_sanitize($gmap){
  //sanitizes the gmap variables to reduce the possibility of javascript inserts
webgeer's avatar
webgeer committed
  reset($gmap);
  $value=current($gmap);
  do {
    if (key($gmap)=='id') {
webgeer's avatar
webgeer committed
      preg_match('([a-zA-Z1-9_-]*)', $value,$out);
webgeer's avatar
webgeer committed
      if (strlen($out[0])==0) $out[0]='map';
      $gmap[key($gmap)]=$out[0];
webgeer's avatar
webgeer committed
    }
    else {
webgeer's avatar
webgeer committed
      $gmap[key($gmap)]=str_replace(';','',$value);
webgeer's avatar
webgeer committed
    }
webgeer's avatar
webgeer committed
  } while ($value=next($gmap));
webgeer's avatar
webgeer committed
  return $gmap;
}

/**
 *
 * Returns the html required to insert a map from a gmap associative array.
 *
 * @param $instring
 * A string with the settings of gmap insertion in the format var=setting|var2=setting2
 *  The possible variables are
 *  id - the id of the map every map on a page must have a unique id
 *  width - width of the map
 *  height - height of the map
webgeer's avatar
webgeer committed
 *  center - a string of the longitude and latitude of the centre of the map
webgeer's avatar
webgeer committed
 *  zoom - the zoom factor of the google map
 *  align - the alignment of the map 'right', 'left' or 'center'
 *  control - the control shown on the map 'Large', 'Small', or 'None'
 *  type - 'Map', 'Hybrid' or 'Satellite'
 *  markers - a string of points to mark on the map with + between
 *          each point
 *  line - the line is defined by a set of points separated by a +
 *  track - Draws a line based on the points in the .plt file
 *  The following shape types require XMaps:
 *  circle - a circle based on a center point and a radius in km separated
 *          by a + and optionally can include the number of sizes.
 *  rpolygon - a regular polygon is defined by the center point and a point
 *          on the permiter separated by a +
 *  polygon - a polygon is defined by a set of points
 *
 *  Each of the shapes types can optionally have charecteristics of colour,
 *  width, opacity, pattern, text, fill colour, fill opacity.  Pattern, text
 *  and fill are all only used by xmaps.
 *      color - hexadecimal for the colour include the '#'
webgeer's avatar
webgeer committed
 *
 * @return
 * A string with the google map ready to be inserted into a node.
 *
 */


function gmap_parse_text($instring, $javascript='') {
webgeer's avatar
webgeer committed
  $statements=explode('|', $instring);
  $j=0;
webgeer's avatar
webgeer committed
  while (isset($statements[$j])) {
webgeer's avatar
webgeer committed
    $t=explode('=', $statements[$j],2);
      case 'points':
      case 'markers':
        unset($markername);
        if (strpos($t[1],'::')) { // note: we don't care about case starting with ':'
          list($markername,$t[1])=explode('::',$t[1],2);
        }
        unset($ttt);
        $ttt = explode('+',$t[1]);
        for ($i =0; $i<count($ttt); $i++) {
          unset($tt);
          if (strpos($ttt[$i],':')) {
            list($tt['point'],$tt['label']) = explode(':',$ttt[$i],2);
          }
          else {
            $tt['point']=$ttt[$i];
          }
          if (isset($markername)){
            $tt['markername']=$markername;
          }
          $gmap['markers'][]=$tt;
        }
        break;

      case 'track':
        $tt['color']=variable_get('gmap_default_line1_color', '#00cc00');
        if (strpos($t[1],':')) { // note: we don't care about case starting with ':'
          list($configs,$t[1])=explode(':',$t[1],2);
          list($tt['color'],$tt['width'],$tt['opacity'],$tt['pattern'],$tt['text'])=explode('/',$configs);
        }
        $tt['filename'] =$t[1];
        $gmap['track'][] = $tt;
        break;

      case 'line1':
        $tt['color']=variable_get('gmap_default_line1_color', '#00cc00');
      case 'line2':
        if (empty($tt['color'])){
          $tt['color']=variable_get('gmap_default_line2_color', '#ff0000');
        }
      case 'line3':
        if (empty($tt['color'])){
          $tt['color']=variable_get('gmap_default_line3_color', '#0000ff');
        }
      case 'line':
        if (strpos($t[1],':')) { // note: we don't care about case starting with ':'
          list($configs,$t[1])=explode(':',$t[1],2);
          list($tt['color'],$tt['width'],$tt['opacity'],$tt['pattern'],$tt['text'])=explode('/',$configs);
        }
        $tt['points'] = explode('+',$t[1]);
        $tt['type'] = 'line';
        $gmap['shape'][] = $tt;
        break;

      case 'rpolygon':
        if (strpos($t[1],':')) { // note: we don't care about case starting with ':'
          list($configs,$t[1])=explode(':',$t[1],2);
          list($tt['color'],$tt['width'],$tt['opacity'],$tt['pattern'],$tt['text'],$tt['fillcolor'],$tt['fillopacity'])=explode('/',$configs);
        }
        list($tt['center'],$tt['point'],$tt['sides']) = explode('+',$t[1]);
        $tt['type']='rpolygon';
        $gmap['shape'][] = $tt;
        break;

      case 'circle':
        if (strpos($t[1],':')) { // note: we don't care about case starting with ':'
          list($configs,$t[1])=explode(':',$t[1],2);
          list($tt['color'],$tt['width'],$tt['opacity'],$tt['pattern'],$tt['text'],$tt['fillcolor'],$tt['fillopacity'])=explode('/',$configs);
        }
        list($tt['center'],$tt['radius'],$tt['sides'])= explode('+',$t[1]);
        $tt['type']='circle';
        $gmap['shape'][] = $tt;
        break;

      case 'polygon':
        $tt['color']=variable_get('gmap_default_line1_color', '#00cc00');
        if (strpos(':',$t[1])) { // note: we don't care about case starting with ':'
          list($configs,$t[1])=explode(':',$t[1],2);
          list($tt['color'],$tt['width'],$tt['opacity'],$tt['pattern'],$tt['text'],$tt['fillcolor'],$tt['fillopacity'])=explode('/',$configs);
        }
        $tt['points'] = explode('+',$t[1]);
        $tt['type']='polygon';
        $gmap['shape'][] = $tt;
        break;


      default:
        $gmap[trim($t[0])] = trim($t[1]);
      }
webgeer's avatar
webgeer committed
    $j++;
  }
  return $gmap;
}

function gmap_from_text($instring, $javascript='') {
  $gmap=gmap_parse_text($instring,$javascript);
webgeer's avatar
webgeer committed
  $gmap=gmap_sanitize($gmap);
  $outtext = gmap_from_var($gmap,$javascript);
webgeer's avatar
webgeer committed
  return $outtext;
}


function _gmap_doheader(){

  global $gmap_initialized;
  if (variable_get('gmap_method','Static')=='None' || $gmap_initialized) {

    drupal_set_html_head('<!--gmap_initialized already -->');
    return;
  }

webgeer's avatar
webgeer committed
  $header_text = '<style type="text/css">
               v\:* {
                 behavior:url(#default#VML);
               }
               </style>
                <script src="http://maps.google.com/maps?file=api&amp;v=1&amp;key='.variable_get('googlemap_api_key', '').'" type="text/javascript"></script>
                <script type="text/javascript">
                 //<![CDATA[
                 var gmap_torun= new Array();

                 // note: this is to allow the page to finish loading before it tries to modify the DOM
                   function gmap_onload() {

                     for (i=0; i < gmap_torun.length; i++) {
                        eval(gmap_torun[i]);
                     }
                   }
                   var oldOnload = window.onload;
                   if (typeof window.onload != \'function\') {
                     window.onload = gmap_onload;
                   }else {
                     window.onload = function() {
                       oldOnload();
                       gmap_onload();
                     }
                   }

              var baseIcon = new GIcon();
              baseIcon.image = "http://www.google.com/mapfiles/marker.png";
              baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
              baseIcon.iconSize = new GSize(20, 34);
              baseIcon.shadowSize = new GSize(37, 34);
webgeer's avatar
webgeer committed
              baseIcon.iconAnchor = new GPoint(9, 34);
              baseIcon.infoWindowAnchor = new GPoint(9, 2);
              baseIcon.infoShadowAnchor = new GPoint(18, 25);

              function createGMarker(point, htmltext, marker) {
                if (marker.length >0) {
webgeer's avatar
webgeer committed
                  var markerIcon = new GIcon(baseIcon);
                  markerIcon.image = marker;
                  var returnMarker = new GMarker(point, markerIcon);
webgeer's avatar
webgeer committed
                  var returnMarker = new GMarker(point);
                }

                // Show this htmltext  info window when it is clicked.
                if (htmltext.length>0) {
webgeer's avatar
webgeer committed
                  GEvent.addListener(returnMarker, \'click\', function() {
                    returnMarker.openInfoWindowHtml(htmltext);
webgeer's avatar
webgeer committed
                return returnMarker;
              }
                  // ]]>
               </script>
              ';
  if (variable_get('gmap_xmaps',0)) {
    $header_text .= '<script src="'.variable_get('gmap_xmaps_script','misc/xmaps.1c.js').'" type="text/javascript"> </script>'."\n";
  }
  drupal_set_html_head($header_text);
  $gmap_initialized = true;
}

webgeer's avatar
webgeer committed
function _gmap_prepare($intext) {
  $out=FALSE;
  $mapexp = '/\[gmap([^\[\]]+ )* \] /x';
  preg_match_all($mapexp, $intext, $matches);
  $i=0;

  while (isset($matches[1][$i])) {
    $out[0][$i] = $matches[0][$i];
    $out[1][$i] = gmap_from_text($matches[1][$i]);
    $i++;
  } // endwhile process macro
  return $out;
}

function gmap_todim($instring) {
  if (strpos($instring,'px')) {
    return intval($instring).'px';
  }
  elseif (strpos($instring,'%')) {
    return intval($instring).'%';
  }
  else {
    return intval($instring).'px';
  }
}

webgeer's avatar
webgeer committed
function gmap_filter($op, $delta = 0, $format = -1, $text = '') {
  switch ($op) {
    case 'list':
      return (array(0 => t('GMap filter')));
      break;

    case 'name':
      return t('Google map filter');
      break;

    case 'description':
      return t('converts a google map  macro into the html required for inserting a google map.');
      break;
webgeer's avatar
webgeer committed
    case 'process':
      $gmaps=_gmap_prepare($text);   //returns an array of $tables[0] = table macro $table[1]= table html
      if ($gmaps) {                    // there are table macros in this node
        return str_replace($gmaps[0], $gmaps[1], $text);
      }
      else {
        return $text;
      }
      break;

    case 'prepare':
      return $text;
      break;

    case 'no cache':
      return variable_get('gmap_method', 'Static')=='Dynamic';
      break;
webgeer's avatar
webgeer committed
  }
}

function gmap_filter_tips($delta, $format, $long = false) {
webgeer's avatar
webgeer committed
  return t('Insert Google Map macro. <a href="gmapmacro" target="_blank" >Create a macro</a>');
webgeer's avatar
webgeer committed
}

function gmap_menu($may_cache) {
  $items=array();

  if ($may_cache) {
    $items[] = array('path' => 'gmapmacro',
                     'title' => t('Create a Google Map Macro'),
                     'access' => user_access('create macro'),
                     'callback' => 'gmap_macro_page' );
    if (variable_get('gmap_user',0)) {
      $items[] = array('path' => 'users/map',
                       'type' => MENU_NORMAL_ITEM,
webgeer's avatar
webgeer committed
                       'title' => t('User Locations'),
                       'access' => user_access('show user map'),
                       'callback' => 'gmap_users_page' );
    }
webgeer's avatar
webgeer committed
  }
webgeer's avatar
webgeer committed
  if (!$may_cache && (strlen(variable_get('googlemap_api_key', '')) > 0)) {
    if (variable_get('gmap_method', 'Static')=='Static') {
      _gmap_doheader();
    }
webgeer's avatar
webgeer committed
  }
  return $items;
}

function gmap_user($op, &$edit, &$user, $category = NULL) {
  if (variable_get('gmap_user',0)) {
    switch ($op) {
      case 'categories':
        return array(array('name'=>'gmap_user', 'title'=> t('Location Map'),'weight'=>5));
      case 'validate':
        if (isset($edit['gmap_latitude'])){
          if (!is_numeric($edit['gmap_latitude']) || abs($edit['gmap_latitude'])>90) {
            form_set_error('gmap_latitude', t('Latitude must be between -90 and 90'));
          }
        }
        if (isset($edit['gmap_longitude'])){
          if (!is_numeric($edit['gmap_longitude']) || abs($edit['gmap_longitude'])>180) {
            form_set_error('gmap_longitude', t('Longitude must be between -180 and 180'));
          }
        }
        return;
      case 'load':
        $res=db_query("SELECT * FROM {gmap_user} WHERE uid=%d",$user->uid);
        if ($gmap_user=db_fetch_array($res)) {
          $user->latitude=$gmap_user['latitude'];
          $user->longitude=$gmap_user['longitude'];
          $user->gmap_zoom=$gmap_user['zoom'];
        }
        return;
      case 'insert':
      case 'update':
        if ((isset($edit['gmap_latitude']) && $edit['gmap_latitude'] !=0) && (isset($edit['gmap_longitude']) && $edit['gmap_longitude'] !=0)) {
          db_query('DELETE from {gmap_user} WHERE uid=%d',$user->uid);
          db_query("INSERT INTO {gmap_user} (uid, latitude, longitude, zoom) VALUES (%d, %f, %f, %d)", $user->uid, $edit['gmap_latitude'],$edit['gmap_longitude'], $edit['gmap_zoom']);
        }
        return;

        //db_query ("UPDATE {gmap_user} SET latitude='%f', longitude='%f', zoom=%d WHERE uid=%d", $user->uid, $edit['gmap_latitude'],$edit['gmap_longitude'], $edit['gmap_zoom']);
        //return;
      case 'delete':
        db_query ('DELETE from {gmap_user} WHERE uid=%d', $user->uid);
        return;
      case 'form':
        if ($category=='gmap_user') {
          if (isset($user->latitude) && isset($user->longitude)) {
            $usermap=_gmap_user_form($user->longitude,$user->latitude, $user->gmap_zoom);
          }
          else {
            $usermap = _gmap_user_form();
          }
          $form['map']=array('#type' => 'fieldset','#title' => t('Google Map'));
          $form['map']['gmap_user']=array('#type'=>'markup','#value'=>$usermap);
          $form['coordinates']=array('#type' => 'fieldset','#title' => t('Coordinates'));
          $form['coordinates']['gmap_latitude']=array('#type'=>'textfield', '#title'=>t('Latitude'), '#default_value'=>$user->latitude, '#size'=>30, '#maxlength'=>120, '#description'=>t('The latitude will automatically be entered here (or you can do it manually).'),'#onchange'=>'gmap_textchange();');
          $form['coordinates']['gmap_longitude']=array('#type'=>'textfield', '#title'=>t('Longitude'), '#default_value'=>$user->longitude, '#size'=>30, '#maxlength'=>120, '#description'=>t('The longitude will automatically be entered here (or you can do it manually).'),'#onchange'=>'gmap_textchange();');
          $form['coordinates']['gmap_user_zoom']=array('#type'=>'hidden', '#default_value'=>variable_get('gmap_user_zoom', 15));
          return  $form;
 /*
          $form2 = form_textfield(t('Latitude'), 'gmap_latitude', $user->latitude, 30,120, t('The latitude will automatically be entered here (or you can do it manually).'), array('onchange'=>'gmap_textchange();') );
          $form2 .= form_textfield(t('Longitude'), 'gmap_longitude', $user->longitude, 30,120, t('The longitude will automatically be entered here (or you can do it manually).'), array('onchange'=>'gmap_textchange();') );
          $form2 .= form_hidden('gmap_zoom', variable_get('gmap_user_zoom', 15));

          return array(array('title'=>t('Google Map'), 'data'=>$form, 'weight'=>0),array('title'=>t('Coordinates'), 'data'=>$form2, 'weight'=>1));
*/
        }
    }
  }
}

/* Not used in Drupal 4.7 due to a bug in Drupal 4.7
webgeer's avatar
webgeer committed
function gmap_onload() {
webgeer's avatar
webgeer committed
  if (strlen(variable_get('googlemap_api_key', ''))>0) return array('gmap_onload()');
webgeer's avatar
webgeer committed
}
webgeer's avatar
webgeer committed
function gmap_settings() {
  //note the same google api key variable name as in the googlemap module is used
webgeer's avatar
webgeer committed
  //note the name of the variable for center of the map is latlong although the format is actually longitude, latitude

  $form['initialization']=array('#type' => 'fieldset','#title' => t('Google Map Initialize'));
  $form['initialization']['googlemap_api_key']=array('#type' => 'textfield', '#title' => t('Google map API key'), '#default_value'=>variable_get('googlemap_api_key', ''), '#size' => 50, '#maxlength' => 255,'#description' => t('Your personal Googlemaps API key.  You must get this for each separate website at <a href="http://www.google.com/apis/maps/">Google Map API website</a>.'));
  $form['initialization']['gmap_method']=array('#type' => 'select', '#title' => t('Google map method'),  '#options'=> array('Static'=>t('Static'), 'Dynamic'=>t('Dynamic'), 'None'=>t('None')),'#default_value'=>variable_get('gmap_method','Static'),'#description' => t('How is the Google Map initialization script run:<br /><strong>Static</strong> - Loaded on every page, <br /><strong>Dynamic</strong> - Initialization script runs only on pages with google maps, but all pages with the gmap filter will not be cached. <br /><strong>None</strong> - Google map initialization script must be loaded some other way.'));
  $form['initialization']['gmap_xmaps']=array('#type'=>'checkbox', '#title'=>t('Enable Xmaps features (circles and polygons)'), '#default_value'=>variable_get('gmap_xmaps',0),'#description'=>t('Enables XMaps features.  XMaps is currently a <em>beta</em> release available from <a href="http://xmaps.busmonster.com/">xmaps.busmonser.com</a>. '));
  $form['initialization']['gmap_xmaps_script']=array('#type' => 'textfield', '#title' => t('Location of XMaps script'), '#default_value'=>variable_get('gmap_xmaps_script','misc/xmaps.1c.js'), '#size' => 25, '#maxlength' => 50);


  $form['defaults']=array('#type' => 'fieldset', '#title' => t('Default map settings'));
  $form['defaults']['gmap_default_width']=array('#type'=>'textfield', '#title'=>t('Default width'), '#default_value'=>variable_get('gmap_default_width', 300), '#size'=>25, '#maxlength'=>6, '#description'=>t('The default width of a Google map.'));
  $form['defaults']['gmap_default_height']=array('#type'=>'textfield', '#title'=>t('Default height'), '#default_value'=>variable_get('gmap_default_height', 200), '#size'=>25, '#maxlength'=>6, '#description'=>t('The default height of a Google map.'));
  $form['defaults']['gmap_default_latlong']=array('#type'=>'textfield', '#title'=>t('Default center'), '#default_value'=>variable_get('gmap_default_latlong', '-123.1, 49.2'), '#size'=>50, '#maxlength'=>255, '#description'=>t('The default longitude, latitude of a Google map.'));
  $form['defaults']['gmap_default_zoom']=array('#type'=>'textfield', '#title'=>t('Default zoom'), '#default_value'=>variable_get('gmap_default_zoom', 7), '#size'=>25, '#maxlength'=>4, '#description'=>t('The default zoom level of a Google map (between 1 and 24).'));
  $form['defaults']['gmap_default_control']=array('#type'=>'select', '#title'=>t('Default control type'), '#default_value'=>variable_get('gmap_default_control', 'Small'), '#options'=>array('None'=>t('None'),'Small'=>t('Small'),'Large'=>t('Large')));
  $form['defaults']['gmap_default_type']=array('#type'=>'select', '#title'=>t('Default map type'), '#default_value'=>variable_get('gmap_default_type', 'Map'), '#options'=>array('Map'=>t('Map'),'Hybrid'=>t('Hybrid'),'Satellite'=>t('Satellite')));
  $form['defaults']['gmap_default_line1_color']=array('#type'=>'textfield', '#title'=>t('Default Line 1 Color'), '#default_value'=>variable_get('gmap_default_line1_color', '#00cc00'), '#size'=>25, '#maxlength'=>7 );
  $form['defaults']['gmap_default_line2_color']=array('#type'=>'textfield', '#title'=>t('Default Line 2 Color'), '#default_value'=>variable_get('gmap_default_line2_color', '#ff0000'), '#size'=>25, '#maxlength'=>7 );
  $form['defaults']['gmap_default_line3_color']=array('#type'=>'textfield', '#title'=>t('Default Line 3 Color'), '#default_value'=>variable_get('gmap_default_line3_color', '#0000ff'), '#size'=>25, '#maxlength'=>7 );

  $form['user']=array('#type' => 'fieldset', '#title' => t('User map settings'));
  $form['user']['gmap_user']=array('#type'=>'checkbox', '#title'=>t('Enable Mapping of user locations'), '#default_value'=>variable_get('gmap_user',0),'#description'=>t('Ensure that the database table gmap_user is created before turning on the user location mapping functions.'));
  $form['user']['gmap_user_map']=array('#type'=>'textfield', '#title'=>t('Default user map'), '#default_value'=>variable_get('gmap_user_map', '[gmap|id=usermap|center=0,30|zoom=16|width=100%|height=400px]'), '#size'=>50, '#description'=>t('The gmap macro where the user information will be diplayed on.'));
  $form['user']['gmap_user_map_header']=array('#type'=>'textarea', '#title'=>t('Text at the top of the users/map page'), '#default_value'=>variable_get('gmap_user_map_header', t('This map illustrates the extent of users of this website. Each marker indicates a user that has entered their locations.')), '#cols'=>50, '#rows'=>6 );

  return $form;
  /*  from 4.6 settings
  $output  = form_group(t('Google map initializations'),
             form_textfield(t('Google API Key'), 'googlemap_api_key', variable_get('googlemap_api_key', ''), 100, 255, t('Your personal Googlemaps API key.  You must get this for each separate website at <a href="http://www.google.com/apis/maps/">Google Map API website</a>.')).
             form_select(t('Google map method'), 'gmap_map_method', variable_get('gmap_map method', 'Static'), array('Static'=>t('Static'), 'Dynamic'=>t('Dynamic'), 'None'=>t('None')),t('How is the Google Map initialization script run:<br /><strong>Static</strong> - Loaded on every page, <br /><strong>Dynamic</strong> - Initialization script runs only on pages with google maps, but all pages with the gmap filter will not be cached. <br /><strong>None</strong> - Google map initialization script must be loaded some other way.')));
  $output .= form_group(t('Default map settings'),
             form_textfield(t('Default width'), 'gmap_default_width', variable_get('gmap_default_width', 300), 100,4,t('The default width of a Google map.')).
             form_textfield(t('Default height'), 'gmap_default_height', variable_get('gmap_default_height', 200), 100,4,t('The default height of a Google map.')).
             form_textfield(t('Default center'), 'gmap_default_latlong', variable_get('gmap_default_latlong', '-123.1, 49.2'), 100,120,t('The default longitude, latitude of a Google map.')).
             form_textfield(t('Default zoom'), 'gmap_default_zoom', variable_get('gmap_default_zoom', 7), 100,2,t('The default zoom level of a Google map.')).
             form_select(t('Default Control type'), 'gmap_default_control', variable_get('gmap_default_control', 'Small'), array('None'=>t('None'), 'Small'=>t('Small'), 'Large'=>t('Large')),t('The default control type for the map.')).
             form_select(t('Default map type'), 'gmap_map_type', variable_get('gmap_default_type', 'Map'),array('Map'=>t('Map'), 'Hybrid'=>t('Hybrid'), 'Satellite'=>t('Satellite')),t('The default map type.')).
             form_textfield(t('Line1 color'), 'gmap_default_line1_color', variable_get('gmap_default_line1_color', '#00cc00'), 100,7).
             form_textfield(t('Line2 color'), 'gmap_default_line2_color', variable_get('gmap_default_line2_color', '#ff0000'), 100,7).
             form_textfield(t('Line3 color'), 'gmap_default_line3_color', variable_get('gmap_default_line3_color', '#0000ff'), 100,7));
  $output .= form_group(t('User map settings'),
             form_checkbox(t('Enable mapping of user locations.'),'gmap_user', 1, variable_get('gmap_user',0),t('Ensure that the database table gmap_user is created before turning on the user location mapping functions.')).
             form_textfield(t('User Map View'), 'gmap_user_map', variable_get('gmap_user_map', '[gmap|id=usermap|center=0,30|zoom=16|width=100%|height=400px]'), 100,255));
webgeer's avatar
webgeer committed

  return $output;
webgeer's avatar
webgeer committed
}

/**
 *
 * Creates a page that has all of the javascript required for the macro-creation tool.
 *
 */

function gmap_macro_page() {
webgeer's avatar
webgeer committed
   $line_colour=array(1=>variable_get('gmap_default_line1_color', '#00cc00'), variable_get('gmap_default_line2_color', '#ff0000'),variable_get('gmap_default_line3_color', '#0000ff'));
  (isset($_REQUEST['width'])) ? $newwidth=$_REQUEST['width'] : $newwidth= variable_get('gmap_default_width', 300);
  (isset($_REQUEST['height'])) ? $newheight=$_REQUEST['height'] : $newheight= variable_get('gmap_default_height', 200);
webgeer's avatar
webgeer committed
  (isset($_REQUEST['longlat'])) ? $newlonglat=$_REQUEST['longlat'] : $newlonglat= variable_get('gmap_default_latlong', '-123.1, 49.2');
webgeer's avatar
webgeer committed
  (isset($_REQUEST['zoom'])) ? $newzoom=$_REQUEST['zoom'] : $newzoom= variable_get('gmap_default_zoom', 7);
  (isset($_REQUEST['control'])) ? $newcontrol=$_REQUEST['control'] : $newcontrol= variable_get('gmap_default_control', 'Small');
  $control=''; $small=''; $large='';
  (variable_get('clean_url', true)) ? $qurl='' : $qurl='?q=';
webgeer's avatar
webgeer committed
  $none= ($newcontrol=='None') ? 'SELECTED ' :'';
webgeer's avatar
webgeer committed
  $initiate = "//initiate variables\n";
webgeer's avatar
webgeer committed
  if ($newcontrol=='Small') {
    $small = 'SELECTED ';
webgeer's avatar
webgeer committed
    $initiate .=  "map.addControl(mycontrol = new GSmallMapControl());\n";
webgeer's avatar
webgeer committed
  }
  if ($newcontrol=='Large') {
    $large = 'SELECTED ';
webgeer's avatar
webgeer committed
    $initiate .=  "map.addControl(mycontrol = new GLargeMapControl());\n";
webgeer's avatar
webgeer committed
  for ($i=1; $i<=3; $i++) {
    if (isset($_REQUEST['point'.$i]) && strlen($_REQUEST['point'.$i])>0) {
      $newpoint[$i]=$_REQUEST['point'.$i];
      $initiate .= 'point'.$i.'overlay=new GMarker(new GPoint('.$_REQUEST['point'.$i].'));'."\n";
      $initiate .= 'map.addOverlay(point'.$i.'overlay);'."\n";
    }
    else {
      $newpoint[$i]='';
    }

    if (isset($_REQUEST['line'.$i]) && strlen($_REQUEST['line'.$i])>0) {
      $newline[$i]=$_REQUEST['line'.$i];
      $initiate .= 'line'.$i.'overlay = new GPolyline([new GPoint('.str_replace(' + ','), new GPoint(',$newline[$i]).')],"'.$line_colour[$i].'", 5);'."\n";
      $initiate .= 'map.addOverlay(line'.$i.'overlay);'."\n";
    }
    else {
      $newline[$i]='';
    }

webgeer's avatar
webgeer committed
  }

  $output='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml">
  <head>
    <title>GMap Macro Creator</title>
    <script src="http://maps.google.com/maps?file=api&v=1&key='.variable_get('googlemap_api_key', 'abcdef').'" type="text/javascript"></script>
webgeer's avatar
webgeer committed
    <style type="text/css">
      v\:* {
        behavior:url(#default#VML);
      }
webgeer's avatar
webgeer committed
      body {
        font-family: Helvetica, Arial, Lucida, Verdana, sans-serif;
      }
      h1 {
        font-size: 1.2em;
        font-weight: 700;
      }
webgeer's avatar
webgeer committed
    </style>
  </head>
  <body onload="makemacro(); gmapload();">
    <h1>GMap Macro creation tool</h1>
    <p>Using the controls on this page, set the map as to how you would like it to appear and then use the gmap macro filter to insert this
webgeer's avatar
webgeer committed
    into a node.  Select the contents of the macro form (by clicking on macro text field) and then copy and paste it into a node where the
    gmap filter has been enabled.
    <p><div id="map" style="width: '.$newwidth.'; height: '.$newheight.'"></div>
webgeer's avatar
webgeer committed
    <script type="text/javascript">
    //<![CDATA[

    function makemacro() {
      var zooml = \' |zoom=\' + document.gmapform.zoom.value;
webgeer's avatar
webgeer committed
      var center = \' |center=\' + document.gmapform.longlat.value;
webgeer's avatar
webgeer committed
      var width = \' |width=\' + document.gmapform.width.value;
      var height = \' |height=\' + document.gmapform.height.value;
      var id = \' |id=\' + document.gmapform.id.value;
      var control = \' |control=\' + document.gmapform.controltype.value;
      var type = \' |type=\' + document.gmapform.maptype.value;
      var alignment = \' |align=\' + document.gmapform.alignment.value;
      if (points.length >0) {
        var outpoints = \' |markers=\' + points.join(\' + \');
      } else var outpoints=\'\';
webgeer's avatar
webgeer committed
      if (document.gmapform.line1.value.length >0) {var line1 = \' |line1=\' + document.gmapform.line1.value} else line1=\'\';
      if (document.gmapform.line2.value.length >0) {var line2 = \' |line2=\' + document.gmapform.line2.value} else line2=\'\';
      if (document.gmapform.line3.value.length >0) {var line3 = \' |line3=\' + document.gmapform.line3.value} else line3=\'\';

      document.gmapform.macro.value = \'[gmap\' + id + center + zooml + width + height +  alignment + control + type + outpoints + line1 + line2 + line3 + \']\';

webgeer's avatar
webgeer committed
    }
function mapat(instring) {
     var splitstring=instring.split(",");
     map.centerAtLatLng(new GPoint(splitstring[0],splitstring[1]));
}

function docontrol(incontrol) {
     map.removeControl(mycontrol);
     if (incontrol == "Small") map.addControl(mycontrol = new GSmallMapControl());
     if (incontrol == "Large") map.addControl(mycontrol = new GLargeMapControl());
     makemacro();
}

function changetype(intype) {
    if (intype == "Map") map.setMapType(G_MAP_TYPE);
    if (intype == "Hybrid") map.setMapType(G_HYBRID_TYPE);
    if (intype == "Satellite") map.setMapType(G_SATELLITE_TYPE);
    makemacro();
}

function doresize () {
     var width = document.gmapform.width.value; //(in pixels, e.g. 500px)
     var height = document.gmapform.height.value; //(in pixels, e.g. 300px)
     if (mapdiv){
           mapdiv.style.width=width;
           mapdiv.style.height=height;
     }
     map.onResize();
     makemacro();
}

webgeer's avatar
webgeer committed
var map=null;
var mycontrol=null;
webgeer's avatar
webgeer committed
var line1overlay=null;  var line1points=new Array(); var line1string=new String();
var line2overlay=null;  var line2points=new Array(); var line2string=new String();
var line3overlay=null;  var line3points=new Array(); var line3string=new String();

    function gmapload() {
      if (GBrowserIsCompatible()) {
        map = new GMap(document.getElementById("map"));

webgeer's avatar
webgeer committed
        map.centerAndZoom(new GPoint('.$newlonglat.'), '.$newzoom.');
webgeer's avatar
webgeer committed
       '.$initiate.'
webgeer's avatar
webgeer committed
        GEvent.addListener(map, "moveend", function() {
          var center = map.getCenterLatLng();
          var latLngStr = center.x + \', \' + center.y ;
webgeer's avatar
webgeer committed
          document.gmapform.longlat.value = latLngStr;
webgeer's avatar
webgeer committed
          makemacro();
        });

        GEvent.addListener(map, "zoom", function() {
          var zooml = map.getZoomLevel();
          document.gmapform.zoom.value = zooml;
webgeer's avatar
webgeer committed
          document.gmapform.longlat.value = latLngStr;
webgeer's avatar
webgeer committed
          makemacro();
        });


        GEvent.addListener(map, \'click\', function(overlay, point) {

          if (overlay) {
            var shft=false;
            for (i=0; i<points.length; i++){
              if (overlay==pointsOverlays[i]) {
                shft=true;
              }
              if (shft==true) {
                if (i<points.length) {
                  pointsOverlays[i]=pointsOverlays[i+1];
                  points[i]=points[i+1];
                }
              }
webgeer's avatar
webgeer committed
            }
webgeer's avatar
webgeer committed
            map.removeOverlay(overlay);
          }
          else if (point) {
            if (document.gmapform.clicktype.value==\'Points\') {
              map.addOverlay(marker=new GMarker(point));
              pointsOverlays.push(marker);
              points.push(point.x + \',\' + point.y);
webgeer's avatar
webgeer committed
            }
            else if (document.gmapform.clicktype.value==\'Line1\') {
              line1points.push(point);
              if (line1overlay) map.removeOverlay(line1overlay);
webgeer's avatar
webgeer committed
              line1overlay=new GPolyline(line1points,"'.$line_colour[1].'", 5);
webgeer's avatar
webgeer committed
              map.addOverlay(line1overlay);
              if (line1string.length > 0) line1string += \' + \';
              line1string += point.x + \',\' + point.y;
              document.gmapform.line1.value = line1string;
            }
            else if (document.gmapform.clicktype.value==\'Line2\') {
              line2points.push(point);
              if (line2overlay) map.removeOverlay(line2overlay);
webgeer's avatar
webgeer committed
              line2overlay=new GPolyline(line2points,"'.$line_colour[2].'", 5);
webgeer's avatar
webgeer committed
              map.addOverlay(line2overlay);
              if (line2string.length > 0) line2string += \' + \';
              line2string += point.x + \',\' + point.y;
              document.gmapform.line2.value = line2string;
            }
            else if (document.gmapform.clicktype.value==\'Line3\') {
              line3points.push(point);
              if (line3overlay) map.removeOverlay(line3overlay);
webgeer's avatar
webgeer committed
              line3overlay=new GPolyline(line3points,"'.$line_colour[3].'", 5);
webgeer's avatar
webgeer committed
              map.addOverlay(line3overlay);
              if (line3string.length > 0) line3string += \' + \';
              line3string += point.x + \',\' + point.y;
              document.gmapform.line3.value = line3string;
            }

          }
          makemacro();
        });
      }
    }

    function addpoint(formelement) {
     var splitstring=formelement.value.split(",");
     var point=new GPoint(splitstring[0],splitstring[1]);
           if (document.gmapform.clicktype.value==\'Points\') {
              map.addOverlay(marker=new GMarker(point));
              pointsOverlays.push(marker);
              points.push(formelement.value);
            }
            else if (document.gmapform.clicktype.value==\'Line1\') {
              line1points.push(point);
              if (line1overlay) map.removeOverlay(line1overlay);
              line1overlay=new GPolyline(line1points,"'.$line_colour[1].'", 5);
              map.addOverlay(line1overlay);
              if (line1string.length > 0) line1string += \' + \';
              line1string += point.x + \',\' + point.y;
              document.gmapform.line1.value = line1string;
            }
            else if (document.gmapform.clicktype.value==\'Line2\') {
              line2points.push(point);
              if (line2overlay) map.removeOverlay(line2overlay);
              line2overlay=new GPolyline(line2points,"'.$line_colour[2].'", 5);
              map.addOverlay(line2overlay);
              if (line2string.length > 0) line2string += \' + \';
              line2string += point.x + \',\' + point.y;
              document.gmapform.line2.value = line2string;
            }
            else if (document.gmapform.clicktype.value==\'Line3\') {
              line3points.push(point);
              if (line3overlay) map.removeOverlay(line3overlay);
              line3overlay=new GPolyline(line3points,"'.$line_colour[3].'", 5);
              map.addOverlay(line3overlay);
              if (line3string.length > 0) line3string += \' + \';
              line3string += point.x + \',\' + point.y;
              document.gmapform.line3.value = line3string;
            }

          makemacro();

}

webgeer's avatar
webgeer committed
    function newid  ()