PageRenderTime 28ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 1ms

/sites/all/modules/contrib/gmap/js/overlay_edit.js

https://github.com/aakb/sport-aarhus-events
JavaScript | 378 lines | 329 code | 28 blank | 21 comment | 35 complexity | 45b5b725a0579f4a12579884cec6b4dc MD5 | raw file
  1. /* $Id: overlay_edit.js,v 1.3 2009/02/11 21:41:33 bdragon Exp $ */
  2. /**
  3. * @file
  4. * Gmap Overlay Editor
  5. */
  6. /*global $, Drupal, GEvent, GMarker, GPolygon, GPolyline */
  7. Drupal.gmap.addHandler('overlayedit_linestyle', function (elem) {
  8. var obj = this;
  9. obj.vars.styles.overlayline = [];
  10. var f = function () {
  11. var o = Number($(this).attr('id').match(/\d+$/));
  12. obj.vars.styles.overlayline[o] = this.value;
  13. };
  14. $(elem).find('input.gmap_style').change(f).each(f);
  15. });
  16. Drupal.gmap.addHandler('overlayedit_linestyle_apply', function (elem) {
  17. var obj = this;
  18. obj.vars.overlay_linestyle_apply = Boolean(elem.checked);
  19. $(elem).change(function () {
  20. obj.vars.overlay_linestyle_apply = Boolean(this.checked);
  21. });
  22. });
  23. Drupal.gmap.addHandler('overlayedit_polystyle', function (elem) {
  24. var obj = this;
  25. obj.vars.styles.overlaypoly = [];
  26. var f = function () {
  27. var o = Number($(this).attr('id').match(/\d+$/));
  28. obj.vars.styles.overlaypoly[o] = this.value;
  29. };
  30. $(elem).find('input.gmap_style').change(f).each(f);
  31. });
  32. Drupal.gmap.addHandler('overlayedit_polystyle_apply', function (elem) {
  33. var obj = this;
  34. obj.vars.overlay_polystyle_apply = Boolean(elem.checked);
  35. $(elem).change(function () {
  36. obj.vars.overlay_polystyle_apply = Boolean(this.checked);
  37. });
  38. });
  39. Drupal.gmap.addHandler('overlayedit_fillstroke_default', function (elem) {
  40. var obj = this;
  41. obj.vars._usedefaultfillstroke = Boolean(elem.checked);
  42. $(elem).change(function () {
  43. obj.vars._usedefaultfillstroke = Boolean(this.checked);
  44. alert(obj.vars._usedefaultfillstroke);
  45. });
  46. });
  47. Drupal.gmap.addHandler('overlayedit_mapclicktype', function (elem) {
  48. var obj = this;
  49. obj.vars.overlay_add_mode = elem.value;
  50. $(elem).change(function () {
  51. obj.vars.overlay_add_mode = elem.value;
  52. if (obj.temp_point) {
  53. delete obj.temp_point;
  54. }
  55. });
  56. });
  57. Drupal.gmap.addHandler('overlayedit_markerclicktype', function (elem) {
  58. var obj = this;
  59. obj.vars.overlay_del_mode = elem.value;
  60. $(elem).change(function () {
  61. obj.vars.overlay_del_mode = elem.value;
  62. });
  63. });
  64. Drupal.gmap.addHandler('gmap', function (elem) {
  65. var obj = this;
  66. // Add status bar
  67. var status = $(elem).after('<div class="gmap-statusbar">Status</div>').next();
  68. obj.statusdiv = status[0];
  69. obj.bind('buildmacro', function (add) {
  70. var temp, i, q, tm, ct;
  71. var style_line = function (n) {
  72. if (!n.style.length) {
  73. return '';
  74. }
  75. var style = n.style.slice(0, 3);
  76. style[0] = '#' + style[0];
  77. return style.join('/') + ':';
  78. };
  79. var style_poly = function (n) {
  80. if (!n.style.length) {
  81. return '';
  82. }
  83. var style = n.style.slice();
  84. style[0] = '#' + style[0];
  85. style[3] = '#' + style[3];
  86. return style.join('/') + ':';
  87. };
  88. var feature_dump = function (n) {
  89. var f = n.overlay;
  90. var tmp = [];
  91. var i, ct, vtx;
  92. ct = f.getVertexCount();
  93. for (i = 0; i < ct; i++) {
  94. vtx = f.getVertex(i);
  95. tmp.push('' + vtx.lat() + ',' + vtx.lng());
  96. }
  97. return tmp.join(' + ');
  98. };
  99. if (obj._oe && obj._oe.features) {
  100. var polygons = [];
  101. var polylines = [];
  102. var circles = [];
  103. var markers = {};
  104. $.each(obj._oe.features, function (i, n) {
  105. if (n.type) {
  106. switch (n.type) {
  107. case 'polyline':
  108. add.push('line=' + style_line(n) + feature_dump(n));
  109. break;
  110. case 'polygon':
  111. add.push('polygon=' + style_poly(n) + feature_dump(n));
  112. break;
  113. case 'point':
  114. if (!markers[n.marker]) {
  115. markers[n.marker] = [];
  116. }
  117. var pt = n.overlay.getLatLng();
  118. var ptxt = '';
  119. if (n.html) {
  120. ptxt = ':' + n.html;
  121. }
  122. markers[n.marker].push('' + pt.lat() + ',' + pt.lng() + ptxt);
  123. break;
  124. case 'circle':
  125. add.push('circle=' + style_poly(n) + n.center.lat() + ' , ' + n.center.lng() + ' + ' + n.radius / 1000);
  126. break;
  127. }
  128. }
  129. });
  130. $.each(markers, function (i, n) {
  131. add.push('markers=' + i + '::' + n.join(' + '));
  132. });
  133. }
  134. });
  135. });
  136. Drupal.gmap.map.prototype.statusdiv = undefined;
  137. Drupal.gmap.map.prototype.status = function (text) {
  138. var obj = this;
  139. if (obj.statusdiv) {
  140. $(obj.statusdiv).html(text);
  141. }
  142. };
  143. // Extend markers to store type info.
  144. GMarker.prototype.gmapMarkerData = function (data) {
  145. if (data) {
  146. this._gmapdata = data;
  147. }
  148. return this._gmapdata;
  149. };
  150. /************* Overlay edit widget ******************/
  151. Drupal.gmap.addHandler('overlayedit', function (elem) {
  152. var obj = this;
  153. var binding = obj.bind('overlay_edit_mode', function () {
  154. // @@@
  155. });
  156. $(elem).change(function () {
  157. obj.vars.overlay_next_icon = elem.value;
  158. // obj.vars.overlay_edit_mode = elem.value;
  159. // obj.change('overlay_edit_mode',binding);
  160. });
  161. obj.bind('init', function () {
  162. obj._oe = {};
  163. obj.vars.overlay_add_mode = 'Points'; //elem.value;
  164. obj.vars.overlay_del_mode = 'Remove';
  165. var edit_text_elem;
  166. if (obj.map) {
  167. obj._oe.features = [];
  168. obj._oe.featuresRef = {};
  169. obj._oe.editing = false;
  170. obj._oe.markerseq = {};
  171. GEvent.addListener(obj.map, 'click', function (overlay, point) {
  172. var ctx, s, p;
  173. if (overlay) {
  174. if (obj._oe.editing) {
  175. // Work around problem where double clicking to finish a poly fires a click event.
  176. obj._oe.editing = false;
  177. }
  178. else {
  179. }
  180. }
  181. else if (point && !obj._oe.editing) {
  182. obj._oe.editing = true;
  183. switch (obj.vars.overlay_add_mode) {
  184. case 'Points':
  185. var m = elem.value; // @@@ It's kinda silly to be binding the whole shebang to this dropdown..
  186. if (!obj._oe.markerseq.hasOwnProperty(m)) {
  187. obj._oe.markerseq[m] = -1;
  188. }
  189. obj._oe.markerseq[m] = obj._oe.markerseq[m] + 1;
  190. p = new GMarker(point, {icon: Drupal.gmap.getIcon(m, obj._oe.markerseq[m])});
  191. obj.map.addOverlay(p);
  192. ctx = {
  193. 'type' : 'point',
  194. 'marker' : m,
  195. 'overlay' : p
  196. };
  197. var offset = obj._oe.features.push(ctx) - 1;
  198. obj._oe.editing = false;
  199. GEvent.addListener(p, "click", function () {
  200. switch (obj.vars.overlay_del_mode) {
  201. case 'Remove':
  202. obj._oe.markerseq[m] = obj._oe.markerseq[m] - 1;
  203. ctx.type = 'deleted';
  204. obj.map.removeOverlay(p);
  205. ctx.overlay = null;
  206. var tmpcnt = 0;
  207. // Renumber markers in set.
  208. $.each(obj._oe.features, function (i, n) {
  209. if (n.type && n.type === 'point' && n.marker === m) {
  210. var pt = n.overlay.getLatLng();
  211. n.overlay.setImage(Drupal.gmap.getIcon(n.marker, tmpcnt).image);
  212. tmpcnt = tmpcnt + 1;
  213. }
  214. });
  215. break;
  216. case 'Edit info':
  217. // @@@
  218. break;
  219. }
  220. obj.change('mapedited', -1);
  221. });
  222. obj.change('mapedited', -1);
  223. break;
  224. case 'Lines':
  225. ctx = {
  226. 'type' : 'polyline',
  227. 'style' : [],
  228. 'overlay' : null
  229. };
  230. s = obj.vars.styles.line_default;
  231. if (obj.vars.overlay_linestyle_apply) {
  232. ctx.style = obj.vars.styles.overlayline.slice();
  233. s = ctx.style;
  234. }
  235. p = new GPolyline([point], '#' + s[0], Number(s[1]), s[2] / 100);
  236. obj.map.addOverlay(p);
  237. ctx.overlay = p;
  238. obj._oe.featuresRef[p] = obj._oe.features.push(ctx) - 1;
  239. p.enableDrawing();
  240. p.enableEditing({onEvent: "mouseover"});
  241. p.disableEditing({onEvent: "mouseout"});
  242. GEvent.addListener(p, "endline", function () {
  243. //obj._oe.editing = false;
  244. GEvent.addListener(p, "lineupdated", function () {
  245. obj.change('mapedited', -1);
  246. });
  247. GEvent.addListener(p, "click", function (latlng, index) {
  248. if (typeof index === "number") {
  249. // Delete vertex on click.
  250. p.deleteVertex(index);
  251. }
  252. else {
  253. var feature = obj._oe.features[obj._oe.featuresRef[p]];
  254. feature.stroke = obj.vars.stroke; // @@@
  255. p.setStrokeStyle(feature.stroke);
  256. }
  257. });
  258. obj.change('mapedited', -1);
  259. });
  260. break;
  261. case 'GPolygon':
  262. ctx = {
  263. 'type' : 'polygon',
  264. 'style' : [],
  265. 'overlay' : null
  266. };
  267. s = obj.vars.styles.poly_default;
  268. if (obj.vars.overlay_polystyle_apply) {
  269. ctx.style = obj.vars.styles.overlaypoly.slice();
  270. s = ctx.style;
  271. }
  272. p = new GPolygon([point], '#' + s[0], Number(s[1]), s[2] / 100, '#' + s[3], s[4] / 100);
  273. obj.map.addOverlay(p);
  274. ctx.overlay = p;
  275. obj._oe.featuresRef[p] = obj._oe.features.push(ctx) - 1;
  276. p.enableDrawing();
  277. p.enableEditing({onEvent: "mouseover"});
  278. p.disableEditing({onEvent: "mouseout"});
  279. GEvent.addListener(p, "endline", function () {
  280. //obj._oe.editing = false;
  281. GEvent.addListener(p, "lineupdated", function () {
  282. obj.change('mapedited', -1);
  283. });
  284. GEvent.addListener(p, "click", function (latlng, index) {
  285. if (typeof index === "number") {
  286. p.deleteVertex(index);
  287. }
  288. else {
  289. var feature = obj._oe.features[obj._oe.featuresRef[p]];
  290. feature.stroke = obj.vars.stroke;
  291. feature.fill = obj.vars.fill;
  292. p.setStrokeStyle(feature.stroke);
  293. p.setFillStyle(feature.fill); // @@@
  294. }
  295. });
  296. obj.change('mapedited', -1);
  297. });
  298. break;
  299. case 'Circles':
  300. var temppoint = point;
  301. // @@@ Translate
  302. obj.status("Drawing circle. Click a point on the rim to place.");
  303. var handle = GEvent.addListener(obj.map, 'click', function (overlay, point) {
  304. if (point) {
  305. var ctx = {
  306. 'type' : 'circle',
  307. 'center' : temppoint,
  308. 'radius' : null,
  309. 'style' : [],
  310. 'overlay' : null
  311. };
  312. var s = obj.vars.styles.poly_default;
  313. if (obj.vars.overlay_polystyle_apply) {
  314. ctx.style = obj.vars.styles.overlaypoly.slice();
  315. s = ctx.style;
  316. }
  317. obj.status("Placed circle. Radius was " + temppoint.distanceFrom(point) / 1000 + " km.");
  318. ctx.radius = temppoint.distanceFrom(point);
  319. var p = new GPolygon(obj.poly.calcPolyPoints(ctx.center, ctx.radius, 32), '#' + s[0], Number(s[1]), s[2] / 100, '#' + s[3], s[4] / 100);
  320. obj.map.addOverlay(p);
  321. ctx.overlay = p;
  322. obj._oe.featuresRef[p] = obj._oe.features.push(ctx) - 1;
  323. GEvent.addListener(p, "click", function () {
  324. switch (obj.vars.overlay_del_mode) {
  325. case 'Remove':
  326. ctx.type = 'deleted';
  327. obj.map.removeOverlay(p);
  328. ctx.overlay = null;
  329. break;
  330. case 'Edit info':
  331. // @@@
  332. break;
  333. }
  334. obj.change('mapedited', -1);
  335. });
  336. }
  337. else {
  338. // @@@ Uh, do cleanup I suppose..
  339. }
  340. obj._oe.editing = false;
  341. GEvent.removeListener(handle);
  342. obj.change('mapedited', -1);
  343. });
  344. break;
  345. }
  346. }
  347. });
  348. }
  349. });
  350. });