source: project/release/3/svnwiki-googlemap/trunk/svnwiki-googlemap.scm @ 14915

Last change on this file since 14915 was 14915, checked in by azul, 11 years ago

Letting the user change the location through the edit form with the use of a clickable map.

File size: 7.3 KB
Line 
1(use html-stream svnwiki-extensions-support stream-ext srfi-40 format-modular posix srfi-1)
2
3(define (googlemap-update env)
4  (let-from-environment env (path-in path path-out)
5    (when (directory? (svnwiki-make-pathname path-in path))
6      (svnwiki-report-progress env "Updating map: ~A~%" path)
7      (write-file-with-tmp
8        (svnwiki-make-pathname path "xsvnwiki-googlemap" "index")
9        "text/html"
10        path-out
11        (map-html env))
12      (write-file-with-tmp
13        (svnwiki-make-pathname path "xsvnwiki-googlemap" "data")
14        "text/xml"
15        path-out
16        (map-data env)))))
17
18(define (map-html env)
19  (html-stream
20    "<!DOCTYPE html PUBLIC \\-//W3C//DTD XHTML 1.0 Strict//EN\""
21    "  \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"
22    ((html xmlns "http://www.w3.org/1999/xhtml")
23     (head
24       ((meta http-equiv "content-type" content "text/html; charset=utf-8"))
25       (title
26         (svnwiki-repository-property-get
27           "svnwiki:googlemap:title"
28           (svnwiki-repository-path env)
29           "Map"))
30       ((script src (format #f "http://www.google.com/jsapi?key=~A"
31                            (svnwiki-repository-property-get
32                              "svnwiki:googlemap:key"
33                              (svnwiki-repository-path env)
34                              ""))
35                type "text/javascript"))
36       ((script type "text/javascrit") *map-js*))
37     ((body onload "load()" onunload "GUnload()")
38      ((div id "map" style "width: 100%; height: 600px"))))))
39
40(define (googlemap-javascript env)
41#<<EOJS
42svnwikiGooglemap = new Object();
43
44function addMarker( point, data ) {
45  var file = data.getAttribute("file");
46  var title = data.getAttribute("title");
47  var marker = new GMarker(point);
48  GEvent.addListener(marker, "click", function() {
49    marker.openInfoWindowHtml('<a target="_blank" href="../' + file + '">' + title + '</a>');
50  });
51  return marker;
52}
53
54function load() {
55  if (GBrowserIsCompatible()) {
56    var map = new GMap2(document.getElementById("map"));
57    map.addControl(new GSmallMapControl());
58    map.addControl(new GMapTypeControl());
59    map.setCenter(new GLatLng(0, 0), 2);
60    GDownloadUrl("users.xml", function(data, responseCode) {
61      var xml = GXml.parse(data);
62      var markers = xml.documentElement.getElementsByTagName("marker");
63      for (var i = 0; i < markers.length; i++) {
64        var point = new GLatLng(parseFloat(markers[i].getAttribute("latitude")),
65                                parseFloat(markers[i].getAttribute("longitude")));
66        map.addOverlay(addMarker(point, markers[i]));
67      }
68    });
69  }
70}
71
72svnwikiGooglemap.editInitialize = function (property, id, latitude, longitude) {
73  var mapOptions = {
74    mapTypeId: google.maps.MapTypeId.ROADMAP,
75    zoom: latitude && longitude ? 4 : 1,
76    center: new google.maps.LatLng(latitude || 0, longitude || 0)
77  };
78  var div = svnwikiJavascript.cleanContent(document.getElementById('googlemap-' + id))
79  div.style.height = '400px';
80  var map = new google.maps.Map(div, mapOptions);
81  var marker = new google.maps.Marker({map: map});
82  if (latitude && longitude)
83    svnwikiGooglemap.moveMarker(property, id, new google.maps.LatLng(latitude, longitude), marker);
84  google.maps.event.addListener(map, 'click', function(event) {
85    svnwikiGooglemap.moveMarker(property, id, event.latLng, marker);
86  });
87}
88
89svnwikiGooglemap.moveMarker = function (property, id, location, marker) {
90  marker.set_position(location);
91  document.getElementById('xsvnwiki-googlemap:latitude:' + id).value = location.lat().toString();
92  document.getElementById('xsvnwiki-googlemap:longitude:' + id).value = location.lng().toString();
93}
94EOJS
95)
96
97(svnwiki-extension-define 'javascript 'googlemap googlemap-javascript)
98
99(define (map-data env)
100  (let-from-environment env (path-in path)
101    (html-stream
102      (format #f "<markers>")
103      (stream-concatenate
104        (stream-map
105          (lambda (file)
106            (let ((props (map (cut svnwiki-repository-property-get
107                                   <> 
108                                   (svnwiki-make-pathname (list path-in path) file)
109                                   #f)
110                              (list "svnwiki:googlemap:latitude"
111                                    "svnwiki:googlemap:longitude"))))
112              (if (every string? props)
113                (format #f
114                        "<marker latitude=\"~A\" longitude=\"~A\" file=\"~A\" title=\"~A\"/>"
115                        (car props)
116                        (cadr props)
117                        file
118                        (get-title path-in (svnwiki-make-pathname path file)))
119                stream-null)))
120          (list->stream
121            (directory (svnwiki-make-pathname path-in path)))))
122      (format #f "</markers>"))))
123
124;(svnwiki-extension-define 'update-notify 'googlemap googlemap-update)
125
126(define (edit-properties-location env property)
127  (let-from-environment env (path-in path)
128    (let ((id (random 10000))
129          (props (map (lambda (name)
130                        (svnwiki-repository-property-get
131                          (format #f "~A:~A" (stream->string property) name)
132                          (svnwiki-make-pathname path-in path)
133                          #f))
134                      '("latitude" "longitude"))))
135      (html-stream
136        (stream-concatenate
137          (list->stream
138            (map (lambda (name value)
139                   (html-stream
140                     ((input type "hidden"
141                             name (svnwiki-format #f "svnwiki-properties-~A:~A" property name)
142                             id (svnwiki-format #f "xsvnwiki-googlemap:~A:~A" name id)
143                             value (or value "")))))
144                 '("latitude" "longitude")
145                 props)))
146        ((div id (svnwiki-format #f "googlemap-~A" id) style "margin-top: 0px; padding-top: 0px; width: 100%;")
147         (let ((link (svnwiki-format #f "javascript:svnwikiGooglemap.editInitialize('~A', ~A~{, ~A~});"
148                                     property
149                                     id
150                                     (map (lambda (x) (or (and x (string->number x)) "null")) props))))
151           (if (every (conjoin identity string->number) props)
152             (html-stream
153               (format #f "Location: ~{~A~^, ~} (" props)
154               ((a href link) "modify")
155               ")")
156             (html-stream
157               "Unknown location ("
158               ((a href link) "set")
159               ")"))))))))
160
161(define (save-properties-location env property)
162  (any identity
163       ; Must call the map to force the evaluation of the whole thing:
164       (map (lambda (name)
165              (save-properties-simple env (svnwiki-format #f "~A:~A" property name)))
166            '("latitude" "longitude"))))
167
168(define (metadata-edit-type-register env)
169  (let-from-environment env (return)
170    (return `(googlemap-location ,edit-properties-location ,save-properties-location))))
171
172(svnwiki-extension-define 'metadata-edit-type-register 'googlemap metadata-edit-type-register)
173
174(define (html-head-data env)
175  (let-from-environment env (return)
176    (return
177      (html-stream
178        ((script src "http://maps.google.com/maps/api/js?sensor=false"
179                             ;(svnwiki-repository-property-get
180                               ;"svnwiki:googlemap:key"
181                               ;(svnwiki-repository-path env)
182                               ;"")
183                 type "text/javascript"))))))
184
185(svnwiki-extension-define 'html-head-data 'googlemap html-head-data)
Note: See TracBrowser for help on using the repository browser.