/pigeoncms/Plugins/fckeditor/editor/plugins/googlemaps/dialog/polyline.js

http://pigeoncms.googlecode.com/ · JavaScript · 335 lines · 251 code · 73 blank · 11 comment · 39 complexity · 39a8aa1993c7dd8c1d5ec6e17951c86a MD5 · raw file

  1. var points = [];
  2. var highlighted_marker = null;
  3. var point_markers = [];
  4. var currentIndex = -1;
  5. // Returns the index of the marker in the polyline.
  6. function findMarkerIndex(point_marker) {
  7. var index = -1;
  8. for (var i = 0; i < point_markers.length; ++i) {
  9. if (point_markers[i] == point_marker) {
  10. index = i;
  11. break;
  12. }
  13. }
  14. return index;
  15. }
  16. // Creates a point and adds it to both the polyline and the list.
  17. function createPoint(lat, lng, pLevel) {
  18. var newPoint = {
  19. lat: lat,
  20. lon: lng,
  21. Level: pLevel
  22. };
  23. if (currentIndex>-1)
  24. points.splice(currentIndex+1, 0, newPoint) ;
  25. else
  26. points.push(newPoint);
  27. var point_marker = createPointMarker(new GLatLng(lat, lng), false);
  28. point_marker.focusable = true ; // To signal that the map must get the focus.
  29. map.addOverlay(point_marker);
  30. if (currentIndex>-1)
  31. point_markers.splice(currentIndex+1, 0, point_marker) ;
  32. else
  33. point_markers.push(point_marker);
  34. highlight(currentIndex+1);
  35. }
  36. // Creates a marker representing a point in the polyline.
  37. function createPointMarker(point, highlighted) {
  38. var clr = highlighted ? "yellow" : "blue";
  39. var point_marker = createColorMarker(point, clr);
  40. GEvent.addListener(point_marker, "drag", function() {
  41. var index = findMarkerIndex(point_marker);
  42. if (index >= 0) {
  43. var nLat = point_marker.getPoint().lat();
  44. var nLng = point_marker.getPoint().lng();
  45. var pLevel = points[index].Level;
  46. var modifiedPoint = {
  47. lat: nLat,
  48. lon: nLng,
  49. Level: pLevel
  50. };
  51. points[index] = modifiedPoint;
  52. createEncodings();
  53. }
  54. });
  55. GEvent.addListener(point_marker, "click", function() {
  56. highlight(findMarkerIndex(point_marker));
  57. });
  58. return point_marker;
  59. }
  60. // Highlights the point specified by index in both the map and the point list.
  61. function highlight(index) {
  62. if (point_markers[index] != null
  63. && point_markers[index] != highlighted_marker) {
  64. map.removeOverlay(point_markers[index]);
  65. }
  66. if (highlighted_marker != null) {
  67. var oldIndex = findMarkerIndex(highlighted_marker);
  68. map.removeOverlay(highlighted_marker);
  69. if (oldIndex != index) {
  70. point_markers[oldIndex]
  71. = createPointMarker(highlighted_marker.getPoint(), false);
  72. map.addOverlay(point_markers[oldIndex]);
  73. }
  74. }
  75. highlighted_marker = createPointMarker(point_markers[index].getPoint(),
  76. true);
  77. point_markers[index] = highlighted_marker;
  78. map.addOverlay(highlighted_marker);
  79. currentIndex = index ;
  80. }
  81. // Encode a signed number in the encode format.
  82. function encodeSignedNumber(num) {
  83. var sgn_num = num << 1;
  84. if (num < 0) {
  85. sgn_num = ~(sgn_num);
  86. }
  87. return(encodeNumber(sgn_num));
  88. }
  89. // Encode an unsigned number in the encode format.
  90. function encodeNumber(num) {
  91. var encodeString = "";
  92. while (num >= 0x20) {
  93. encodeString += (String.fromCharCode((0x20 | (num & 0x1f)) + 63));
  94. num >>= 5;
  95. }
  96. encodeString += (String.fromCharCode(num + 63));
  97. return encodeString;
  98. }
  99. // Delete a point from the polyline.
  100. function deletePoint() {
  101. if (points.length > 0) {
  102. var point_index = currentIndex;
  103. if (point_index >= 0 && point_index < points.length) {
  104. points.splice(point_index, 1);
  105. if (highlighted_marker == point_markers[point_index]) {
  106. highlighted_marker = null;
  107. currentIndex=-1;
  108. }
  109. map.removeOverlay(point_markers[point_index]);
  110. point_markers.splice(point_index, 1);
  111. createEncodings();
  112. }
  113. if (points.length > 0) {
  114. if (point_index == 0) {
  115. point_index++;
  116. }
  117. highlight(point_index - 1);
  118. }
  119. }
  120. }
  121. // Create the encoded polyline and level strings.
  122. function createEncodings() {
  123. if (points.length==0)
  124. {
  125. document.getElementById('encodedLevels').value = '';
  126. document.getElementById('encodedPolyline').value = '';
  127. if (document.overlay) {
  128. map.removeOverlay(document.overlay);
  129. }
  130. return;
  131. }
  132. var encoded_levels='';
  133. var encoded_points='';
  134. var vZoom, vLevels;
  135. vLevels = 4;
  136. vZoom = 32;
  137. var plat = 0;
  138. var plng = 0;
  139. for(var i = 0; i < points.length; ++i) {
  140. var point = points[i];
  141. var lat = point.lat;
  142. var lng = point.lon;
  143. var level = point.Level;
  144. var late5 = Math.floor(lat * 1e5);
  145. var lnge5 = Math.floor(lng * 1e5);
  146. dlat = late5 - plat;
  147. dlng = lnge5 - plng;
  148. plat = late5;
  149. plng = lnge5;
  150. encoded_points += encodeSignedNumber(dlat) + encodeSignedNumber(dlng);
  151. encoded_levels += encodeNumber(level);
  152. }
  153. document.getElementById('encodedLevels').value = encoded_levels.replace(/\\/g, "\\\\");
  154. document.getElementById('encodedPolyline').value = encoded_points.replace(/\\/g, "\\\\");
  155. if (document.overlay) {
  156. map.removeOverlay(document.overlay);
  157. }
  158. if (points.length > 1) {
  159. document.overlay = GPolyline.fromEncoded({color: "#3333cc",
  160. weight: 5,
  161. points: encoded_points,
  162. zoomFactor: vZoom,
  163. levels: encoded_levels,
  164. numLevels: vLevels
  165. });
  166. map.addOverlay(document.overlay);
  167. }
  168. }
  169. // Decode an encoded polyline into a list of lat/lng tuples.
  170. function decodeLine (encoded) {
  171. var len = encoded.length;
  172. var index = 0;
  173. var array = [];
  174. var lat = 0;
  175. var lng = 0;
  176. while (index < len) {
  177. var b;
  178. var shift = 0;
  179. var result = 0;
  180. do {
  181. b = encoded.charCodeAt(index++) - 63;
  182. result |= (b & 0x1f) << shift;
  183. shift += 5;
  184. } while (b >= 0x20);
  185. var dlat = ((result & 1) ? ~(result >> 1) : (result >> 1));
  186. lat += dlat;
  187. shift = 0;
  188. result = 0;
  189. do {
  190. b = encoded.charCodeAt(index++) - 63;
  191. result |= (b & 0x1f) << shift;
  192. shift += 5;
  193. } while (b >= 0x20);
  194. var dlng = ((result & 1) ? ~(result >> 1) : (result >> 1));
  195. lng += dlng;
  196. array.push([lat * 1e-5, lng * 1e-5]);
  197. }
  198. return array;
  199. }
  200. // Decode an encoded levels string into a list of levels.
  201. function decodeLevels(encoded) {
  202. var levels = [];
  203. for (var pointIndex = 0; pointIndex < encoded.length; ++pointIndex) {
  204. var pointLevel = encoded.charCodeAt(pointIndex) - 63;
  205. levels.push(pointLevel);
  206. }
  207. return levels;
  208. }
  209. // Decode the supplied encoded polyline and levels.
  210. function decodePolyline() {
  211. var encoded_points = document.getElementById('encodedPolyline').value;
  212. encoded_points = encoded_points.replace(/\\\\/g, "\\");
  213. if (encoded_points.length==0) {
  214. return;
  215. }
  216. var enc_points = decodeLine(encoded_points);
  217. if (enc_points.length==0) {
  218. return;
  219. }
  220. points = [];
  221. for (var i = 0; i < enc_points.length; ++i) {
  222. createPoint(enc_points[i][0], enc_points[i][1], 3);
  223. }
  224. createEncodings();
  225. }
  226. function ShowLinePoints()
  227. {
  228. if (points.length==0)
  229. return;
  230. for (var i=0; i<points.length ; i++)
  231. {
  232. var point = points[i] ;
  233. var point_marker = createPointMarker(new GLatLng(point.lat, point.lon), false);
  234. map.addOverlay(point_marker);
  235. point_markers.push(point_marker);
  236. }
  237. highlight(points.length-1);
  238. }
  239. function HideLinePoints()
  240. {
  241. for (var i=point_markers.length -1;i>=0 ; i--)
  242. {
  243. map.removeOverlay(point_markers[i]);
  244. }
  245. point_markers = [] ;
  246. highlighted_marker = null;
  247. currentIndex=-1;
  248. }
  249. function createColorMarker(point, color) {
  250. var f = new GIcon();
  251. f.image = "http://labs.google.com/ridefinder/images/mm_20_" + color
  252. + ".png";
  253. f.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
  254. f.iconSize = new GSize(12,20);
  255. f.shadowSize = new GSize(22,20);
  256. f.iconAnchor = new GPoint(6,20);
  257. f.infoWindowAnchor = new GPoint(6,1);
  258. f.infoShadowAnchor = new GPoint(13,13);
  259. newMarker = new GMarker(point,
  260. {icon: f, draggable: true});
  261. return newMarker;
  262. }