<?php

SDV($CacheDir,"$FarmD/pub/address_cache");

SDVA($MapDefaults, array(
    'id' => 'map',
    'style'=>'"width: 85%; height: 400px; text-align: center;"'
    )
);

SDVA($MarkerDefaults, array(
    'id' => 'map'
    )
);

Markup('map', '>if', '/\(:Google-Map\s*(.*?):\)/e',"google_map('$1');");
Markup('marker', '<map', '/\(:Google-Marker\s*(.*?):\)/e',"google_marker('$1');");

function _quote($s){return "'".$s."'";}

function google_map($args) {
  global $MarkupFrame, $MapCode,$MapDefaults;
  $opts = array_merge($MapDefaults,parseArgs($args));
  unset($opts['#']);
  if (!$MarkupFrame[0]['posteval']['Google-Map']) $MarkupFrame[0]['posteval']['Google-Map'] = 'GoogleMapScript();';
  $MapCode.=<<<MAPCODE
      
    var {$opts['id']} = new google.maps.Map(document.getElementById('{$opts['id']}'), {
      zoom: 0,
      center: new google.maps.LatLng(0, 0),
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });
MAPCODE;
  $div='<div';
  foreach($opts as $k=>$v) $div.=" $k=".stripslashes($v);
  $div.="></div>";
  return(Keep($div));
}

function google_marker($args) {
  global $MarkerCode,$MarkerDefaults;
  $opts = array_merge($MarkerDefaults,parseArgs($args));
  $opts['text'] = preg_replace('/&lt;/','<', $opts['text']);
  $opts['text'] = preg_replace('/&gt;/','>', $opts['text']);
  $opts['text'] = _quote($opts['text']);
  $opts['icon'] = stripslashes($opts['icon']);
  $MarkerCode.="\nAddMarker({$opts['id']},{$opts['lat']},{$opts['lon']},{$opts['text']},{$opts['icon']});";
  return('');
}

function GoogleMapScript() {
  global $HTMLHeaderFmt, $HTMLStylesFmt, $HTMLFooterFmt, $MapCode, $MarkerCode;
  $HTMLHeaderFmt[] 
     =  '<style type=\'text/css\'>v:* { behavior:url(#default#VML); }</style>'
       ."\n<script src='http://maps.google.com/maps/api/js?sensor=false' type='text/javascript'></script>";
  $HTMLHeaderFmt[] 
     =  "\n<script language='javascript' src='\$FarmPubDirUrl/GoogleMapsv3.js'>"
       ."</script>\n"; 
  $HTMLFooterFmt['google-maps'] =<<<SCRIPT
<script type="text/javascript">
  var from_htmls = [];
  var htmls = [];
  var markers = [];
  var to_htmls = [];
  var i = 0;
  var bounds = new google.maps.LatLngBounds();
  var infowindow = new google.maps.InfoWindow();
  $MapCode
  $MarkerCode
</script>
SCRIPT;
}


function AddressLookup($a) {
  if (!is_string($a) or !$a) return false;
  global $CacheDir;
  $fname = preg_replace("/\/\//", "/", "$CacheDir/".md5($a).".txt");
  if ($CacheDir && file_exists($fname)) {
    $f = fopen($fname, 'r');
    if ($f) { 
      $_coords = unserialize(fread($f, filesize($fname)));
      fclose($f);
      return $_coords;
    }
  }
  $_url = sprintf('http://maps.google.com/maps?output=js&q=%s',rawurlencode($a));
  $_result = false;
  $_coords = false;
  if($_result = file_get_contents($_url)) {
    if(strpos($_result,'errortips') > 1 || strpos($_result,'Did you mean:') !== false) return false;
    preg_match('!center:\s*{lat:\s*(-?\d+\.\d+),lng:\s*(-?\d+\.\d+)}!U', $_result, $_match);
    if($_match){
      $_coords['lat'] = $_match[1];
      $_coords['lon'] = $_match[2];
      $f = fopen($fname, 'w');
      if($f){
        fwrite($f,serialize($_coords));
        fclose($f);
      }
    }
  }
  return $_coords;
}