PageRenderTime 73ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 1ms

/public/javascripts/app/home.js

https://bitbucket.org/ilab/share_gateway_dyrm
JavaScript | 6885 lines | 5412 code | 989 blank | 484 comment | 412 complexity | afa3634176114ef198ff0b14bf34698e MD5 | raw file
Possible License(s): GPL-3.0, LGPL-2.1
  1. GoogleMapApi = Service.GoogleMapApi = function() {
  2. this.map = null;
  3. this.bounds = new google.maps.LatLngBounds();
  4. this.infoWindow = new google.maps.InfoWindow();
  5. this.markers = [];
  6. this.markerCluster = null;
  7. };
  8. GoogleMapApi.DEFAULT_LAT = 12.565679;
  9. GoogleMapApi.DEFAULT_LNG = 104.990963
  10. GoogleMapApi.ZOOM_LEVEL = 7;
  11. GoogleMapApi.MAX_ZOOM_LEVEL = 14;
  12. GoogleMapApi.prototype.initializeMap = function(canvas) {
  13. var latlng = new google.maps.LatLng(GoogleMapApi.DEFAULT_LAT, GoogleMapApi.DEFAULT_LNG);
  14. var myOptions = {
  15. zoom: GoogleMapApi.ZOOM_LEVEL,
  16. center: latlng,
  17. mapTypeId: google.maps.MapTypeId.ROADMAP
  18. };
  19. this.map = new google.maps.Map(canvas, myOptions);
  20. var mcOptions = {gridSize: 60, maxZoom:14, zoomOnClick:true };
  21. this.markerCluster = new MarkerClusterer(this.map,this.markers,mcOptions); };
  22. GoogleMapApi.prototype.createMarker = function(optionData){
  23. var latLng = this.newLatLng(optionData.lat, optionData.lng);
  24. var option = optionData;
  25. option.position = latLng;
  26. this._calculateBounds(latLng);
  27. marker = new google.maps.Marker(option);
  28. this.markerCluster.addMarker(marker);
  29. return marker;
  30. };
  31. GoogleMapApi.prototype.refresh = function(){
  32. this.markerclusterer.redraw();
  33. };
  34. GoogleMapApi.prototype.createDraggableMarker = function(title, lat, lng, icon){
  35. var latLng = this.newLatLng(lat, lng);
  36. var option = {
  37. position: latLng,
  38. title: title,
  39. map: this.map,
  40. icon:icon,
  41. draggable:true
  42. };
  43. marker = new google.maps.Marker(option);
  44. return marker;
  45. };
  46. GoogleMapApi.prototype._calculateBounds = function(latLng){
  47. this.bounds.extend(latLng);
  48. };
  49. GoogleMapApi.prototype.fitBounds = function(){
  50. this.map.fitBounds(this.bounds);
  51. var zoomLevel = this.map.getZoom();
  52. if(zoomLevel > GoogleMapApi.MAX_ZOOM_LEVEL){
  53. this.map.setZoom(GoogleMapApi.MAX_ZOOM_LEVEL);
  54. this.bounds = this.map.getBounds();
  55. }
  56. };
  57. GoogleMapApi.prototype.newLatLng = function(lat, lng){
  58. return new google.maps.LatLng(lat, lng);
  59. };
  60. GoogleMapApi.prototype.setMarkerPosition = function(marker, latLng) {
  61. marker.setPosition(latLng);
  62. };
  63. GoogleMapApi.prototype.addMarkerClickListener = function(marker, data, handler){
  64. google.maps.event.addListener(marker, 'click', function() {
  65. handler(data);
  66. });
  67. };
  68. GoogleMapApi.prototype.addMapClickListener = function(e){
  69. google.maps.event.addListener(this.map, 'click', function(point) {
  70. e.click(point.latLng.lat(), point.latLng.lng());
  71. });
  72. };
  73. GoogleMapApi.prototype.moveMarkerTo = function(marker, lat, lng){
  74. marker.setMap(this.map);
  75. marker.setPosition(this.newLatLng(lat, lng));
  76. return marker;
  77. };
  78. GoogleMapApi.prototype.removeMarker = function(marker){
  79. marker.setMap(null);
  80. };
  81. GoogleMapApi.prototype.setIcon = function(marker, icon){
  82. if(icon)
  83. marker.setIcon(icon);
  84. };
  85. GoogleMapApi.prototype.setShadow = function(marker, imageUrl){
  86. var shadow = new google.maps.MarkerImage(imageUrl, null, null, new google.maps.Point(16, 32));
  87. marker.setShadow(shadow);
  88. };
  89. GoogleMapApi.prototype.addListener = function(obj, eventName, handler){
  90. google.maps.event.addListener(obj, eventName, handler);
  91. };
  92. GoogleMapApi.prototype.addMarkerClickListener = function(marker, data, handler){
  93. google.maps.event.addListener(marker, 'click', function(){
  94. handler(data);
  95. });
  96. };
  97. GoogleMapApi.prototype.setMarkerDraggability = function(marker,draggability){
  98. marker.setDraggable(draggability);
  99. };
  100. GoogleMapApi.prototype.getAllMarkers = function(){
  101. return this.markers;
  102. };
  103. GoogleMapApi.prototype.clearAllMarkers = function(){
  104. this.markerCluster.clearMarkers();
  105. };
  106. GoogleMapApi.prototype.attachDataToMarker = function(marker,key,value){
  107. if(!marker.data)
  108. marker.data={};
  109. marker.data[key]=value;
  110. };
  111. GoogleMapApi.prototype.processMarkerVisibility = function(){
  112. this.markerCluster.processMarkersVisibility(true);
  113. };
  114. GoogleMapApi.prototype.updateMarkerClusterer = function(resource,redraw){
  115. var markers = this.markerCluster.getMarkers();
  116. var tempMarker = null;
  117. for(var i=0; i< markers.length; i++){
  118. if(markers[i].id == resource.id ){
  119. var latLng = this.newLatLng(resource.lat, resource.lng);
  120. markers[i].setPosition(latLng);
  121. if(redraw)
  122. this.markerCluster.processMarkersVisibility(true);
  123. return true;
  124. }
  125. }
  126. return false;
  127. };
  128. GoogleMapApi.prototype.getCenter = function(){
  129. return this.map.getCenter();
  130. };
  131. GoogleMapApi.prototype.setCenter = function(latLng){
  132. return this.map.panTo(latLng);
  133. };
  134. GoogleMapApi.prototype.setZoom = function(level){
  135. return this.map.setZoom(level);
  136. };
  137. GoogleMapApi.prototype.getMap = function(){
  138. return this.map;
  139. };
  140. /**
  141. * @name MarkerClusterer for Google Maps v3
  142. * @version version 1.0
  143. * @author Luke Mahe
  144. * @fileoverview
  145. * The library creates and manages per-zoom-level clusters for large amounts of
  146. * markers.
  147. * <br/>
  148. * This is a v3 implementation of the
  149. * <a href="http://gmaps-utility-library-dev.googlecode.com/svn/tags/markerclusterer/"
  150. * >v2 MarkerClusterer</a>.
  151. */
  152. /**
  153. * Licensed under the Apache License, Version 2.0 (the "License");
  154. * you may not use this file except in compliance with the License.
  155. * You may obtain a copy of the License at
  156. *
  157. * http://www.apache.org/licenses/LICENSE-2.0
  158. *
  159. * Unless required by applicable law or agreed to in writing, software
  160. * distributed under the License is distributed on an "AS IS" BASIS,
  161. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  162. * See the License for the specific language governing permissions and
  163. * limitations under the License.
  164. */
  165. /**
  166. * A Marker Clusterer that clusters markers.
  167. *
  168. * @param {google.maps.Map} map The Google map to attach to.
  169. * @param {Array.<google.maps.Marker>} opt_markers Optional markers to add to
  170. * the cluster.
  171. * @param {Object} opt_options support the following options:
  172. * 'gridSize': (number) The grid size of a cluster in pixels.
  173. * 'maxZoom': (number) The maximum zoom level that a marker can be part of a
  174. * cluster.
  175. * 'zoomOnClick': (boolean) Whether the default behaviour of clicking on a
  176. * cluster is to zoom into it.
  177. * 'averageCenter': (boolean) Wether the center of each cluster should be
  178. * the average of all markers in the cluster.
  179. * 'styles': (object) An object that has style properties:
  180. * 'url': (string) The image url.
  181. * 'height': (number) The image height.
  182. * 'width': (number) The image width.
  183. * 'anchor': (Array) The anchor position of the label text.
  184. * 'textColor': (string) The text color.
  185. * 'textSize': (number) The text size.
  186. * @constructor
  187. * @extends google.maps.OverlayView
  188. */
  189. function MarkerClusterer(map, opt_markers, opt_options) {
  190. this.extend(MarkerClusterer, google.maps.OverlayView);
  191. this.map_ = map;
  192. /**
  193. * @type {Array.<google.maps.Marker>}
  194. * @private
  195. */
  196. this.markers_ = [];
  197. /**
  198. * @type {Array.<Cluster>}
  199. */
  200. this.clusters_ = [];
  201. this.sizes = [53, 56, 66, 78, 90];
  202. /**
  203. * @private
  204. */
  205. this.styles_ = [];
  206. /**
  207. * @type {boolean}
  208. * @private
  209. */
  210. this.ready_ = false;
  211. var options = opt_options || {};
  212. /**
  213. * @type {number}
  214. * @private
  215. */
  216. this.gridSize_ = options['gridSize'] || 60;
  217. /**
  218. * @type {?number}
  219. * @private
  220. */
  221. this.maxZoom_ = options['maxZoom'] || 20;
  222. this.styles_ = options['styles'] || [];
  223. /**
  224. * @type {string}
  225. * @private
  226. */
  227. this.imagePath_ = options['imagePath'] ||
  228. this.MARKER_CLUSTER_IMAGE_PATH_;
  229. /**
  230. * @type {string}
  231. * @private
  232. */
  233. this.imageExtension_ = options['imageExtension'] ||
  234. this.MARKER_CLUSTER_IMAGE_EXTENSION_;
  235. /**
  236. * @type {boolean}
  237. * @private
  238. */
  239. this.zoomOnClick_ = true;
  240. if (options['zoomOnClick'] != undefined) {
  241. this.zoomOnClick_ = options['zoomOnClick'];
  242. }
  243. /**
  244. * @type {boolean}
  245. * @private
  246. */
  247. this.averageCenter_ = false;
  248. if (options['averageCenter'] != undefined) {
  249. this.averageCenter_ = options['averageCenter'];
  250. }
  251. this.setupStyles_();
  252. this.setMap(map);
  253. /**
  254. * @type {number}
  255. * @private
  256. */
  257. this.prevZoom_ = this.map_.getZoom();
  258. var that = this;
  259. google.maps.event.addListener(this.map_, 'zoom_changed', function() {
  260. var maxZoom = that.map_.mapTypes[that.map_.getMapTypeId()].maxZoom;
  261. var zoom = that.map_.getZoom();
  262. if (zoom < 0 || zoom > maxZoom) {
  263. return;
  264. }
  265. if (that.prevZoom_ != zoom) {
  266. that.prevZoom_ = that.map_.getZoom();
  267. if(zoom > that.maxZoom_)
  268. that.resetViewport(); //Ilab modification default behavior
  269. else
  270. that.processMarkersVisibility();
  271. }
  272. });
  273. google.maps.event.addListener(this.map_, 'idle', function() {
  274. that.redraw();
  275. });
  276. if (opt_markers && opt_markers.length) {
  277. this.addMarkers(opt_markers, false);
  278. }
  279. }
  280. /**
  281. * The marker cluster image path.
  282. *
  283. * @type {string}
  284. * @private
  285. */
  286. MarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_PATH_ = SETTING.WEBROOT + 'images/clusterer/m';
  287. /**
  288. * The marker cluster image path.
  289. *
  290. * @type {string}
  291. * @private
  292. */
  293. MarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_EXTENSION_ = 'png';
  294. /**
  295. * Extends a objects prototype by anothers.
  296. *
  297. * @param {Object} obj1 The object to be extended.
  298. * @param {Object} obj2 The object to extend with.
  299. * @return {Object} The new extended object.
  300. * @ignore
  301. */
  302. MarkerClusterer.prototype.extend = function(obj1, obj2) {
  303. return (function(object) {
  304. for (property in object.prototype) {
  305. this.prototype[property] = object.prototype[property];
  306. }
  307. return this;
  308. }).apply(obj1, [obj2]);
  309. };
  310. /**
  311. * Implementaion of the interface method.
  312. * @ignore
  313. */
  314. MarkerClusterer.prototype.onAdd = function() {
  315. this.setReady_(true);
  316. };
  317. /**
  318. * Implementaion of the interface method.
  319. * @ignore
  320. */
  321. MarkerClusterer.prototype.draw = function() {};
  322. /**
  323. * Sets up the styles object.
  324. *
  325. * @private
  326. */
  327. MarkerClusterer.prototype.setupStyles_ = function() {
  328. if (this.styles_.length) {
  329. return;
  330. }
  331. for (var i = 0, size; size = this.sizes[i]; i++) {
  332. this.styles_.push({
  333. url: this.imagePath_ + (i + 1) + '.' + this.imageExtension_,
  334. height: size,
  335. width: size
  336. });
  337. }
  338. };
  339. /**
  340. * Sets the styles.
  341. *
  342. * @param {Object} styles The style to set.
  343. */
  344. MarkerClusterer.prototype.setStyles = function(styles) {
  345. this.styles_ = styles;
  346. };
  347. /**
  348. * Gets the styles.
  349. *
  350. * @return {Object} The styles object.
  351. */
  352. MarkerClusterer.prototype.getStyles = function() {
  353. return this.styles_;
  354. };
  355. /**
  356. * Whether zoom on click is set.
  357. *
  358. * @return {boolean} True if zoomOnClick_ is set.
  359. */
  360. MarkerClusterer.prototype.isZoomOnClick = function() {
  361. return this.zoomOnClick_;
  362. };
  363. /**
  364. * Whether average center is set.
  365. *
  366. * @return {boolean} True if averageCenter_ is set.
  367. */
  368. MarkerClusterer.prototype.isAverageCenter = function() {
  369. return this.averageCenter_;
  370. };
  371. /**
  372. * Returns the array of markers in the clusterer.
  373. *
  374. * @return {Array.<google.maps.Marker>} The markers.
  375. */
  376. MarkerClusterer.prototype.getMarkers = function() {
  377. return this.markers_;
  378. };
  379. /**
  380. * Returns the array of markers in the clusterer.
  381. *
  382. * @return {Array.<google.maps.Marker>} The number of markers.
  383. */
  384. MarkerClusterer.prototype.getTotalMarkers = function() {
  385. return this.markers_;
  386. };
  387. MarkerClusterer.prototype.processMarkersVisibility = function(redraw) {
  388. var markers = this.getMarkers(); // 10 marker.isAdd ==
  389. this.resetViewport();
  390. var data = this.getData(); // data = {1:false,2:false}
  391. if(data){
  392. for(var i=0;i<markers.length;i++){
  393. for(var layer_id in data){
  394. var visible = data[layer_id];
  395. if(markers[i].layer_id == layer_id && visible==false){
  396. markers[i].isAdded = true;
  397. }
  398. }
  399. }
  400. }
  401. if(redraw)
  402. this.redraw();
  403. };
  404. MarkerClusterer.prototype.setData = function(data) {
  405. this.data = data;
  406. };
  407. MarkerClusterer.prototype.getData = function() {
  408. var data = Util.Cookies.getAsObject("activeLayers");
  409. var interestedLayers = {};
  410. for(var layer_id in data){
  411. if(data[layer_id]==false)
  412. interestedLayers[layer_id] = false;
  413. }
  414. return interestedLayers;
  415. };
  416. /**
  417. * Sets the max zoom for the clusterer.
  418. *
  419. * @param {number} maxZoom The max zoom level.
  420. */
  421. MarkerClusterer.prototype.setMaxZoom = function(maxZoom) {
  422. this.maxZoom_ = maxZoom;
  423. };
  424. /**
  425. * Gets the max zoom for the clusterer.
  426. *
  427. * @return {number} The max zoom level.
  428. */
  429. MarkerClusterer.prototype.getMaxZoom = function() {
  430. return this.maxZoom_ || this.map_.mapTypes[this.map_.getMapTypeId()].maxZoom;
  431. };
  432. /**
  433. * The function for calculating the cluster icon image.
  434. *
  435. * @param {Array.<google.maps.Marker>} markers The markers in the clusterer.
  436. * @param {number} numStyles The number of styles available.
  437. * @return {Object} A object properties: 'text' (string) and 'index' (number).
  438. * @private
  439. */
  440. MarkerClusterer.prototype.calculator_ = function(markers, numStyles) {
  441. var index = 0;
  442. var count = markers.length;
  443. var dv = count;
  444. while (dv !== 0) {
  445. dv = parseInt(dv / 10, 10);
  446. index++;
  447. }
  448. index = Math.min(index, numStyles);
  449. return {
  450. text: count,
  451. index: index
  452. };
  453. };
  454. /**
  455. * Set the calculator function.
  456. *
  457. * @param {function(Array, number)} calculator The function to set as the
  458. * calculator. The function should return a object properties:
  459. * 'text' (string) and 'index' (number).
  460. *
  461. */
  462. MarkerClusterer.prototype.setCalculator = function(calculator) {
  463. this.calculator_ = calculator;
  464. };
  465. /**
  466. * Get the calculator function.
  467. *
  468. * @return {function(Array, number)} the calculator function.
  469. */
  470. MarkerClusterer.prototype.getCalculator = function() {
  471. return this.calculator_;
  472. };
  473. /**
  474. * Add an array of markers to the clusterer.
  475. *
  476. * @param {Array.<google.maps.Marker>} markers The markers to add.
  477. * @param {boolean} opt_nodraw Whether to redraw the clusters.
  478. */
  479. MarkerClusterer.prototype.addMarkers = function(markers, opt_nodraw) {
  480. for (var i = 0, marker; marker = markers[i]; i++) {
  481. this.pushMarkerTo_(marker);
  482. }
  483. if (!opt_nodraw) {
  484. this.redraw();
  485. }
  486. };
  487. /**
  488. * Pushes a marker to the clusterer.
  489. *
  490. * @param {google.maps.Marker} marker The marker to add.
  491. * @private
  492. */
  493. MarkerClusterer.prototype.pushMarkerTo_ = function(marker) {
  494. marker.setVisible(false);
  495. marker.setMap(null);
  496. var data = Util.Cookies.getAsObject("activeLayers");
  497. marker.isAdded = false;
  498. for(var layer_id in data){
  499. var visible = data[layer_id];
  500. if(marker.layer_id == layer_id && visible==false){
  501. marker.isAdded = true;
  502. }
  503. }
  504. if (marker['draggable']) {
  505. var that = this;
  506. google.maps.event.addListener(marker, 'dragend', function() {
  507. marker.isAdded = false;
  508. that.resetViewport();
  509. that.redraw();
  510. });
  511. }
  512. this.markers_.push(marker);
  513. };
  514. /**
  515. * Adds a marker to the clusterer and redraws if needed.
  516. *
  517. * @param {google.maps.Marker} marker The marker to add.
  518. * @param {boolean} opt_nodraw Whether to redraw the clusters.
  519. */
  520. MarkerClusterer.prototype.addMarker = function(marker, opt_nodraw) {
  521. this.pushMarkerTo_(marker);
  522. if (!opt_nodraw) {
  523. this.redraw();
  524. }
  525. };
  526. /**
  527. * Remove a marker from the cluster.
  528. *
  529. * @param {google.maps.Marker} marker The marker to remove.
  530. * @return {boolean} True if the marker was removed.
  531. */
  532. MarkerClusterer.prototype.removeMarker = function(marker) {
  533. var index = -1;
  534. if (this.markers_.indexOf) {
  535. index = this.markers_.indexOf(marker);
  536. } else {
  537. for (var i = 0, m; m = this.markers_[i]; i++) {
  538. if (m == marker) {
  539. index = i;
  540. continue;
  541. }
  542. }
  543. }
  544. if (index == -1) {
  545. return false;
  546. }
  547. this.markers_.splice(index, 1);
  548. marker.setVisible(false);
  549. marker.setMap(null);
  550. this.resetViewport();
  551. this.redraw();
  552. return true;
  553. };
  554. /**
  555. * Sets the clusterer's ready state.
  556. *
  557. * @param {boolean} ready The state.
  558. * @private
  559. */
  560. MarkerClusterer.prototype.setReady_ = function(ready) {
  561. if (!this.ready_) {
  562. this.ready_ = ready;
  563. this.createClusters_();
  564. }
  565. };
  566. /**
  567. * Returns the number of clusters in the clusterer.
  568. *
  569. * @return {number} The number of clusters.
  570. */
  571. MarkerClusterer.prototype.getTotalClusters = function() {
  572. return this.clusters_.length;
  573. };
  574. /**
  575. * Returns the google map that the clusterer is associated with.
  576. *
  577. * @return {google.maps.Map} The map.
  578. */
  579. MarkerClusterer.prototype.getMap = function() {
  580. return this.map_;
  581. };
  582. /**
  583. * Sets the google map that the clusterer is associated with.
  584. *
  585. * @param {google.maps.Map} map The map.
  586. */
  587. MarkerClusterer.prototype.setMap = function(map) {
  588. this.map_ = map;
  589. };
  590. /**
  591. * Returns the size of the grid.
  592. *
  593. * @return {number} The grid size.
  594. */
  595. MarkerClusterer.prototype.getGridSize = function() {
  596. /*
  597. var tran = 50;
  598. var Ax = this.maxZoom_;
  599. var By = this.gridSize_- tran ;
  600. var x = (this.map_.getZoom()>this.maxZoom)?this.maxZoom:this.map_.getZoom();
  601. var distance = tran + By-(By/Ax)*x ;
  602. return distance;
  603. */
  604. return this.gridSize_;
  605. };
  606. /**
  607. * Returns the size of the grid.
  608. *
  609. * @param {number} size The grid size.
  610. */
  611. MarkerClusterer.prototype.setGridSize = function(size) {
  612. this.gridSize_ = size;
  613. };
  614. /**
  615. * Extends a bounds object by the grid size.
  616. *
  617. * @param {google.maps.LatLngBounds} bounds The bounds to extend.
  618. * @return {google.maps.LatLngBounds} The extended bounds.
  619. */
  620. MarkerClusterer.prototype.getExtendedBounds = function(bounds) {
  621. var projection = this.getProjection();
  622. var tr = new google.maps.LatLng(bounds.getNorthEast().lat(),
  623. bounds.getNorthEast().lng());
  624. var bl = new google.maps.LatLng(bounds.getSouthWest().lat(),
  625. bounds.getSouthWest().lng());
  626. var trPix = projection.fromLatLngToDivPixel(tr);
  627. trPix.x += this.gridSize_;
  628. trPix.y -= this.gridSize_;
  629. var blPix = projection.fromLatLngToDivPixel(bl);
  630. blPix.x -= this.gridSize_;
  631. blPix.y += this.gridSize_;
  632. var ne = projection.fromDivPixelToLatLng(trPix);
  633. var sw = projection.fromDivPixelToLatLng(blPix);
  634. bounds.extend(ne);
  635. bounds.extend(sw);
  636. return bounds;
  637. };
  638. /**
  639. * Determins if a marker is contained in a bounds.
  640. *
  641. * @param {google.maps.Marker} marker The marker to check.
  642. * @param {google.maps.LatLngBounds} bounds The bounds to check against.
  643. * @return {boolean} True if the marker is in the bounds.
  644. * @private
  645. */
  646. MarkerClusterer.prototype.isMarkerInBounds_ = function(marker, bounds) {
  647. return bounds.contains(marker.getPosition());
  648. };
  649. /**
  650. * Clears all clusters and markers from the clusterer.
  651. */
  652. MarkerClusterer.prototype.clearMarkers = function() {
  653. this.resetViewport();
  654. this.markers_ = [];
  655. };
  656. /**
  657. * Clears all existing clusters and recreates them.
  658. */
  659. MarkerClusterer.prototype.resetViewport = function() {
  660. for (var i = 0, cluster; cluster = this.clusters_[i]; i++) {
  661. cluster.remove();
  662. }
  663. for (var i = 0, marker; marker = this.markers_[i]; i++) {
  664. marker.isAdded = false;
  665. marker.setMap(null);
  666. marker.setVisible(false);
  667. }
  668. this.clusters_ = [];
  669. };
  670. /**
  671. * Redraws the clusters.
  672. */
  673. MarkerClusterer.prototype.redraw = function() {
  674. this.createClusters_();
  675. };
  676. /**
  677. * Creates the clusters.
  678. *
  679. * @private
  680. */
  681. MarkerClusterer.prototype.createClusters_ = function() {
  682. if (!this.ready_) {
  683. return;
  684. }
  685. var mapBounds = new google.maps.LatLngBounds(this.map_.getBounds().getSouthWest(),
  686. this.map_.getBounds().getNorthEast());
  687. var bounds = this.getExtendedBounds(mapBounds);
  688. for (var i = 0, marker; marker = this.markers_[i]; i++) {
  689. var added = false;
  690. if (!marker.isAdded && this.isMarkerInBounds_(marker, bounds)) {
  691. for (var j = 0, cluster; cluster = this.clusters_[j]; j++) {
  692. if (!added && cluster.getCenter() &&
  693. cluster.isMarkerInClusterBounds(marker)) {
  694. added = true;
  695. cluster.addMarker(marker);
  696. break;
  697. }
  698. }
  699. if (!added) {
  700. var cluster = new Cluster(this);
  701. cluster.addMarker(marker);
  702. this.clusters_.push(cluster);
  703. }
  704. }
  705. }
  706. };
  707. /**
  708. * A cluster that contains markers.
  709. *
  710. * @param {MarkerClusterer} markerClusterer The markerclusterer that this
  711. * cluster is associated with.
  712. * @constructor
  713. * @ignore
  714. */
  715. function Cluster(markerClusterer) {
  716. this.markerClusterer_ = markerClusterer;
  717. this.map_ = markerClusterer.getMap();
  718. this.gridSize_ = markerClusterer.getGridSize();
  719. this.averageCenter_ = markerClusterer.isAverageCenter();
  720. this.center_ = null;
  721. this.markers_ = [];
  722. this.bounds_ = null;
  723. this.clusterIcon_ = new ClusterIcon(this, markerClusterer.getStyles(),
  724. markerClusterer.getGridSize());
  725. }
  726. /**
  727. * Determins if a marker is already added to the cluster.
  728. *
  729. * @param {google.maps.Marker} marker The marker to check.
  730. * @return {boolean} True if the marker is already added.
  731. */
  732. Cluster.prototype.isMarkerAlreadyAdded = function(marker) {
  733. if (this.markers_.indexOf) {
  734. return this.markers_.indexOf(marker) != -1;
  735. } else {
  736. for (var i = 0, m; m = this.markers_[i]; i++) {
  737. if (m == marker) {
  738. return true;
  739. }
  740. }
  741. }
  742. return false;
  743. };
  744. /**
  745. * Add a marker the cluster.
  746. *
  747. * @param {google.maps.Marker} marker The marker to add.
  748. * @return {boolean} True if the marker was added.
  749. */
  750. Cluster.prototype.addMarker = function(marker) {
  751. if (this.isMarkerAlreadyAdded(marker)) {
  752. return false;
  753. }
  754. if (!this.center_) {
  755. this.center_ = marker.getPosition();
  756. this.calculateBounds_();
  757. } else {
  758. if (this.averageCenter_) {
  759. var lat = (this.center_.lat() + marker.getPosition().lat()) / 2;
  760. var lng = (this.center_.lng() + marker.getPosition().lng()) / 2;
  761. this.center_ = new google.maps.LatLng(lat, lng);
  762. this.calculateBounds_();
  763. }
  764. }
  765. if (this.markers_.length == 0) {
  766. marker.setMap(this.map_);
  767. marker.setVisible(true);
  768. } else if (this.markers_.length == 1) {
  769. this.markers_[0].setMap(null);
  770. this.markers_[0].setVisible(false);
  771. }
  772. marker.isAdded = true;
  773. this.markers_.push(marker);
  774. this.updateIcon();
  775. return true;
  776. };
  777. /**
  778. * Returns the marker clusterer that the cluster is associated with.
  779. *
  780. * @return {MarkerClusterer} The associated marker clusterer.
  781. */
  782. Cluster.prototype.getMarkerClusterer = function() {
  783. return this.markerClusterer_;
  784. };
  785. /**
  786. * Returns the bounds of the cluster.
  787. *
  788. * @return {google.maps.LatLngBounds} the cluster bounds.
  789. */
  790. Cluster.prototype.getBounds = function() {
  791. this.calculateBounds_();
  792. return this.bounds_;
  793. };
  794. /**
  795. * Removes the cluster
  796. */
  797. Cluster.prototype.remove = function() {
  798. this.clusterIcon_.remove();
  799. this.markers_.length = 0;
  800. delete this.markers_;
  801. };
  802. /**
  803. * Returns the center of the cluster.
  804. *
  805. * @return {number} The cluster center.
  806. */
  807. Cluster.prototype.getSize = function() {
  808. return this.markers_.length;
  809. };
  810. /**
  811. * Returns the center of the cluster.
  812. *
  813. * @return {Array.<google.maps.Marker>} The cluster center.
  814. */
  815. Cluster.prototype.getMarkers = function() {
  816. return this.markers_;
  817. };
  818. /**
  819. * Returns the center of the cluster.
  820. *
  821. * @return {google.maps.LatLng} The cluster center.
  822. */
  823. Cluster.prototype.getCenter = function() {
  824. return this.center_;
  825. };
  826. /**
  827. * Calculated the bounds of the cluster with the grid.
  828. *
  829. * @private
  830. */
  831. Cluster.prototype.calculateBounds_ = function() {
  832. var bounds = new google.maps.LatLngBounds(this.center_, this.center_);
  833. this.bounds_ = this.markerClusterer_.getExtendedBounds(bounds);
  834. };
  835. /**
  836. * Determines if a marker lies in the clusters bounds.
  837. *
  838. * @param {google.maps.Marker} marker The marker to check.
  839. * @return {boolean} True if the marker lies in the bounds.
  840. */
  841. Cluster.prototype.isMarkerInClusterBounds = function(marker) {
  842. return this.bounds_.contains(marker.getPosition());
  843. };
  844. /**
  845. * Returns the map that the cluster is associated with.
  846. *
  847. * @return {google.maps.Map} The map.
  848. */
  849. Cluster.prototype.getMap = function() {
  850. return this.map_;
  851. };
  852. /**
  853. * Updates the cluster icon
  854. */
  855. Cluster.prototype.updateIcon = function() {
  856. var zoom = this.map_.getZoom();
  857. var mz = this.markerClusterer_.getMaxZoom();
  858. if (zoom > mz) {
  859. for (var i = 0, marker; marker = this.markers_[i]; i++) {
  860. marker.setMap(this.map_);
  861. marker.setVisible(true);
  862. }
  863. return;
  864. }
  865. if (this.markers_.length < 2) {
  866. this.clusterIcon_.hide();
  867. return;
  868. }
  869. var numStyles = this.markerClusterer_.getStyles().length;
  870. var sums = this.markerClusterer_.getCalculator()(this.markers_, numStyles);
  871. this.clusterIcon_.setCenter(this.center_);
  872. this.clusterIcon_.setSums(sums);
  873. this.clusterIcon_.show();
  874. };
  875. /**
  876. * A cluster icon
  877. *
  878. * @param {Cluster} cluster The cluster to be associated with.
  879. * @param {Object} styles An object that has style properties:
  880. * 'url': (string) The image url.
  881. * 'height': (number) The image height.
  882. * 'width': (number) The image width.
  883. * 'anchor': (Array) The anchor position of the label text.
  884. * 'textColor': (string) The text color.
  885. * 'textSize': (number) The text size.
  886. * @param {number} opt_padding Optional padding to apply to the cluster icon.
  887. * @constructor
  888. * @extends google.maps.OverlayView
  889. * @ignore
  890. */
  891. function ClusterIcon(cluster, styles, opt_padding) {
  892. cluster.getMarkerClusterer().extend(ClusterIcon, google.maps.OverlayView);
  893. this.styles_ = styles;
  894. this.padding_ = opt_padding || 0;
  895. this.cluster_ = cluster;
  896. this.center_ = null;
  897. this.map_ = cluster.getMap();
  898. this.div_ = null;
  899. this.sums_ = null;
  900. this.visible_ = false;
  901. this.setMap(this.map_);
  902. }
  903. /**
  904. * Triggers the clusterclick event and zoom's if the option is set.
  905. */
  906. ClusterIcon.prototype.triggerClusterClick = function() {
  907. var markerClusterer = this.cluster_.getMarkerClusterer();
  908. google.maps.event.trigger(markerClusterer, 'clusterclick', this.cluster_);
  909. if (markerClusterer.isZoomOnClick()) {
  910. this.map_.panTo(this.cluster_.getCenter());
  911. this.map_.fitBounds(this.cluster_.getBounds());
  912. }
  913. };
  914. /**
  915. * Adding the cluster icon to the dom.
  916. * @ignore
  917. */
  918. ClusterIcon.prototype.onAdd = function() {
  919. this.div_ = document.createElement('DIV');
  920. if (this.visible_) {
  921. var pos = this.getPosFromLatLng_(this.center_);
  922. this.div_.style.cssText = this.createCss(pos);
  923. this.div_.innerHTML = this.sums_.text;
  924. }
  925. var panes = this.getPanes();
  926. panes.overlayImage.appendChild(this.div_);
  927. var that = this;
  928. google.maps.event.addDomListener(this.div_, 'click', function() {
  929. that.triggerClusterClick();
  930. });
  931. };
  932. /**
  933. * Returns the position to place the div dending on the latlng.
  934. *
  935. * @param {google.maps.LatLng} latlng The position in latlng.
  936. * @return {google.maps.Point} The position in pixels.
  937. * @private
  938. */
  939. ClusterIcon.prototype.getPosFromLatLng_ = function(latlng) {
  940. var pos = this.getProjection().fromLatLngToDivPixel(latlng);
  941. pos.x -= parseInt(this.width_ / 2, 10);
  942. pos.y -= parseInt(this.height_ / 2, 10);
  943. return pos;
  944. };
  945. /**
  946. * Draw the icon.
  947. * @ignore
  948. */
  949. ClusterIcon.prototype.draw = function() {
  950. if (this.visible_) {
  951. var pos = this.getPosFromLatLng_(this.center_);
  952. this.div_.style.top = pos.y + 'px';
  953. this.div_.style.left = pos.x + 'px';
  954. }
  955. };
  956. /**
  957. * Hide the icon.
  958. */
  959. ClusterIcon.prototype.hide = function() {
  960. if (this.div_) {
  961. this.div_.style.display = 'none';
  962. }
  963. this.visible_ = false;
  964. };
  965. /**
  966. * Position and show the icon.
  967. */
  968. ClusterIcon.prototype.show = function() {
  969. if (this.div_) {
  970. var pos = this.getPosFromLatLng_(this.center_);
  971. this.div_.style.cssText = this.createCss(pos);
  972. this.div_.style.display = '';
  973. }
  974. this.visible_ = true;
  975. };
  976. /**
  977. * Remove the icon from the map
  978. */
  979. ClusterIcon.prototype.remove = function() {
  980. this.setMap(null);
  981. };
  982. /**
  983. * Implementation of the onRemove interface.
  984. * @ignore
  985. */
  986. ClusterIcon.prototype.onRemove = function() {
  987. if (this.div_ && this.div_.parentNode) {
  988. this.hide();
  989. this.div_.parentNode.removeChild(this.div_);
  990. this.div_ = null;
  991. }
  992. };
  993. /**
  994. * Set the sums of the icon.
  995. *
  996. * @param {Object} sums The sums containing:
  997. * 'text': (string) The text to display in the icon.
  998. * 'index': (number) The style index of the icon.
  999. */
  1000. ClusterIcon.prototype.setSums = function(sums) {
  1001. this.sums_ = sums;
  1002. this.text_ = sums.text;
  1003. this.index_ = sums.index;
  1004. if (this.div_) {
  1005. this.div_.innerHTML = sums.text;
  1006. }
  1007. this.useStyle();
  1008. };
  1009. /**
  1010. * Sets the icon to the the styles.
  1011. */
  1012. ClusterIcon.prototype.useStyle = function() {
  1013. var index = Math.max(0, this.sums_.index - 1);
  1014. index = Math.min(this.styles_.length - 1, index);
  1015. var style = this.styles_[index];
  1016. this.url_ = style['url'];
  1017. this.height_ = style['height'];
  1018. this.width_ = style['width'];
  1019. this.textColor_ = style['textColor'];
  1020. this.anchor = style['anchor'];
  1021. this.textSize_ = style['textSize'];
  1022. };
  1023. /**
  1024. * Sets the center of the icon.
  1025. *
  1026. * @param {google.maps.LatLng} center The latlng to set as the center.
  1027. */
  1028. ClusterIcon.prototype.setCenter = function(center) {
  1029. this.center_ = center;
  1030. };
  1031. /**
  1032. * Create the css text based on the position of the icon.
  1033. *
  1034. * @param {google.maps.Point} pos The position.
  1035. * @return {string} The css style text.
  1036. */
  1037. ClusterIcon.prototype.createCss = function(pos) {
  1038. var style = [];
  1039. if (document.all) {
  1040. style.push('filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(' +
  1041. 'sizingMethod=scale,src="' + this.url_ + '");');
  1042. } else {
  1043. style.push('background:url(' + this.url_ + ');');
  1044. }
  1045. if (typeof this.anchor_ === 'object') {
  1046. if (typeof this.anchor_[0] === 'number' && this.anchor_[0] > 0 &&
  1047. this.anchor_[0] < this.height_) {
  1048. style.push('height:' + (this.height_ - this.anchor_[0]) +
  1049. 'px; padding-top:' + this.anchor_[0] + 'px;');
  1050. } else {
  1051. style.push('height:' + this.height_ + 'px; line-height:' + this.height_ +
  1052. 'px;');
  1053. }
  1054. if (typeof this.anchor_[1] === 'number' && this.anchor_[1] > 0 &&
  1055. this.anchor_[1] < this.width_) {
  1056. style.push('width:' + (this.width_ - this.anchor_[1]) +
  1057. 'px; padding-left:' + this.anchor_[1] + 'px;');
  1058. } else {
  1059. style.push('width:' + this.width_ + 'px; text-align:center;');
  1060. }
  1061. } else {
  1062. style.push('height:' + this.height_ + 'px; line-height:' +
  1063. this.height_ + 'px; width:' + this.width_ + 'px; text-align:center;');
  1064. }
  1065. var txtColor = this.textColor_ ? this.textColor_ : 'black';
  1066. var txtSize = this.textSize_ ? this.textSize_ : 11;
  1067. style.push('cursor:pointer; top:' + pos.y + 'px; left:' +
  1068. pos.x + 'px; color:' + txtColor + '; position:absolute; font-size:' +
  1069. txtSize + 'px; font-family:Arial,sans-serif; font-weight:bold');
  1070. return style.join('');
  1071. };
  1072. window['MarkerClusterer'] = MarkerClusterer;
  1073. MarkerClusterer.prototype['addMarker'] = MarkerClusterer.prototype.addMarker;
  1074. MarkerClusterer.prototype['addMarkers'] = MarkerClusterer.prototype.addMarkers;
  1075. MarkerClusterer.prototype['clearMarkers'] =
  1076. MarkerClusterer.prototype.clearMarkers;
  1077. MarkerClusterer.prototype['getCalculator'] =
  1078. MarkerClusterer.prototype.getCalculator;
  1079. MarkerClusterer.prototype['getGridSize'] =
  1080. MarkerClusterer.prototype.getGridSize;
  1081. MarkerClusterer.prototype['getMap'] = MarkerClusterer.prototype.getMap;
  1082. MarkerClusterer.prototype['getMarkers'] = MarkerClusterer.prototype.getMarkers;
  1083. MarkerClusterer.prototype['getMaxZoom'] = MarkerClusterer.prototype.getMaxZoom;
  1084. MarkerClusterer.prototype['getStyles'] = MarkerClusterer.prototype.getStyles;
  1085. MarkerClusterer.prototype['getTotalClusters'] =
  1086. MarkerClusterer.prototype.getTotalClusters;
  1087. MarkerClusterer.prototype['getTotalMarkers'] =
  1088. MarkerClusterer.prototype.getTotalMarkers;
  1089. MarkerClusterer.prototype['redraw'] = MarkerClusterer.prototype.redraw;
  1090. MarkerClusterer.prototype['removeMarker'] =
  1091. MarkerClusterer.prototype.removeMarker;
  1092. MarkerClusterer.prototype['resetViewport'] =
  1093. MarkerClusterer.prototype.resetViewport;
  1094. MarkerClusterer.prototype['setCalculator'] =
  1095. MarkerClusterer.prototype.setCalculator;
  1096. MarkerClusterer.prototype['setGridSize'] =
  1097. MarkerClusterer.prototype.setGridSize;
  1098. MarkerClusterer.prototype['onAdd'] = MarkerClusterer.prototype.onAdd;
  1099. MarkerClusterer.prototype['draw'] = MarkerClusterer.prototype.draw;
  1100. Cluster.prototype['getCenter'] = Cluster.prototype.getCenter;
  1101. Cluster.prototype['getSize'] = Cluster.prototype.getSize;
  1102. Cluster.prototype['getMarkers'] = Cluster.prototype.getMarkers;
  1103. ClusterIcon.prototype['onAdd'] = ClusterIcon.prototype.onAdd;
  1104. ClusterIcon.prototype['draw'] = ClusterIcon.prototype.draw;
  1105. ClusterIcon.prototype['onRemove'] = ClusterIcon.prototype.onRemove;
  1106. Model.Factory = {
  1107. models: {},
  1108. create: function(modelName){
  1109. if(!this.models[modelName]){
  1110. this.models[modelName] = new Model[modelName];
  1111. }
  1112. return this.models[modelName];
  1113. }
  1114. }
  1115. Model.LayerManager = function(){
  1116. var _self = this;
  1117. this.layers = [];
  1118. this.myLayers = [];
  1119. Helper.layerHelper = new Helper.LayerHelper(this);
  1120. this.getAllLayers = function(){
  1121. AjaxRequest.get("/layers", function(response) {
  1122. _self._getLayersEventHandler(response);
  1123. });
  1124. }
  1125. this.getLayers = function(user) {
  1126. AjaxRequest.get("/layers?user=" + user, function(response) {
  1127. _self._getLayersEventHandler(response);
  1128. });
  1129. }
  1130. this._getLayersEventHandler = function(response) {
  1131. if(response.status == 200){
  1132. var layersChanged = new Events.LayersEvent(Events.LayersEvent.LAYERS_CHANGED);
  1133. _self.layers = Json.decode(response.responseText);
  1134. GEvent.dispatchEvent(layersChanged);
  1135. }
  1136. }
  1137. this.createLayer = function(data){
  1138. AjaxRequest.post('/layers.json', data, function(response){
  1139. _self._createLayerEventHandler(response);
  1140. });
  1141. }
  1142. this._createLayerEventHandler = function(response){
  1143. if(response.status == 201){
  1144. GEvent.dispatchEvent(new Events.LayersEvent(Events.LayersEvent.LAYER_ADDED));
  1145. _self.layers.push(Json.decode(response.responseText));
  1146. GEvent.dispatchEvent(new Events.LayersEvent(Events.LayersEvent.LAYERS_CHANGED));
  1147. GEvent.dispatchEvent(new Events.UsersEvent(Events.UsersEvent.USERS_RELOAD));
  1148. }
  1149. }
  1150. this.loadMyLayer = function() {
  1151. var options = {
  1152. url:"/mylayers.json",
  1153. headers:{"auth_token":Authentication.getAuthToken()},
  1154. method:'get',
  1155. success:_self._getMyLayersEventHandler
  1156. };
  1157. Util.Ajax(options);
  1158. }
  1159. this._getMyLayersEventHandler = function(response){
  1160. var _self = this;
  1161. if (response.status == 200){
  1162. _self.myLayers = Json.decode(response.responseText);
  1163. GEvent.dispatchEvent(new Events.LayersEvent(Events.LayersEvent.MYLAYERS_CHANGED,_self.myLayers));
  1164. }
  1165. }
  1166. this.createMyLayer = function(data){
  1167. var options = {
  1168. url:"/layers.json",
  1169. method:'post',
  1170. params:data,
  1171. success:_self._createMyLayerEventHandler
  1172. };
  1173. Util.Ajax(options);
  1174. }
  1175. this._createMyLayerEventHandler = function(response){
  1176. if(response.status == 201){
  1177. var layer = Json.decode(response.responseText);
  1178. Util.func.setCurrentUserAsLayerOwner(layer);
  1179. _self.layers.push(layer);
  1180. GEvent.dispatchEvent(new Events.LayersEvent(Events.LayersEvent.MY_LAYER_ADDED,layer));
  1181. }
  1182. else{
  1183. var errors = Json.decode(response.responseText);
  1184. GEvent.dispatchEvent(new Events.LayersEvent(Events.LayersEvent.MY_LAYER_ADDED_FAILED, errors));
  1185. }
  1186. }
  1187. this.getPublicLayers = function(){
  1188. AjaxRequest.get('/public_layers', function(response){
  1189. _self._getPublicLayersEventHandler(response);
  1190. });
  1191. }
  1192. this._getPublicLayersEventHandler = function(response){
  1193. if(response.status == 200){
  1194. _self.layers = Json.decode(response.responseText);
  1195. var layersChanged = new Events.LayersEvent(Events.LayersEvent.LAYERS_CHANGED);
  1196. GEvent.dispatchEvent(layersChanged);
  1197. }
  1198. }
  1199. this.updateMyLayerStatus = function(data){
  1200. var _self = this;
  1201. var options = {
  1202. url:"/update_my_layer_status.json" ,
  1203. method:'post',
  1204. params: data,
  1205. headers:{"Content-Type":"application/json; charset=utf-8"},
  1206. success:_self._updateMyLayerStatusHandler
  1207. };
  1208. Util.Ajax(options);
  1209. };
  1210. this._updateMyLayerStatusHandler = function(response){
  1211. if(response.status == 200){
  1212. var datas = Json.decode(response.responseText);
  1213. var layersChanged = new Events.LayersEvent(Events.LayersEvent.LAYERS_MY_LAYER_STATUS_SAVED);
  1214. GEvent.dispatchEvent(layersChanged);
  1215. }
  1216. else{
  1217. var datas = Json.decode(response.responseText);
  1218. var layersChanged = new Events.LayersEvent(Events.LayersEvent.LAYERS_MY_LAYER_STATUS_SAVED_FAILED,datas);
  1219. GEvent.dispatchEvent(layersChanged);
  1220. }
  1221. };
  1222. this.findById = function(id){
  1223. for(var i = 0; i < this.layers.length; i++){
  1224. if(this.layers[i].id == id){
  1225. return this.layers[i];
  1226. }
  1227. }
  1228. return null;
  1229. };
  1230. this.saveMember = function(data){
  1231. var _self = this;
  1232. data = Json.encode(data);
  1233. var options = {
  1234. url:"/create_membership.json",
  1235. method:'post',
  1236. params: data,
  1237. headers:{"Content-Type":"application/json; charset=utf-8"},
  1238. success:_self._saveMemberHandler
  1239. };
  1240. Util.Ajax(options);
  1241. };
  1242. this._saveMemberHandler = function(response){
  1243. var data = Json.decode(response.responseText);
  1244. if(response.status == 201) {
  1245. var memberSaved = new Events.MemberEvent(Events.MemberEvent.MEMBER_CREATED,data);
  1246. GEvent.dispatchEvent(memberSaved);
  1247. }
  1248. else if (response.status == 200) {
  1249. var memberSavedFailed = new Events.MemberEvent(Events.MemberEvent.MEMBER_CREATED_FAILED,data);
  1250. GEvent.dispatchEvent(memberSavedFailed);
  1251. }
  1252. };
  1253. this.editMember = function(data){
  1254. var _self = this;
  1255. params = Json.encode(data);
  1256. var options = {
  1257. url: "/getMembership?user_id=" + data.userId + "&layer_id=" + data.layerId ,
  1258. method:'get',
  1259. params: data,
  1260. headers:{"Content-Type":"application/json; charset=utf-8"},
  1261. success:_self._editMemberHandler
  1262. };
  1263. Util.Ajax(options);
  1264. };
  1265. this._editMemberHandler = function(response){
  1266. var data = Json.decode(response.responseText);
  1267. if(response.status == 200) {
  1268. var getMemberSuccess= new Events.MemberEvent(Events.MemberEvent.GET_MEMBER_SUCCESS,data);
  1269. GEvent.dispatchEvent(getMemberSuccess);
  1270. }
  1271. else if (response.status == 404) {
  1272. alert('could not find this member');
  1273. }
  1274. };
  1275. this.updateMember = function(data){
  1276. var _self = this;
  1277. params = Json.encode(data);
  1278. var options = {
  1279. url: "/memberships/" + data.id + ".json" ,
  1280. method:'put',
  1281. params: params,
  1282. headers:{"Content-Type":"application/json; charset=utf-8"},
  1283. success:_self._updateMemberHandler
  1284. };
  1285. Util.Ajax(options);
  1286. };
  1287. this._updateMemberHandler = function(response){
  1288. var data = Json.decode(response.responseText);
  1289. if(response.status == 201) {
  1290. var memberGetUpdated = new Events.MemberEvent(Events.MemberEvent.MEMBER_GET_UPDATED,data);
  1291. GEvent.dispatchEvent(memberGetUpdated);
  1292. }
  1293. else if (response.status == 200) {
  1294. var memberGetUpdatedFailed = new Events.MemberEvent(Events.MemberEvent.MEMBER_GET_UPDATED_FAILED,data);
  1295. GEvent.dispatchEvent(memberGetUpdatedFailed);
  1296. }
  1297. };
  1298. }
  1299. Model.ResourceManager = function(){
  1300. var _self = this;
  1301. this.resources = [];
  1302. this.currentResource = null
  1303. this.getResourceDetailForResourceList = function(id){
  1304. AjaxRequest.get("/resources/" + id, function(response){
  1305. _self._getResourceDetailForResourceList(response);
  1306. })
  1307. };
  1308. this._getResourceDetailForResourceList = function(response){
  1309. var resouceDetailEvent = null;
  1310. if(response.status == 200){
  1311. var resource = Json.decode(response.responseText);
  1312. resouceDetailEvent = new Events.ResourcesEvent(Events.ResourcesEvent.RESOURCE_GET_DETAIL_FOR_RESOURCE_LIST, resource);
  1313. }
  1314. else{
  1315. resouceDetailEvent = new Events.ResourcesEvent(Events.ResourcesEvent.RESOURCE_GET_DETAIL_FOR_RESOURCE_LIST_FAILED);
  1316. }
  1317. GEvent.dispatchEvent(resouceDetailEvent);
  1318. };
  1319. this.loadResources = function(){
  1320. AjaxRequest.get("/resources", function(response){
  1321. _self._loadResourcesEventHandler(response);
  1322. });
  1323. };
  1324. this.loadResourcesOf = function(queryString){
  1325. GEvent.dispatchEvent(new Events.MapsEvent(Events.MapsEvent.LOADING_WINDOW_SHOW));
  1326. AjaxRequest.get("/resources?" +queryString, function(response){
  1327. _self._loadResourcesEventHandler(response);
  1328. });
  1329. };
  1330. this._loadResourcesEventHandler = function(response){
  1331. if(response.status == 200){
  1332. _self.resources = Json.decode(response.responseText);
  1333. GEvent.dispatchEvent(new Events.ResourcesEvent(Events.ResourcesEvent.RESOURCES_CHANGED));
  1334. }
  1335. GEvent.dispatchEvent(new Events.MapsEvent(Events.MapsEvent.LOADING_WINDOW_CLOSE));
  1336. };
  1337. this.createResource = function(data){
  1338. var param = Json.encode({resource: data});
  1339. var options = {
  1340. url:"/resources",
  1341. method:'post',
  1342. params: param,
  1343. headers:{"Content-Type":"application/json; charset=utf-8"},
  1344. success:_self._createResourceEventHandler
  1345. };
  1346. Util.Ajax(options);
  1347. };
  1348. this._createResourceEventHandler = function(response){
  1349. var resouceAddedEvent = null;
  1350. if(response.status == 200){
  1351. var resource = Json.decode(response.responseText);
  1352. resouceAddedEvent = new Events.ResourcesEvent(Events.ResourcesEvent.RESOURCE_ADDED, resource);
  1353. _self.resources.push(Json.decode(response.responseText));
  1354. }
  1355. else{
  1356. resouceAddedEvent = new Events.ResourcesEvent(Events.ResourcesEvent.RESOURCE_ADDED, false);
  1357. }
  1358. GEvent.dispatchEvent(resouceAddedEvent);
  1359. };
  1360. this.getResourceDetail = function(id){
  1361. AjaxRequest.get("/resources/" + id, function(response){
  1362. _self._getResourceDetailEventHandler(response);
  1363. })
  1364. };
  1365. this._getResourceDetailEventHandler = function(response){
  1366. var resouceDetailEvent = null;
  1367. if(response.status == 200){
  1368. this.currentResource = Json.decode(response.responseText);
  1369. resouceDetailEvent = new Events.ResourcesEvent(Events.ResourcesEvent.RESOURCE_GET_DETAIL, this.currentResource);
  1370. }
  1371. else{
  1372. resouceDetailEvent = new Events.ResourcesEvent(Events.ResourcesEvent.RESOURCE_GET_DETAIL_FAILED);
  1373. }
  1374. GEvent.dispatchEvent(resouceDetailEvent);
  1375. };
  1376. this.loadResourcesPaging = function(data){
  1377. var options = {
  1378. url:"/layers/" + data.layerId + "/resources.json?page=" + data.page ,
  1379. method:'get',
  1380. headers:{"Content-Type":"application/json; charset=utf-8"},
  1381. success:_self._loadResourcesPaging
  1382. };
  1383. Util.Ajax(options);
  1384. };
  1385. this._loadResourcesPaging = function(response){
  1386. var resouceDetailEvent = null;
  1387. if(response.status == 200){
  1388. var resources = Json.decode(response.responseText);
  1389. resoucePaginglEvent = new Events.ResourcesEvent(Events.ResourcesEvent.RESOURCE_GET_PAGING, resources);
  1390. }
  1391. else{
  1392. resoucePaginglEvent = new Events.ResourcesEvent(Events.ResourcesEvent.RESOURCE_GET_PAGING_FAILED);
  1393. }
  1394. GEvent.dispatchEvent(resoucePaginglEvent);
  1395. };
  1396. this.getResourceTemplate = function(layerId){
  1397. var options = {
  1398. url:"/layers/" + data.layerId + "/property_templates.json",
  1399. method:'get',
  1400. headers:{"Content-Type":"application/json; charset=utf-8"},
  1401. success:_self._getResourceTemplateEventHandler
  1402. };
  1403. Util.Ajax(options);
  1404. };
  1405. this._getResourceTemplateEventHandler = function(response){
  1406. var resouceDetailEvent = null;
  1407. if(response.status == 200){
  1408. var template = Json.decode(response.responseText);
  1409. resouceDetailEvent = new Events.ResourcesEvent(Events.ResourcesEvent.RESOURCE_GET_TEMPLATE, template);
  1410. }
  1411. else{
  1412. resouceDetailEvent = new Events.ResourcesEvent(Events.ResourcesEvent.RESOURCE_GET_TEMPLATE_FAILED);
  1413. }
  1414. GEvent.dispatchEvent(resouceDetailEvent);
  1415. };
  1416. this.confirmImport = function(fileName, layerId){
  1417. GEvent.dispatchEvent(new Events.MapsEvent(Events.ResourcesEvent.LOADING_IMPORT_WINDOW_SHOW));
  1418. var options = {
  1419. url:"/import_from_csv",
  1420. params: {fileName: fileName, layerId: layerId},
  1421. method:'post',
  1422. success:_self._confirmImportEventHandler
  1423. };
  1424. Util.Ajax(options);
  1425. };
  1426. this._confirmImportEventHandler = function(response){
  1427. if (response.status == 200){
  1428. var resources = Json.decode(response.responseText);
  1429. for(var i = 0; i < resources.length; i++){
  1430. _self.addResource(resources[i]);
  1431. }
  1432. GEvent.dispatchEvent(new Events.MapsEvent(Events.ResourcesEvent.LOADING_IMPORT_WINDOW_CLOSE));
  1433. GEvent.dispatchEvent(new Events.ResourcesEvent(Events.ResourcesEvent.IMPORT_RESOURCES_FROM_CSV_SUCCESS));
  1434. }
  1435. };
  1436. this.addResource = function(resource){
  1437. this.resources.push(resource);
  1438. GEvent.dispatchEvent(new Events.ResourcesEvent(Events.ResourcesEvent.RESOURCE_ITEM_ADDED, resource));
  1439. };
  1440. this.editResource = function(resourceId){
  1441. AjaxRequest.get("/resources/" +resourceId +"/edit", function(response){
  1442. _self._editResourceHandler(response);
  1443. });
  1444. };
  1445. this._editResourceHandler = function(response){
  1446. if(response.status == 200){
  1447. var resource = Json.decode(response.responseText);
  1448. GEvent.dispatchEvent(new Events.ResourcesEvent(Events.ResourcesEvent.RESOURCE_EDIT_SUCCESS, resource));
  1449. }
  1450. };
  1451. this.updateResource = function(data){
  1452. window.data = data ;
  1453. var param = Json.encode({resource: data});
  1454. var options = {
  1455. url:"/resources/" + data.id ,
  1456. method:'put',
  1457. params: param,
  1458. headers:{"Content-Type":"application/json; charset=utf-8"},
  1459. success:_self._updateResourceEventHandler
  1460. };
  1461. Util.Ajax(options);
  1462. };
  1463. this._updateResourceEventHandler = function(response){
  1464. if(response.status == 200){
  1465. var resource = Json.decode(response.responseText);
  1466. _self._updateResourceInCollection(resource);
  1467. GEvent.dispatchEvent(new Events.ResourcesEvent(Events.ResourcesEvent.RESOURCES_UPDATE_SUCCESS, resource));
  1468. }
  1469. };
  1470. this._updateResourceInCollection = function(resource){
  1471. var resources = _self.resources ;
  1472. for(var i=0;i<resources.length;i++){
  1473. if(resources[i].id == resource.id){
  1474. resources[i].name = resource.name;
  1475. resources[i].lat = resource.lat;
  1476. resources[i].lng = resource.lng;
  1477. return true;
  1478. }
  1479. }
  1480. return false;
  1481. };
  1482. };
  1483. Model.AuthenticationManager = function(){
  1484. var _self = this;
  1485. this.session = {};
  1486. this.login = function(user){
  1487. AjaxRequest.post('/login_rpc', user, function(response){
  1488. _self._loginEventHandler(response);
  1489. });
  1490. };
  1491. this._loginEventHandler = function(response){
  1492. if(response.status == 200){
  1493. _self.session = Json.decode(response.responseText);
  1494. var loginSuccess = new Events.AuthenticationEvent(Events.AuthenticationEvent.LOGIN_SUCCESS);
  1495. GEvent.dispatchEvent(loginSuccess);
  1496. }
  1497. else{
  1498. var loginFailed = new Events.AuthenticationEvent(Events.AuthenticationEvent.LOGIN_FAILED);
  1499. GEvent.dispatchEvent(loginFailed);
  1500. }
  1501. };
  1502. this.logout = function(){
  1503. AjaxRequest.post('/logout_rpc', 'logout', function(response){
  1504. _self._logoutEventHandler(response);
  1505. });
  1506. },
  1507. this._logoutEventHandler = function(response){
  1508. if(response.status == 200){
  1509. var logoutSuccess = new Events.AuthenticationEvent(Events.AuthenticationEvent.LOGOUT_SUCCESS);
  1510. GEvent.dispatchEvent(logoutSuccess);
  1511. }
  1512. }
  1513. }
  1514. Model.UploadManager = function(){
  1515. var _self = this;
  1516. this.getSWFUploadObject = function(){
  1517. return window.SETTING.swfUpload;
  1518. };
  1519. this.startUploadIcon = function(swf){
  1520. swf.startUpload(swf.QueueFile.id);
  1521. };
  1522. this.startImportResources = function(swf){
  1523. swf.startUpload(swf.QueueFile.id);
  1524. }
  1525. };
  1526. Helper.LayerHelper = function(layerManager){
  1527. this.layerManager = layerManager;
  1528. this.getIcon = function(layerId){
  1529. var layer = this.layerManager.findById(layerId);
  1530. return layer && layer.icon? layer.icon : SETTING.MARKER_ICON_DEFAULT;
  1531. };
  1532. this.getLayer = function(layerId){
  1533. return this.layerManager.findById(layerId);
  1534. };
  1535. }
  1536. Events.LayersEvent = function(type, data){
  1537. this.type = type;
  1538. this.data = data;
  1539. }
  1540. Events.LayersEvent.LAYERS_CHANGED = 'layersChangedLayersEvent';
  1541. Events.LayersEvent.LAYER_ADDED = 'layerAddedLayersEvent';
  1542. Events.LayersEvent.LAYER_NEW = 'layerNewLayersEvent';
  1543. Events.LayersEvent.LAYERS_LOAD = 'layersLoadLayersEvent';
  1544. Events.LayersEvent.MYLAYERS_SHOW = 'layersShowMyLayerEvent';
  1545. Events.LayersEvent.MYLAYER_LOAD = 'layersLoadMyLayerEvent';
  1546. Events.LayersEvent.MYLAYERS_CHANGED = 'layersChangeMyLayerEvent';
  1547. Events.LayersEvent.MYLAYERS_HIDE = 'layersHideMyLayerEvent';
  1548. Events.LayersEvent.MYLAYERS_SHOW = 'layersShowMyLayerEvent' ;
  1549. Events.LayersEvent.CREATE_MY_LAYER = 'layerCreateMyLayerEvent';
  1550. Events.LayersEvent.MY_LAYER_ADDED = 'layerMyLayerAddedEvent';
  1551. Events.LayersEvent.MY_LAYER_ADDED_FAILED = 'layerMyLayerAddedFailedEvent';
  1552. Events.LayersEvent.UPDATE_MY_LAYER_STATUS = 'layerUpdateMylayerEvent';
  1553. Events.LayersEvent.LAYERS_MY_LAYER_STATUS_SAVED = 'layerMyLayerStatusSaveEvent';
  1554. Events.LayersEvent.LAYERS_MY_LAYER_STATUS_SAVED_FAILED = "layerMyLayerStatusSavedFailedEvent";
  1555. Events.LayersEvent.LAYERS_UPDATE_RESOURCE_LOCATION_DRAGGING = "layerUpdateResourceLocationDraggingEvent";
  1556. Events.LayersEvent.LAYERS_LOAD_COMPLETED = "layersLoadCompletedLayerEvent";
  1557. Events.LayersEvent.SHOW_FRONT_LAYER_EVENT = "layersShowFrontLayerEvent";
  1558. Events.ResourcesEvent = function(type, data){
  1559. this.type = type;
  1560. this.data = data;
  1561. }
  1562. Events.ResourcesEvent.RESOURCES_CHANGED = 'resourcesChangedResourcesEvent';
  1563. Events.ResourcesEvent.RESOURCES_SAVE = 'resourcesSaveResourcesEvent';
  1564. Events.ResourcesEvent.RESOURCE_ADDED = "resourcesAddedResourceEvent";
  1565. Events.ResourcesEvent.RESOURCE_GET_DETAIL = 'resourceGetDetailEvent';
  1566. Events.ResourcesEvent.RESOURCE_GET_DETAIL_FAILED = 'resourceGetDetailFailedEvent';
  1567. Events.ResourcesEvent.RESOURCE_REQUEST_GET_DETAIL = 'resourceRequestsGetDetailEvent';
  1568. Events.ResourcesEvent.RESOURCE_LOAD = 'resourceLoadResourcesEvent';
  1569. Events.ResourcesEvent.RESOURCES_LOAD_PAGING = 'resourcesLoadPagingResourcesEvent';
  1570. Events.ResourcesEvent.RESOURCES_LOAD_TEMPLATE = 'resourcesLoadTemplateResourcesEvent';
  1571. Events.ResourcesEvent.RESOURCE_GET_TEMPLATE = 'resourcesGetTemplateResourcesEvent';
  1572. Events.ResourcesEvent.RESOURCE_GET_PAGING = "resourcesGetPagingResourcesEvent";
  1573. Events.ResourcesEvent.RESOURCE_GET_PAGING_FAILED = "resourcesGetPagingFailedResourcesEvent";
  1574. Events.ResourcesEvent.RESOURCE_LOAD_DETAIL_FOR_RESOURCE_LIST = "resourceLoadDetailForResourceList";
  1575. Events.ResourcesEvent.RESOURCE_GET_DETAIL_FOR_RESOURCE_LIST = "resourceGetDetailForResourceList";
  1576. Events.ResourcesEvent.RESOURCE_GET_DETAIL_FOR_RESOURCE_LIST_FAILED = "resourceGetDetailForResourceListFailed";
  1577. Events.ResourcesEvent.LOAD_LAYER_RESOURCES = "loadLayerResourcesResourcesEvent";
  1578. Events.ResourcesEvent.SHOW_IMPORT_RESOURCES = "showImportResourcesEvent";
  1579. Events.ResourcesEvent.LOAD_CONFIRMED_RESOURCES = "loadConfirmedResourcesEvent";
  1580. Events.ResourcesEvent.CONFIRMED_IMPORT_RESOURCES = "onfirmedImportResourcesEvent";
  1581. Events.ResourcesEvent.IMPORT_RESOURCES_FROM_CSV_SUCCESS = "importResourcesFromCsvSuccess";
  1582. Events.ResourcesEvent.RESOURCE_ITEM_ADDED = "resourceItemAdded";
  1583. Events.ResourcesEvent.RESOURCE_EDIT = "resourceEditResourcesEvent";
  1584. Events.ResourcesEvent.RESOURCE_EDIT_SUCCESS = "resourceEditSuccessResourcesEvent";
  1585. Events.ResourcesEvent.RESOURCES_UPDATE = "resourceUpdateEvent";
  1586. Events.ResourcesEvent.LOADING_IMPORT_WINDOW_SHOW = "resourceShowLoadingImport";
  1587. Events.ResourcesEvent.LOADING_IMPORT_WINDOW_CLOSE = "resourceCloseLoadingImport";
  1588. Events.AuthenticationEvent = function(type){
  1589. this.type = type;
  1590. }
  1591. Events.AuthenticationEvent.USER_LOGIN = 'userLoginAuthenticationEvent';
  1592. Events.AuthenticationEvent.LOGIN_SUCCESS = 'loginSuccessAuthenticationEvent';
  1593. Events.AuthenticationEvent.LOGIN_FAILED = 'loginFailedAuthenticationEvent';
  1594. Events.AuthenticationEvent.USER_LOGOUT = 'userLogoutAuthenticationEvent';
  1595. Events.AuthenticationEvent.LOGOUT_SUCCESS = 'logoutSuccessAuthenticationEvent';
  1596. /**
  1597. * SWFUpload: http://www.swfupload.org, http://swfupload.googlecode.com
  1598. *
  1599. * mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/, http://www.vinterwebb.se/
  1600. *
  1601. * SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilzén and Mammon Media and is released under the MIT License:
  1602. * http://www.opensource.org/licenses/mit-license.php
  1603. *
  1604. * SWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT License:
  1605. * http://www.opensource.org/licenses/mit-license.php
  1606. *
  1607. */
  1608. /* ******************* */
  1609. /* Constructor & Init */
  1610. /* ******************* */
  1611. var SWFUpload;
  1612. if (SWFUpload == undefined) {
  1613. SWFUpload = function (settings) {
  1614. this.initSWFUpload(settings);
  1615. };
  1616. }
  1617. SWFUpload.prototype.initSWFUpload = function (settings) {
  1618. try {
  1619. this.customSettings = {}; // A container where developers can place their own settings associated with this instance.
  1620. this.settings = settings;
  1621. this.eventQueue = [];
  1622. this.movieName = "SWFUpload_" + SWFUpload.movieCount++;
  1623. this.movieElement = null;
  1624. SWFUpload.instances[this.movieName] = this;
  1625. this.initSettings();
  1626. this.loadFlash();
  1627. this.displayDebugInfo();
  1628. } catch (ex) {
  1629. delete SWFUpload.instances[this.movieName];
  1630. throw ex;
  1631. }
  1632. };
  1633. /* *************** */
  1634. /* Static Members */
  1635. /* *************** */
  1636. SWFUpload.instances = {};
  1637. SWFUpload.movieCount = 0;
  1638. SWFUpload.version = "2.2.0 2009-03-25";
  1639. SWFUpload.QUEUE_ERROR = {
  1640. QUEUE_LIMIT_EXCEEDED : -100,
  1641. FILE_EXCEEDS_SIZE_LIMIT : -110,
  1642. ZERO_BYTE_FILE : -120,
  1643. INVALID_FILETYPE : -130
  1644. };
  1645. SWFUpload.UPLOAD_ERROR = {
  1646. HTTP_ERROR : -200,
  1647. MISSING_UPLOAD_URL : -210,
  1648. IO_ERROR : -220,
  1649. SECURITY_ERROR : -230,
  1650. UPLOAD_LIMIT_EXCEEDED : -240,
  1651. UPLOAD_FAILED : -250,
  1652. SPECIFIED_FILE_ID_NOT_FOUND : -260,
  1653. FILE_VALIDATION_FAILED : -270,
  1654. FILE_CANCELLED : -280,
  1655. UPLOAD_STOPPED : -290
  1656. };
  1657. SWFUpload.FILE_STATUS = {
  1658. QUEUED : -1,
  1659. IN_PROGRESS : -2,
  1660. ERROR : -3,
  1661. COMPLETE : -4,
  1662. CANCELLED : -5
  1663. };
  1664. SWFUpload.BUTTON_ACTION = {
  1665. SELECT_FILE : -100,
  1666. SELECT_FILES : -110,
  1667. START_UPLOAD : -120
  1668. };
  1669. SWFUpload.CURSOR = {
  1670. ARROW : -1,
  1671. HAND : -2
  1672. };
  1673. SWFUpload.WINDOW_MODE = {
  1674. WINDOW : "window",
  1675. TRANSPARENT : "transparent",
  1676. OPAQUE : "opaque"
  1677. };
  1678. SWFUpload.completeURL = function(url) {
  1679. if (typeof(url) !== "string" || url.match(/^https?:\/\//i) || url.match(/^\//)) {
  1680. return url;
  1681. }
  1682. var currentURL = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ":" + window.location.port : "");
  1683. var indexSlash = window.location.pathname.lastIndexOf("/");
  1684. if (indexSlash <= 0) {
  1685. path = "/";
  1686. } else {
  1687. path = window.location.pathname.substr(0, indexSlash) + "/";
  1688. }
  1689. return /*currentURL +*/ path + url;
  1690. };
  1691. /* ******************** */
  1692. /* Instance Members */
  1693. /* ******************** */
  1694. SWFUpload.prototype.initSettings = function () {
  1695. this.ensureDefault = function (settingName, defaultValue) {
  1696. this.settings[settingName] = (this.settings[settingName] == undefined) ? defaultValue : this.settings[settingName];
  1697. };
  1698. this.ensureDefault("upload_url", "");
  1699. this.ensureDefault("preserve_relative_urls", false);
  1700. this.ensureDefault("file_post_name", "Filedata");
  1701. this.ensureDefault("post_params", {});
  1702. this.ensureDefault("use_query_string", false);
  1703. this.ensureDefault("requeue_on_error", false);
  1704. this.ensureDefault("http_success", []);
  1705. this.ensureDefault("assume_success_timeout", 0);
  1706. this.ensureDefault("file_types", "*.*");
  1707. this.ensureDefault("file_types_description", "All Files");
  1708. this.ensureDefault("file_size_limit", 0); // Default zero means "unlimited"
  1709. this.ensureDefault("file_upload_limit", 0);
  1710. this.ensureDefault("file_queue_limit", 0);
  1711. this.ensureDefault("flash_url", "swfupload.swf");
  1712. this.ensureDefault("prevent_swf_caching", true);
  1713. this.ensureDefault("button_image_url", "");
  1714. this.ensureDefault("button_width", 1);
  1715. this.ensureDefault("button_height", 1);
  1716. this.ensureDefault("button_text", "");
  1717. this.ensureDefault("button_text_style", "color: #000000; font-size: 16pt;");
  1718. this.ensureDefault("button_text_top_padding", 0);
  1719. this.ensureDefault("button_text_left_padding", 0);
  1720. this.ensureDefault("button_action", SWFUpload.BUTTON_ACTION.SELECT_FILES);
  1721. this.ensureDefault("button_disabled", false);
  1722. this.ensureDefault("button_placeholder_id", "");
  1723. this.ensureDefault("button_placeholder", null);
  1724. this.ensureDefault("button_cursor", SWFUpload.CURSOR.ARROW);
  1725. this.ensureDefault("button_window_mode", SWFUpload.WINDOW_MODE.WINDOW);
  1726. this.ensureDefault("debug", false);
  1727. this.settings.debug_enabled = this.settings.debug; // Here to maintain v2 API
  1728. this.settings.return_upload_start_handler = this.returnUploadStart;
  1729. this.ensureDefault("swfupload_loaded_handler", null);
  1730. this.ensureDefault("file_dialog_start_handler", null);
  1731. this.ensureDefault("file_queued_handler", null);
  1732. this.ensureDefault("file_queue_error_handler", null);
  1733. this.ensureDefault("file_dialog_complete_handler", null);
  1734. this.ensureDefault("upload_start_handler", null);
  1735. this.ensureDefault("upload_progress_handler", null);
  1736. this.ensureDefault("upload_error_handler", null);
  1737. this.ensureDefault("upload_success_handler", null);
  1738. this.ensureDefault("upload_complete_handler", null);
  1739. this.ensureDefault("debug_handler", this.debugMessage);
  1740. this.ensureDefault("custom_settings", {});
  1741. this.customSettings = this.settings.custom_settings;
  1742. if (!!this.settings.prevent_swf_caching) {
  1743. this.settings.flash_url = this.settings.flash_url + (this.settings.flash_url.indexOf("?") < 0 ? "?" : "&") + "preventswfcaching=" + new Date().getTime();
  1744. }
  1745. if (!this.settings.preserve_relative_urls) {
  1746. this.settings.upload_url = SWFUpload.completeURL(this.settings.upload_url);
  1747. this.settings.button_image_url = SWFUpload.completeURL(this.settings.button_image_url);
  1748. }
  1749. delete this.ensureDefault;
  1750. };
  1751. SWFUpload.prototype.loadFlash = function () {
  1752. var targetElement, tempParent;
  1753. if (document.getElementById(this.movieName) !== null) {
  1754. throw "ID " + this.movieName + " is already in use. The Flash Object could not be added";
  1755. }
  1756. targetElement = document.getElementById(this.settings.button_placeholder_id) || this.settings.button_placeholder;
  1757. if (targetElement == undefined) {
  1758. throw "Could not find the placeholder element: " + this.settings.button_placeholder_id;
  1759. }
  1760. tempParent = document.createElement("div");
  1761. tempParent.innerHTML = this.getFlashHTML(); // Using innerHTML is non-standard but the only sensible way to dynamically add Flash in IE (and maybe other browsers)
  1762. targetElement.parentNode.replaceChild(tempParent.firstChild, targetElement);
  1763. if (window[this.movieName] == undefined) {
  1764. window[this.movieName] = this.getMovieElement();
  1765. }
  1766. };
  1767. SWFUpload.prototype.getFlashHTML = function () {
  1768. return ['<object id="', this.movieName, '" type="application/x-shockwave-flash" data="', this.settings.flash_url, '" width="', this.settings.button_width, '" height="', this.settings.button_height, '" class="swfupload">',
  1769. '<param name="wmode" value="', this.settings.button_window_mode, '" />',
  1770. '<param name="movie" value="', this.settings.flash_url, '" />',
  1771. '<param name="quality" value="high" />',
  1772. '<param name="menu" value="false" />',
  1773. '<param name="allowScriptAccess" value="always" />',
  1774. '<param name="flashvars" value="' + this.getFlashVars() + '" />',
  1775. '</object>'].join("");
  1776. };
  1777. SWFUpload.prototype.getFlashVars = function () {
  1778. var paramString = this.buildParamString();
  1779. var httpSuccessString = this.settings.http_success.join(",");
  1780. return ["movieName=", encodeURIComponent(this.movieName),
  1781. "&amp;uploadURL=", encodeURIComponent(this.settings.upload_url),
  1782. "&amp;useQueryString=", encodeURIComponent(this.settings.use_query_string),
  1783. "&amp;requeueOnError=", encodeURIComponent(this.settings.requeue_on_error),
  1784. "&amp;httpSuccess=", encodeURIComponent(httpSuccessString),
  1785. "&amp;assumeSuccessTimeout=", encodeURIComponent(this.settings.assume_success_timeout),
  1786. "&amp;params=", encodeURIComponent(paramString),
  1787. "&amp;filePostName=", encodeURIComponent(this.settings.file_post_name),
  1788. "&amp;fileTypes=", encodeURIComponent(this.settings.file_types),
  1789. "&amp;fileTypesDescription=", encodeURIComponent(this.settings.file_types_description),
  1790. "&amp;fileSizeLimit=", encodeURIComponent(this.settings.file_size_limit),
  1791. "&amp;fileUploadLimit=", encodeURIComponent(this.settings.file_upload_limit),
  1792. "&amp;fileQueueLimit=", encodeURIComponent(this.settings.file_queue_limit),
  1793. "&amp;debugEnabled=", encodeURIComponent(this.settings.debug_enabled),
  1794. "&amp;buttonImageURL=", encodeURIComponent(this.settings.button_image_url),
  1795. "&amp;buttonWidth=", encodeURIComponent(this.settings.button_width),
  1796. "&amp;buttonHeight=", encodeURIComponent(this.settings.button_height),
  1797. "&amp;buttonText=", encodeURIComponent(this.settings.button_text),
  1798. "&amp;buttonTextTopPadding=", encodeURIComponent(this.settings.button_text_top_padding),
  1799. "&amp;buttonTextLeftPadding=", encodeURIComponent(this.settings.button_text_left_padding),
  1800. "&amp;buttonTextStyle=", encodeURIComponent(this.settings.button_text_style),
  1801. "&amp;buttonAction=", encodeURIComponent(this.settings.button_action),
  1802. "&amp;buttonDisabled=", encodeURIComponent(this.settings.button_disabled),
  1803. "&amp;buttonCursor=", encodeURIComponent(this.settings.button_cursor)
  1804. ].join("");
  1805. };
  1806. SWFUpload.prototype.getMovieElement = function () {
  1807. if (this.movieElement == undefined) {
  1808. this.movieElement = document.getElementById(this.movieName);
  1809. }
  1810. if (this.movieElement === null) {
  1811. throw "Could not find Flash element";
  1812. }
  1813. return this.movieElement;
  1814. };
  1815. SWFUpload.prototype.buildParamString = function () {
  1816. var postParams = this.settings.post_params;
  1817. var paramStringPairs = [];
  1818. if (typeof(postParams) === "object") {
  1819. for (var name in postParams) {
  1820. if (postParams.hasOwnProperty(name)) {
  1821. paramStringPairs.push(encodeURIComponent(name.toString()) + "=" + encodeURIComponent(postParams[name].toString()));
  1822. }
  1823. }
  1824. }
  1825. return paramStringPairs.join("&amp;");
  1826. };
  1827. SWFUpload.prototype.destroy = function () {
  1828. try {
  1829. this.cancelUpload(null, false);
  1830. var movieElement = null;
  1831. movieElement = this.getMovieElement();
  1832. if (movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE
  1833. for (var i in movieElement) {
  1834. try {
  1835. if (typeof(movieElement[i]) === "function") {
  1836. movieElement[i] = null;
  1837. }
  1838. } catch (ex1) {}
  1839. }
  1840. try {
  1841. movieElement.parentNode.removeChild(movieElement);
  1842. } catch (ex) {}
  1843. }
  1844. window[this.movieName] = null;
  1845. SWFUpload.instances[this.movieName] = null;
  1846. delete SWFUpload.instances[this.movieName];
  1847. this.movieElement = null;
  1848. this.settings = null;
  1849. this.customSettings = null;
  1850. this.eventQueue = null;
  1851. this.movieName = null;
  1852. return true;
  1853. } catch (ex2) {
  1854. return false;
  1855. }
  1856. };
  1857. SWFUpload.prototype.displayDebugInfo = function () {
  1858. this.debug(
  1859. [
  1860. "---SWFUpload Instance Info---\n",
  1861. "Version: ", SWFUpload.version, "\n",
  1862. "Movie Name: ", this.movieName, "\n",
  1863. "Settings:\n",
  1864. "\t", "upload_url: ", this.settings.upload_url, "\n",
  1865. "\t", "flash_url: ", this.settings.flash_url, "\n",
  1866. "\t", "use_query_string: ", this.settings.use_query_string.toString(), "\n",
  1867. "\t", "requeue_on_error: ", this.settings.requeue_on_error.toString(), "\n",
  1868. "\t", "http_success: ", this.settings.http_success.join(", "), "\n",
  1869. "\t", "assume_success_timeout: ", this.settings.assume_success_timeout, "\n",
  1870. "\t", "file_post_name: ", this.settings.file_post_name, "\n",
  1871. "\t", "post_params: ", this.settings.post_params.toString(), "\n",
  1872. "\t", "file_types: ", this.settings.file_types, "\n",
  1873. "\t", "file_types_description: ", this.settings.file_types_description, "\n",
  1874. "\t", "file_size_limit: ", this.settings.file_size_limit, "\n",
  1875. "\t", "file_upload_limit: ", this.settings.file_upload_limit, "\n",
  1876. "\t", "file_queue_limit: ", this.settings.file_queue_limit, "\n",
  1877. "\t", "debug: ", this.settings.debug.toString(), "\n",
  1878. "\t", "prevent_swf_caching: ", this.settings.prevent_swf_caching.toString(), "\n",
  1879. "\t", "button_placeholder_id: ", this.settings.button_placeholder_id.toString(), "\n",
  1880. "\t", "button_placeholder: ", (this.settings.button_placeholder ? "Set" : "Not Set"), "\n",
  1881. "\t", "button_image_url: ", this.settings.button_image_url.toString(), "\n",
  1882. "\t", "button_width: ", this.settings.button_width.toString(), "\n",
  1883. "\t", "button_height: ", this.settings.button_height.toString(), "\n",
  1884. "\t", "button_text: ", this.settings.button_text.toString(), "\n",
  1885. "\t", "button_text_style: ", this.settings.button_text_style.toString(), "\n",
  1886. "\t", "button_text_top_padding: ", this.settings.button_text_top_padding.toString(), "\n",
  1887. "\t", "button_text_left_padding: ", this.settings.button_text_left_padding.toString(), "\n",
  1888. "\t", "button_action: ", this.settings.button_action.toString(), "\n",
  1889. "\t", "button_disabled: ", this.settings.button_disabled.toString(), "\n",
  1890. "\t", "custom_settings: ", this.settings.custom_settings.toString(), "\n",
  1891. "Event Handlers:\n",
  1892. "\t", "swfupload_loaded_handler assigned: ", (typeof this.settings.swfupload_loaded_handler === "function").toString(), "\n",
  1893. "\t", "file_dialog_start_handler assigned: ", (typeof this.settings.file_dialog_start_handler === "function").toString(), "\n",
  1894. "\t", "file_queued_handler assigned: ", (typeof this.settings.file_queued_handler === "function").toString(), "\n",
  1895. "\t", "file_queue_error_handler assigned: ", (typeof this.settings.file_queue_error_handler === "function").toString(), "\n",
  1896. "\t", "upload_start_handler assigned: ", (typeof this.settings.upload_start_handler === "function").toString(), "\n",
  1897. "\t", "upload_progress_handler assigned: ", (typeof this.settings.upload_progress_handler === "function").toString(), "\n",
  1898. "\t", "upload_error_handler assigned: ", (typeof this.settings.upload_error_handler === "function").toString(), "\n",
  1899. "\t", "upload_success_handler assigned: ", (typeof this.settings.upload_success_handler === "function").toString(), "\n",
  1900. "\t", "upload_complete_handler assigned: ", (typeof this.settings.upload_complete_handler === "function").toString(), "\n",
  1901. "\t", "debug_handler assigned: ", (typeof this.settings.debug_handler === "function").toString(), "\n"
  1902. ].join("")
  1903. );
  1904. };
  1905. /* Note: addSetting and getSetting are no longer used by SWFUpload but are included
  1906. the maintain v2 API compatibility
  1907. */
  1908. SWFUpload.prototype.addSetting = function (name, value, default_value) {
  1909. if (value == undefined) {
  1910. return (this.settings[name] = default_value);
  1911. } else {
  1912. return (this.settings[name] = value);
  1913. }
  1914. };
  1915. SWFUpload.prototype.getSetting = function (name) {
  1916. if (this.settings[name] != undefined) {
  1917. return this.settings[name];
  1918. }
  1919. return "";
  1920. };
  1921. SWFUpload.prototype.callFlash = function (functionName, argumentArray) {
  1922. argumentArray = argumentArray || [];
  1923. var movieElement = this.getMovieElement();
  1924. var returnValue, returnString;
  1925. try {
  1926. returnString = movieElement.CallFunction('<invoke name="' + functionName + '" returntype="javascript">' + __flash__argumentsToXML(argumentArray, 0) + '</invoke>');
  1927. returnValue = eval(returnString);
  1928. } catch (ex) {
  1929. throw "Call to " + functionName + " failed";
  1930. }
  1931. if (returnValue != undefined && typeof returnValue.post === "object") {
  1932. returnValue = this.unescapeFilePostParams(returnValue);
  1933. }
  1934. return returnValue;
  1935. };
  1936. /* *****************************
  1937. -- Flash control methods --
  1938. Your UI should use these
  1939. to operate SWFUpload
  1940. ***************************** */
  1941. SWFUpload.prototype.selectFile = function () {
  1942. this.callFlash("SelectFile");
  1943. };
  1944. SWFUpload.prototype.selectFiles = function () {
  1945. this.callFlash("SelectFiles");
  1946. };
  1947. SWFUpload.prototype.startUpload = function (fileID) {
  1948. this.callFlash("StartUpload", [fileID]);
  1949. };
  1950. SWFUpload.prototype.cancelUpload = function (fileID, triggerErrorEvent) {
  1951. if (triggerErrorEvent !== false) {
  1952. triggerErrorEvent = true;
  1953. }
  1954. this.callFlash("CancelUpload", [fileID, triggerErrorEvent]);
  1955. };
  1956. SWFUpload.prototype.stopUpload = function () {
  1957. this.callFlash("StopUpload");
  1958. };
  1959. /* ************************
  1960. * Settings methods
  1961. * These methods change the SWFUpload settings.
  1962. * SWFUpload settings should not be changed directly on the settings object
  1963. * since many of the settings need to be passed to Flash in order to take
  1964. * effect.
  1965. * *********************** */
  1966. SWFUpload.prototype.getStats = function () {
  1967. return this.callFlash("GetStats");
  1968. };
  1969. SWFUpload.prototype.setStats = function (statsObject) {
  1970. this.callFlash("SetStats", [statsObject]);
  1971. };
  1972. SWFUpload.prototype.getFile = function (fileID) {
  1973. if (typeof(fileID) === "number") {
  1974. return this.callFlash("GetFileByIndex", [fileID]);
  1975. } else {
  1976. return this.callFlash("GetFile", [fileID]);
  1977. }
  1978. };
  1979. SWFUpload.prototype.addFileParam = function (fileID, name, value) {
  1980. return this.callFlash("AddFileParam", [fileID, name, value]);
  1981. };
  1982. SWFUpload.prototype.removeFileParam = function (fileID, name) {
  1983. this.callFlash("RemoveFileParam", [fileID, name]);
  1984. };
  1985. SWFUpload.prototype.setUploadURL = function (url) {
  1986. this.settings.upload_url = url.toString();
  1987. this.callFlash("SetUploadURL", [url]);
  1988. };
  1989. SWFUpload.prototype.setPostParams = function (paramsObject) {
  1990. this.settings.post_params = paramsObject;
  1991. this.callFlash("SetPostParams", [paramsObject]);
  1992. };
  1993. SWFUpload.prototype.addPostParam = function (name, value) {
  1994. this.settings.post_params[name] = value;
  1995. this.callFlash("SetPostParams", [this.settings.post_params]);
  1996. };
  1997. SWFUpload.prototype.removePostParam = function (name) {
  1998. delete this.settings.post_params[name];
  1999. this.callFlash("SetPostParams", [this.settings.post_params]);
  2000. };
  2001. SWFUpload.prototype.setFileTypes = function (types, description) {
  2002. this.settings.file_types = types;
  2003. this.settings.file_types_description = description;
  2004. this.callFlash("SetFileTypes", [types, description]);
  2005. };
  2006. SWFUpload.prototype.setFileSizeLimit = function (fileSizeLimit) {
  2007. this.settings.file_size_limit = fileSizeLimit;
  2008. this.callFlash("SetFileSizeLimit", [fileSizeLimit]);
  2009. };
  2010. SWFUpload.prototype.setFileUploadLimit = function (fileUploadLimit) {
  2011. this.settings.file_upload_limit = fileUploadLimit;
  2012. this.callFlash("SetFileUploadLimit", [fileUploadLimit]);
  2013. };
  2014. SWFUpload.prototype.setFileQueueLimit = function (fileQueueLimit) {
  2015. this.settings.file_queue_limit = fileQueueLimit;
  2016. this.callFlash("SetFileQueueLimit", [fileQueueLimit]);
  2017. };
  2018. SWFUpload.prototype.setFilePostName = function (filePostName) {
  2019. this.settings.file_post_name = filePostName;
  2020. this.callFlash("SetFilePostName", [filePostName]);
  2021. };
  2022. SWFUpload.prototype.setUseQueryString = function (useQueryString) {
  2023. this.settings.use_query_string = useQueryString;
  2024. this.callFlash("SetUseQueryString", [useQueryString]);
  2025. };
  2026. SWFUpload.prototype.setRequeueOnError = function (requeueOnError) {
  2027. this.settings.requeue_on_error = requeueOnError;
  2028. this.callFlash("SetRequeueOnError", [requeueOnError]);
  2029. };
  2030. SWFUpload.prototype.setHTTPSuccess = function (http_status_codes) {
  2031. if (typeof http_status_codes === "string") {
  2032. http_status_codes = http_status_codes.replace(" ", "").split(",");
  2033. }
  2034. this.settings.http_success = http_status_codes;
  2035. this.callFlash("SetHTTPSuccess", [http_status_codes]);
  2036. };
  2037. SWFUpload.prototype.setAssumeSuccessTimeout = function (timeout_seconds) {
  2038. this.settings.assume_success_timeout = timeout_seconds;
  2039. this.callFlash("SetAssumeSuccessTimeout", [timeout_seconds]);
  2040. };
  2041. SWFUpload.prototype.setDebugEnabled = function (debugEnabled) {
  2042. this.settings.debug_enabled = debugEnabled;
  2043. this.callFlash("SetDebugEnabled", [debugEnabled]);
  2044. };
  2045. SWFUpload.prototype.setButtonImageURL = function (buttonImageURL) {
  2046. if (buttonImageURL == undefined) {
  2047. buttonImageURL = "";
  2048. }
  2049. this.settings.button_image_url = buttonImageURL;
  2050. this.callFlash("SetButtonImageURL", [buttonImageURL]);
  2051. };
  2052. SWFUpload.prototype.setButtonDimensions = function (width, height) {
  2053. this.settings.button_width = width;
  2054. this.settings.button_height = height;
  2055. var movie = this.getMovieElement();
  2056. if (movie != undefined) {
  2057. movie.style.width = width + "px";
  2058. movie.style.height = height + "px";
  2059. }
  2060. this.callFlash("SetButtonDimensions", [width, height]);
  2061. };
  2062. SWFUpload.prototype.setButtonText = function (html) {
  2063. this.settings.button_text = html;
  2064. this.callFlash("SetButtonText", [html]);
  2065. };
  2066. SWFUpload.prototype.setButtonTextPadding = function (left, top) {
  2067. this.settings.button_text_top_padding = top;
  2068. this.settings.button_text_left_padding = left;
  2069. this.callFlash("SetButtonTextPadding", [left, top]);
  2070. };
  2071. SWFUpload.prototype.setButtonTextStyle = function (css) {
  2072. this.settings.button_text_style = css;
  2073. this.callFlash("SetButtonTextStyle", [css]);
  2074. };
  2075. SWFUpload.prototype.setButtonDisabled = function (isDisabled) {
  2076. this.settings.button_disabled = isDisabled;
  2077. this.callFlash("SetButtonDisabled", [isDisabled]);
  2078. };
  2079. SWFUpload.prototype.setButtonAction = function (buttonAction) {
  2080. this.settings.button_action = buttonAction;
  2081. this.callFlash("SetButtonAction", [buttonAction]);
  2082. };
  2083. SWFUpload.prototype.setButtonCursor = function (cursor) {
  2084. this.settings.button_cursor = cursor;
  2085. this.callFlash("SetButtonCursor", [cursor]);
  2086. };
  2087. /* *******************************
  2088. Flash Event Interfaces
  2089. These functions are used by Flash to trigger the various
  2090. events.
  2091. All these functions a Private.
  2092. Because the ExternalInterface library is buggy the event calls
  2093. are added to a queue and the queue then executed by a setTimeout.
  2094. This ensures that events are executed in a determinate order and that
  2095. the ExternalInterface bugs are avoided.
  2096. ******************************* */
  2097. SWFUpload.prototype.queueEvent = function (handlerName, argumentArray) {
  2098. if (argumentArray == undefined) {
  2099. argumentArray = [];
  2100. } else if (!(argumentArray instanceof Array)) {
  2101. argumentArray = [argumentArray];
  2102. }
  2103. var self = this;
  2104. if (typeof this.settings[handlerName] === "function") {
  2105. this.eventQueue.push(function () {
  2106. this.settings[handlerName].apply(this, argumentArray);
  2107. });
  2108. setTimeout(function () {
  2109. self.executeNextEvent();
  2110. }, 0);
  2111. } else if (this.settings[handlerName] !== null) {
  2112. throw "Event handler " + handlerName + " is unknown or is not a function";
  2113. }
  2114. };
  2115. SWFUpload.prototype.executeNextEvent = function () {
  2116. var f = this.eventQueue ? this.eventQueue.shift() : null;
  2117. if (typeof(f) === "function") {
  2118. f.apply(this);
  2119. }
  2120. };
  2121. SWFUpload.prototype.unescapeFilePostParams = function (file) {
  2122. var reg = /[$]([0-9a-f]{4})/i;
  2123. var unescapedPost = {};
  2124. var uk;
  2125. if (file != undefined) {
  2126. for (var k in file.post) {
  2127. if (file.post.hasOwnProperty(k)) {
  2128. uk = k;
  2129. var match;
  2130. while ((match = reg.exec(uk)) !== null) {
  2131. uk = uk.replace(match[0], String.fromCharCode(parseInt("0x" + match[1], 16)));
  2132. }
  2133. unescapedPost[uk] = file.post[k];
  2134. }
  2135. }
  2136. file.post = unescapedPost;
  2137. }
  2138. return file;
  2139. };
  2140. SWFUpload.prototype.testExternalInterface = function () {
  2141. try {
  2142. return this.callFlash("TestExternalInterface");
  2143. } catch (ex) {
  2144. return false;
  2145. }
  2146. };
  2147. SWFUpload.prototype.flashReady = function () {
  2148. var movieElement = this.getMovieElement();
  2149. if (!movieElement) {
  2150. this.debug("Flash called back ready but the flash movie can't be found.");
  2151. return;
  2152. }
  2153. this.cleanUp(movieElement);
  2154. this.queueEvent("swfupload_loaded_handler");
  2155. };
  2156. SWFUpload.prototype.cleanUp = function (movieElement) {
  2157. try {
  2158. if (this.movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE
  2159. this.debug("Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)");
  2160. for (var key in movieElement) {
  2161. try {
  2162. if (typeof(movieElement[key]) === "function") {
  2163. movieElement[key] = null;
  2164. }
  2165. } catch (ex) {
  2166. }
  2167. }
  2168. }
  2169. } catch (ex1) {
  2170. }
  2171. window["__flash__removeCallback"] = function (instance, name) {
  2172. try {
  2173. if (instance) {
  2174. instance[name] = null;
  2175. }
  2176. } catch (flashEx) {
  2177. }
  2178. };
  2179. };
  2180. /* This is a chance to do something before the browse window opens */
  2181. SWFUpload.prototype.fileDialogStart = function () {
  2182. this.queueEvent("file_dialog_start_handler");
  2183. };
  2184. /* Called when a file is successfully added to the queue. */
  2185. SWFUpload.prototype.fileQueued = function (file) {
  2186. file = this.unescapeFilePostParams(file);
  2187. this.queueEvent("file_queued_handler", file);
  2188. };
  2189. /* Handle errors that occur when an attempt to queue a file fails. */
  2190. SWFUpload.prototype.fileQueueError = function (file, errorCode, message) {
  2191. file = this.unescapeFilePostParams(file);
  2192. this.queueEvent("file_queue_error_handler", [file, errorCode, message]);
  2193. };
  2194. /* Called after the file dialog has closed and the selected files have been queued.
  2195. You could call startUpload here if you want the queued files to begin uploading immediately. */
  2196. SWFUpload.prototype.fileDialogComplete = function (numFilesSelected, numFilesQueued, numFilesInQueue) {
  2197. this.queueEvent("file_dialog_complete_handler", [numFilesSelected, numFilesQueued, numFilesInQueue]);
  2198. };
  2199. SWFUpload.prototype.uploadStart = function (file) {
  2200. file = this.unescapeFilePostParams(file);
  2201. this.queueEvent("return_upload_start_handler", file);
  2202. };
  2203. SWFUpload.prototype.returnUploadStart = function (file) {
  2204. var returnValue;
  2205. if (typeof this.settings.upload_start_handler === "function") {
  2206. file = this.unescapeFilePostParams(file);
  2207. returnValue = this.settings.upload_start_handler.call(this, file);
  2208. } else if (this.settings.upload_start_handler != undefined) {
  2209. throw "upload_start_handler must be a function";
  2210. }
  2211. if (returnValue === undefined) {
  2212. returnValue = true;
  2213. }
  2214. returnValue = !!returnValue;
  2215. this.callFlash("ReturnUploadStart", [returnValue]);
  2216. };
  2217. SWFUpload.prototype.uploadProgress = function (file, bytesComplete, bytesTotal) {
  2218. file = this.unescapeFilePostParams(file);
  2219. this.queueEvent("upload_progress_handler", [file, bytesComplete, bytesTotal]);
  2220. };
  2221. SWFUpload.prototype.uploadError = function (file, errorCode, message) {
  2222. file = this.unescapeFilePostParams(file);
  2223. this.queueEvent("upload_error_handler", [file, errorCode, message]);
  2224. };
  2225. SWFUpload.prototype.uploadSuccess = function (file, serverData, responseReceived) {
  2226. file = this.unescapeFilePostParams(file);
  2227. this.queueEvent("upload_success_handler", [file, serverData, responseReceived]);
  2228. };
  2229. SWFUpload.prototype.uploadComplete = function (file) {
  2230. file = this.unescapeFilePostParams(file);
  2231. this.queueEvent("upload_complete_handler", file);
  2232. };
  2233. /* Called by SWFUpload JavaScript and Flash functions when debug is enabled. By default it writes messages to the
  2234. internal debug console. You can override this event and have messages written where you want. */
  2235. SWFUpload.prototype.debug = function (message) {
  2236. this.queueEvent("debug_handler", message);
  2237. };
  2238. /* **********************************
  2239. Debug Console
  2240. The debug console is a self contained, in page location
  2241. for debug message to be sent. The Debug Console adds
  2242. itself to the body if necessary.
  2243. The console is automatically scrolled as messages appear.
  2244. If you are using your own debug handler or when you deploy to production and
  2245. have debug disabled you can remove these functions to reduce the file size
  2246. and complexity.
  2247. ********************************** */
  2248. SWFUpload.prototype.debugMessage = function (message) {
  2249. if (this.settings.debug) {
  2250. var exceptionMessage, exceptionValues = [];
  2251. if (typeof message === "object" && typeof message.name === "string" && typeof message.message === "string") {
  2252. for (var key in message) {
  2253. if (message.hasOwnProperty(key)) {
  2254. exceptionValues.push(key + ": " + message[key]);
  2255. }
  2256. }
  2257. exceptionMessage = exceptionValues.join("\n") || "";
  2258. exceptionValues = exceptionMessage.split("\n");
  2259. exceptionMessage = "EXCEPTION: " + exceptionValues.join("\nEXCEPTION: ");
  2260. SWFUpload.Console.writeLine(exceptionMessage);
  2261. } else {
  2262. SWFUpload.Console.writeLine(message);
  2263. }
  2264. }
  2265. };
  2266. SWFUpload.Console = {};
  2267. SWFUpload.Console.writeLine = function (message) {
  2268. var console, documentForm;
  2269. try {
  2270. console = document.getElementById("SWFUpload_Console");
  2271. if (!console) {
  2272. documentForm = document.createElement("form");
  2273. document.getElementsByTagName("body")[0].appendChild(documentForm);
  2274. console = document.createElement("textarea");
  2275. console.id = "SWFUpload_Console";
  2276. console.style.fontFamily = "monospace";
  2277. console.setAttribute("wrap", "off");
  2278. console.wrap = "off";
  2279. console.style.overflow = "auto";
  2280. console.style.width = "700px";
  2281. console.style.height = "350px";
  2282. console.style.margin = "5px";
  2283. documentForm.appendChild(console);
  2284. }
  2285. console.value += message + "\n";
  2286. console.scrollTop = console.scrollHeight - console.clientHeight;
  2287. } catch (ex) {
  2288. alert("Exception: " + ex.name + " Message: " + ex.message);
  2289. }
  2290. };
  2291. Model.TemplateManager = function(){
  2292. this.templates = [];
  2293. var _self = this;
  2294. this.loadTemplates = function(layerId){
  2295. var url = "/layers/" + layerId + "/property_templates"
  2296. AjaxRequest.get(url, function(response){
  2297. _self._getTemplatesEventHandler(response);
  2298. })
  2299. };
  2300. this._getTemplatesEventHandler = function(response){
  2301. if(response.status == 200){
  2302. var templatesChanged = new Events.TemplatesEvent(Events.TemplatesEvent.TEMPLATES_CHANGED);
  2303. _self.templates = Json.decode(response.responseText);
  2304. GEvent.dispatchEvent(templatesChanged);
  2305. }
  2306. };
  2307. }
  2308. Events.TemplatesEvent = function(type,data){
  2309. this.type = type;
  2310. this.data = data;
  2311. }
  2312. Events.TemplatesEvent.TEMPLATES_CHANGED = 'templatesChangedTemplatesEvent';
  2313. Events.TemplatesEvent.TEMPLATES_LOAD = 'templatesLoadTemplatesEvent';
  2314. View.HomeView = function(){
  2315. this.element = null;
  2316. this.presenter = new Presenter.HomePresenter(this);
  2317. };
  2318. View.HomeView.prototype = {
  2319. createElement: function(){
  2320. var _self = this;
  2321. this.element = new Ext.Viewport({
  2322. layout: 'border',
  2323. items: [
  2324. {
  2325. region: 'north',
  2326. id: 'header',
  2327. border: true,
  2328. autoHeight: true,
  2329. items: [
  2330. {
  2331. html: _self.applicationTitle(),
  2332. id: "header_title",
  2333. border: false
  2334. },
  2335. _self.presenter.getLoginView()
  2336. ]
  2337. },
  2338. _self.presenter.getViewElement()
  2339. ],
  2340. listeners: {
  2341. afterRender: function(elm){ _self._onload(elm) }
  2342. }
  2343. });
  2344. },
  2345. _onload: function(elm){
  2346. this.presenter.getLayerWindowView();
  2347. this.presenter.children.layerWindowPresenter.showLayerWindow();
  2348. },
  2349. getElement: function(){
  2350. return this.element;
  2351. },
  2352. createMapView: function(){
  2353. return new View.MapView();
  2354. },
  2355. createLoginView: function(){
  2356. return new View.LoginView();
  2357. },
  2358. createLayerWindowView: function(){
  2359. return new View.LayerWindowView();
  2360. },
  2361. redraw: function(){
  2362. this.presenter.redrawChildren();
  2363. },
  2364. createMyLayerView: function(){
  2365. return new View.MyLayerView();
  2366. },
  2367. applicationTitle: function(){
  2368. return "<a href='javascript:void(0)' onclick=\"window.open('http://resourcemap.instedd.org/');return false;\" target='_blank'>Dynamic Resource Map</a>";
  2369. },
  2370. createImportResourceView: function(){
  2371. return new View.ImportResourcesView();
  2372. },
  2373. createConfirmDataResourcesView: function(){
  2374. return new View.ConfirmDataResourcesView();
  2375. },
  2376. createFrontLayerView: function(){
  2377. return new View.FrontLayerView();
  2378. },
  2379. createFrontMemberView: function(){
  2380. return new View.FrontMemberView();
  2381. }
  2382. }
  2383. Presenter.HomePresenter = function(view){
  2384. this.view = view;
  2385. this.children = {};
  2386. }
  2387. Presenter.HomePresenter.prototype = {
  2388. initialize: function(){
  2389. this.view.createElement();
  2390. },
  2391. getCookieUser: function(){
  2392. return Ext.util.Cookies.get("user");
  2393. },
  2394. getMapPresenter: function(){
  2395. return this.children.mapPresenter;
  2396. },
  2397. getViewElement:function(){
  2398. if(!this.children.mapPresenter){
  2399. this.children.mapPresenter = this.view.createMapView().presenter;
  2400. }
  2401. return this.children.mapPresenter.getElement();
  2402. },
  2403. getLoginView: function(){
  2404. if(!this.children.loginPresenter){
  2405. this.children.loginPresenter = this.view.createLoginView().presenter;
  2406. }
  2407. return this.children.loginPresenter.getElement();
  2408. },
  2409. loginSuccess: function(){
  2410. this.view.redraw();
  2411. },
  2412. loginFailed: function(){
  2413. this.children.loginPresenter.loginFailed();
  2414. },
  2415. redrawChildren: function(){
  2416. this.children.loginPresenter.redraw();
  2417. this.children.layerWindowPresenter.redraw();
  2418. this.children.loginPresenter.showMap();
  2419. },
  2420. getLayerWindowView: function(){
  2421. if(!this.children.layerWindowPresenter){
  2422. this.children.layerWindowPresenter = this.view.createLayerWindowView().presenter;
  2423. }
  2424. },
  2425. getMyLayerPresenter: function(){
  2426. if(!this.children.myLayerPresenter){
  2427. this.children.myLayerPresenter = this.view.createMyLayerView().presenter;
  2428. }
  2429. return this.children.myLayerPresenter;
  2430. },
  2431. hideAll: function(){
  2432. try{
  2433. this.children.myLayerPresenter.hideView();
  2434. this.children.mapPresenter.hideView();
  2435. }
  2436. catch(ex){
  2437. }
  2438. },
  2439. logoutSuccess: function(){
  2440. this.view.redraw();
  2441. },
  2442. getImportResourcePresenter: function(){
  2443. if(!this.children.importResourcesPresenter){
  2444. this.children.importResourcesPresenter = this.view.createImportResourceView().presenter;
  2445. }
  2446. return this.children.importResourcesPresenter;
  2447. },
  2448. getConfirmDataResourcesPresenter: function(){
  2449. if(!this.children.confirmDataResourcesPresenter){
  2450. this.children.confirmDataResourcesPresenter = this.view.createConfirmDataResourcesView().presenter;
  2451. }
  2452. return this.children.confirmDataResourcesPresenter;
  2453. },
  2454. getFrontLayerPresenter: function(){
  2455. if(!this.children.frontLayerPresenter){
  2456. this.children.frontLayerPresenter = this.view.createFrontLayerView().presenter;
  2457. }
  2458. return this.children.frontLayerPresenter;
  2459. },
  2460. getFrontMemberPresenter: function(){
  2461. if(!this.children.frontMemberPresenter){
  2462. this.children.frontMemberPresenter = this.view.createFrontMemberView().presenter;
  2463. }
  2464. return this.children.frontMemberPresenter;
  2465. }
  2466. }
  2467. View.MapView = function(){
  2468. this.element = null;
  2469. this.presenter = new Presenter.MapPresenter(this, new GoogleMapApi());
  2470. this.presenter.initialize();
  2471. };
  2472. View.MapView.prototype = {
  2473. createElement: function(){
  2474. var _self = this;
  2475. this.element = new Ext.Container({
  2476. region: 'center',
  2477. id : "region_center",
  2478. listeners: {
  2479. render: function(elm){
  2480. _self.presenter.initializeMap(elm.el.dom);
  2481. }
  2482. }
  2483. });
  2484. },
  2485. getElement: function(){
  2486. return this.element;
  2487. },
  2488. setMarkerPosition: function(marker, lat, lng) {
  2489. this.presenter.setMarkerPosition(marker, lat, lng);
  2490. },
  2491. addMarker: function(marker){
  2492. this.presenter.createMarker(marker);
  2493. },
  2494. hide: function(){
  2495. Ext.getCmp("region_center").hide();
  2496. },
  2497. show: function(){
  2498. Ext.getCmp("region_center").show();
  2499. },
  2500. processMarkerItemVisibility: function(marker,visible){
  2501. this.presenter.setMarkerVisibility(marker,visible);
  2502. },
  2503. generateMarkerItem:function(resource){
  2504. this.presenter.generateMarkerItem(resource);
  2505. },
  2506. showLoadingWindow: function(){
  2507. this.myMask = new Ext.LoadMask(Ext.getBody(), {msg:"Loading ..."});
  2508. this.myMask.show();
  2509. },
  2510. closeLoadingWindow: function(){
  2511. this.myMask.hide();
  2512. }
  2513. }
  2514. Presenter.MapPresenter = function(view, map_api){
  2515. this.view = view;
  2516. this.map_api = map_api;
  2517. };
  2518. Presenter.MapPresenter.prototype = {
  2519. initialize: function(){
  2520. this.view.createElement();
  2521. },
  2522. getElement: function(){
  2523. return this.view.getElement();
  2524. },
  2525. initializeMap: function(canvas){
  2526. this.map_api.initializeMap(canvas);
  2527. },
  2528. getIconFullPath: function(resource){
  2529. var icon = Helper.layerHelper.getIcon(resource.layer_id);
  2530. return SETTING.MARKER_ICON_PATH + icon;
  2531. },
  2532. populate: function(resources){
  2533. this.map_api.clearAllMarkers();
  2534. var _self = this;
  2535. for(var i = 0; i < resources.length; i++){
  2536. this.view.generateMarkerItem(resources[i]);
  2537. }
  2538. this.fitBounds();
  2539. },
  2540. fitBounds: function(){
  2541. this.map_api.fitBounds();
  2542. },
  2543. generateMarkerItem: function(resource){
  2544. var _self = this;
  2545. var marker = this.createMarker({
  2546. lat: resource.lat,
  2547. lng: resource.lng,
  2548. icon: _self.getIconFullPath(resource),
  2549. layer_id: resource.layer_id,
  2550. id: resource.id
  2551. });
  2552. this.addMarkerClickListener(marker, resource.id, this._handleMarkerClickEvent);
  2553. },
  2554. setLayerMarkersVisibility: function(marker,layer_id){
  2555. var checked = Util.func.getLayerChecked(layer_id);
  2556. this.setMarkerVisibility(marker,checked);
  2557. },
  2558. createDraggableMarker: function(marker) {
  2559. var icon = SETTING.MARKER_ICON_PATH + SETTING.MARKER_ICON_DRAGGABLE;
  2560. this.draggableMarker = this.map_api.createDraggableMarker(marker.title, marker.lat, marker.lng,icon);
  2561. return this.draggableMarker;
  2562. },
  2563. setDraggableMarker: function(draggable) {
  2564. this.draggableMarker.setDraggable(draggable);
  2565. },
  2566. addListener: function(object, eventName, handler) {
  2567. this.map_api.addListener(object, eventName, handler);
  2568. },
  2569. showDraggableMarker: function(strLatLng) {
  2570. var _self = this;
  2571. var defaultLat = null;
  2572. var defaultLng = null;
  2573. if(strLatLng){
  2574. latlng = strLatLng.split(",");
  2575. if(latlng.length>1){
  2576. defaultLat = latlng[0];
  2577. defaultLng= latlng[1];
  2578. }
  2579. }
  2580. if(!defaultLat && !defaultLng){
  2581. var defaultLatLng = this.map_api.getCenter();
  2582. defaultLat = defaultLatLng.lat(); //SETTING.MARKER_DEFAULT_LAT ;
  2583. defaultLng = defaultLatLng.lng();//SETTING.MARKER_DEFAULT_LNG ;
  2584. }
  2585. if (!this.draggableMarker) {
  2586. this.draggableMarker = this.createDraggableMarker({
  2587. title: "New Resource",
  2588. lat: defaultLat,
  2589. lng: defaultLng
  2590. });
  2591. this.addListener(this.draggableMarker, 'dragstart', function(mouseEvent){
  2592. });
  2593. this.addListener(this.draggableMarker, 'dragend', function(mouseEvent){
  2594. var layerId = Util.Cookies.get("selected_layer");
  2595. _self.updateMarkerLocation(mouseEvent.latLng.lat(),mouseEvent.latLng.lng());
  2596. });
  2597. }
  2598. this.draggableMarker.setDraggable(true);
  2599. this.setMarkerVisibility(this.draggableMarker,true);
  2600. this.updateMarkerLocation(defaultLat,defaultLng);
  2601. },
  2602. updateMarkerLocation: function(lat,lng){
  2603. var latLng = {lat:lat,lng:lng};
  2604. GEvent.dispatchEvent(new Events.LayersEvent(Events.LayersEvent.LAYERS_UPDATE_RESOURCE_LOCATION_DRAGGING,latLng ));
  2605. },
  2606. removeDraggableMarker: function() {
  2607. if(this.draggableMarker){
  2608. this.setMarkerVisibility(this.draggableMarker, false);
  2609. this.draggableMarker.setMap(null);
  2610. this.draggableMarker = null;
  2611. }
  2612. },
  2613. resetDraggleMarkerPosition: function(){
  2614. this.map_api.setMarkerPosition(this.draggableMarker,12.531833844565536,103.86724853515625 );
  2615. },
  2616. setDraggableMarkerVisibility: function(visible){
  2617. if(this.draggableMarker)
  2618. this.draggableMarker.setVisible(visible);
  2619. },
  2620. setMarkerDraggability: function(draggable) {
  2621. this.map_api.setMarkerDraggability(this.draggableMarker,draggable);
  2622. },
  2623. updateResourceMarker: function(resource,layers){
  2624. resource.icon = this.getIconFullPath(resource);
  2625. var marker = this.createMarker(resource);
  2626. this.addMarkerClickListener(marker, resource.id, this._handleMarkerClickEvent);
  2627. this.removeDraggableMarker();
  2628. },
  2629. createMarker: function(options){
  2630. return this.map_api.createMarker(options);
  2631. },
  2632. embedData:function(marker,key,value){
  2633. this.map_api.attachDataToMarker(marker,key,value);
  2634. },
  2635. addMarkerClickListener: function(marker,data,handler){
  2636. this.map_api.addMarkerClickListener(marker, data, handler);
  2637. },
  2638. setMarkerPosition: function(marker, lat, lng){
  2639. this.map_api.setMarkerPosition(marker, this.map_api.newLatLng(lat, lng));
  2640. },
  2641. _handleMarkerClickEvent: function(id){
  2642. GEvent.dispatchEvent(new Events.ResourcesEvent(Events.ResourcesEvent.RESOURCE_REQUEST_GET_DETAIL, id));
  2643. },
  2644. hideView :function(){
  2645. this.view.hide();
  2646. },
  2647. showView : function(){
  2648. this.view.show();
  2649. },
  2650. setMarkerStatus: function(){
  2651. this.processMarkersVisibility();
  2652. },
  2653. processMarkersVisibility: function(){
  2654. this.map_api.processMarkerVisibility();
  2655. },
  2656. setMarkerVisibility:function(marker,visible){
  2657. marker.setVisible(visible);
  2658. },
  2659. getAllMarkers: function(){
  2660. return this.map_api.getAllMarkers();
  2661. },
  2662. moveToPoint: function(currentResource){
  2663. var latLng = this.map_api.newLatLng(currentResource.lat,currentResource.lng);
  2664. this.map_api.setCenter(latLng);
  2665. this.map_api.setZoom(15);
  2666. },
  2667. updateResouceMarker: function(resource,redraw){
  2668. this.map_api.updateMarkerClusterer(resource,redraw);
  2669. },
  2670. setDraggableMarkerPosition: function(latLong){
  2671. if(this.draggableMarker)
  2672. {
  2673. var latlng = this.map_api.newLatLng(latLong.lat, latLong.lng);
  2674. this.map_api.setMarkerPosition(this.draggableMarker,latlng);
  2675. this.map_api.setCenter(latlng);
  2676. }
  2677. },
  2678. showLoadingWindow: function(){
  2679. this.view.showLoadingWindow();
  2680. },
  2681. closeLoadingWindow: function(){
  2682. this.view.closeLoadingWindow();
  2683. }
  2684. }
  2685. View.LoginView = function(){
  2686. this.element = null;
  2687. this.presenter = new Presenter.LoginPresenter(this);
  2688. this.presenter.initialize();
  2689. }
  2690. View.LoginView.prototype = {
  2691. createElement: function(){
  2692. this.element = new Ext.Panel({id:'frmHeaderRight' ,width:400});
  2693. this.draw();
  2694. },
  2695. getElement: function(){
  2696. return this.element;
  2697. },
  2698. draw: function(){
  2699. if(Authentication.verify()){
  2700. this._drawWelcome();
  2701. }else{
  2702. this._drawForm();
  2703. }
  2704. this.element.doLayout();
  2705. },
  2706. redraw: function(){
  2707. this.element.removeAll(true);
  2708. this.draw();
  2709. },
  2710. getUserName: function(){
  2711. return this.getElement().findById('username').getValue();
  2712. },
  2713. getUsernameBlankText: function(){
  2714. return Ext.getCmp('username').blankText;
  2715. },
  2716. getPassword: function(){
  2717. return this.getElement().findById('secret').getValue();
  2718. },
  2719. getPasswordBlankText: function(){
  2720. return Ext.getCmp('secret').blankText;
  2721. },
  2722. getFormData: function(){
  2723. return this.getElement().get(0).getForm().getValues();
  2724. },
  2725. showWaiting: function(){
  2726. Ext.fly("login_error_msg").update("Waiting for server response").replaceClass('login_error', "login_request").show();
  2727. },
  2728. showInvalidMessage: function(){
  2729. var errorMsg = this.getElement().findById('login_error_msg').getEl();
  2730. errorMsg.update('Invalid Login');
  2731. errorMsg.replaceClass("login_request", 'login_error');
  2732. errorMsg.show();
  2733. },
  2734. _drawWelcome: function(){
  2735. var _self = this;
  2736. var newPanel = new Ext.Panel({
  2737. padding: 15,
  2738. id: 'panelWelcome',
  2739. cls: 'welcome',
  2740. items:[
  2741. {
  2742. html: _self.presenter.drawUserProfile(),
  2743. listeners:{
  2744. afterRender: function(){
  2745. try{
  2746. Ext.get("resources_map").on('click', function(){
  2747. _self.presenter.showMap();
  2748. });
  2749. Ext.get("my_layers").on('click', function(){
  2750. _self.presenter.showMyLayer();
  2751. });
  2752. Ext.get("user_logout").on("click", function(){
  2753. _self.presenter.logout();
  2754. });
  2755. }
  2756. catch(ex){alert("Could not bind child event ")}
  2757. }
  2758. }
  2759. }
  2760. ]
  2761. });
  2762. this.element.add(newPanel);
  2763. },
  2764. _drawAdminProfile: function(){
  2765. var str ="Welcome " + "<b>" + Authentication.getCurrentUser() + "</b>" +
  2766. " | <a href='javascript:void(0);' id='resources_map'> Map </a> " +
  2767. " | <a href='javascript:void(0);' id='my_layers'> My layers </a> " +
  2768. " | <a href='javascript:void(0);' id='user_logout' > Logout </a> ";
  2769. return str;
  2770. },
  2771. _drawUserWelcome: function(){
  2772. var str ="Welcome " + "<b>" + Authentication.getCurrentUser() + "</b>" +
  2773. "<a href='javascript:void(0);' id='resources_map'></a> " +
  2774. "<a href='javascript:void(0);' id='my_layers'></a> " +
  2775. " | <a href='javascript:void(0);' id='user_logout' > Logout </a> ";
  2776. return str;
  2777. },
  2778. passwordBlur: function(){
  2779. var idComp = "secret";
  2780. var elm = Ext.get(idComp);
  2781. var waterMarkText = Ext.getCmp(idComp).initialConfig.blankText;
  2782. if (elm.dom.value == '') {
  2783. elm.dom.value = waterMarkText;
  2784. elm.dom.type = 'text';
  2785. }
  2786. if (elm.dom.value == waterMarkText) {
  2787. elm.addClass('waterMark');
  2788. elm.dom.type = 'text';
  2789. }
  2790. },
  2791. passwordFocus: function(){
  2792. var idComp = "secret";
  2793. var elm = Ext.get(idComp);
  2794. try{
  2795. var waterMarkText = Ext.getCmp(idComp).initialConfig.blankText;
  2796. elm.removeClass('waterMark');
  2797. elm.dom.type = 'password';
  2798. if (elm.dom.value == waterMarkText) {
  2799. elm.dom.value = "";
  2800. }
  2801. }
  2802. catch(ex){
  2803. }
  2804. },
  2805. _drawForm: function(){
  2806. var _self = this;
  2807. this.element.add(new Ext.form.FormPanel({
  2808. id: "login_form",
  2809. layout: "column",
  2810. defaults: {
  2811. xtype: 'textfield',
  2812. style: 'margin:5px;'
  2813. },
  2814. items: [
  2815. {
  2816. id: 'username',
  2817. blankText: "User name",
  2818. value: "User name",
  2819. cls: "ext_form_elm waterMark minSize",
  2820. enableKeyEvents:true,
  2821. listeners:{
  2822. afterRender:function(){
  2823. waterMarkById("username");
  2824. }
  2825. }
  2826. },
  2827. {
  2828. id: 'secret',
  2829. xtype: 'textfield',
  2830. blankText: "Password",
  2831. value: "Password",
  2832. cls: "ext_form_elm waterMark minSize",
  2833. enableKeyEvents: true,
  2834. listeners: {
  2835. blur: _self.passwordBlur,
  2836. focus: _self.passwordFocus,
  2837. keydown:function(ext,e){
  2838. if(e.keyCode == e.ENTER){
  2839. _self.presenter.login();
  2840. }
  2841. }
  2842. }
  2843. },
  2844. {
  2845. xtype: "tbbutton",
  2846. text: 'Login',
  2847. handler: function(){
  2848. _self.presenter.login();
  2849. }
  2850. },
  2851. {
  2852. xtype: "panel",
  2853. id:"login_error_msg",
  2854. html:"error msg",
  2855. style: 'margin:0 5px'
  2856. }
  2857. ]
  2858. }));
  2859. }
  2860. }
  2861. Presenter.LoginPresenter = function(view){
  2862. this.view = view;
  2863. }
  2864. Presenter.LoginPresenter.prototype = {
  2865. initialize: function(){
  2866. this.view.createElement();
  2867. },
  2868. getElement: function(){
  2869. return this.view.getElement();
  2870. },
  2871. login: function(){
  2872. if(this._validateForm()){
  2873. this.view.showWaiting();
  2874. var userLogin = new Events.AuthenticationEvent(Events.AuthenticationEvent.USER_LOGIN);
  2875. userLogin.data = this.view.getFormData();
  2876. GEvent.dispatchEvent(userLogin);
  2877. }else{
  2878. this.view.showInvalidMessage();
  2879. }
  2880. },
  2881. redraw: function(){
  2882. return this.view.redraw();
  2883. },
  2884. loginFailed: function(){
  2885. this.view.showInvalidMessage();
  2886. },
  2887. showMyLayer: function(){
  2888. GEvent.dispatchEvent(new Events.UtilitiesEvent(Events.UtilitiesEvent.VIEW_HIDE_ALL));
  2889. GEvent.dispatchEvent(new Events.LayersEvent(Events.LayersEvent.MYLAYERS_SHOW));
  2890. },
  2891. showMap: function(){
  2892. GEvent.dispatchEvent(new Events.UtilitiesEvent(Events.UtilitiesEvent.VIEW_HIDE_ALL));
  2893. GEvent.dispatchEvent(new Events.MapsEvent(Events.MapsEvent.VIEW_SHOW));
  2894. },
  2895. logout: function(){
  2896. GEvent.dispatchEvent(new Events.AuthenticationEvent(Events.AuthenticationEvent.USER_LOGOUT));
  2897. },
  2898. drawUserProfile: function(){
  2899. if(Authentication.getCurrentUserGroup() == 3 || Authentication.getCurrentUserGroup() == 1){
  2900. return this.view._drawAdminProfile();
  2901. }
  2902. else{
  2903. return this.view._drawUserWelcome();
  2904. }
  2905. },
  2906. _validateForm: function(){
  2907. var usernameBlankText = this.view.getUsernameBlankText();
  2908. var usernameValue = this.view.getUserName();
  2909. var passwordBlankText = this.view.getPasswordBlankText();
  2910. var passwordValue = this.view.getPassword();
  2911. var filled = (usernameValue != usernameBlankText) && (passwordValue != passwordBlankText);
  2912. return (this.view.getUserName().length > 0 && this.view.getPassword().length > 0) && filled;
  2913. }
  2914. }
  2915. View.LayerWindowView = function(){
  2916. this.presenter = new Presenter.LayerWindowPresenter(this);
  2917. this.presenter.initialize();
  2918. };
  2919. View.LayerWindowView.prototype = {
  2920. createLayerWindows: function(){
  2921. new Ext.Window({
  2922. id: "layer_window",
  2923. width: 270,
  2924. title: 'Layers',
  2925. closable: false,
  2926. resizable: true,
  2927. draggable: true,
  2928. autoScroll:true,
  2929. height:35,
  2930. autoFill:true,
  2931. renderTo:document.getElementById("region_center")
  2932. });
  2933. },
  2934. resizeLayerWindow: function(){
  2935. var layerWindow = Ext.getCmp("layer_window");
  2936. var layerItems = Ext.select(".layerBar");
  2937. var contentHeight = 32 + (35*layerItems.elements.length);
  2938. try{
  2939. contentHeight += Ext.fly("resource_form_for").getHeight();
  2940. }
  2941. catch(ex){}
  2942. contentHeight = contentHeight > 590? 590 : contentHeight; // 590 is from top to bottom of layer window screen
  2943. layerWindow.setHeight(contentHeight);
  2944. },
  2945. removeAllLayers: function(){
  2946. var layer_window = Ext.getCmp("layer_window");
  2947. layer_window.removeAll();
  2948. },
  2949. addLayerWithMembership: function(layer){
  2950. var _self = this;
  2951. var layer_window = Ext.getCmp("layer_window");
  2952. layer_window.add({
  2953. id: 'layer_' + layer.id,
  2954. html: _self.generateLayerTitleOwner(layer),
  2955. height: 35,
  2956. cls :"layerBar",
  2957. listeners:{
  2958. afterRender: function(){
  2959. Ext.get('new_layer_' + layer.id).on('click', function(){
  2960. _self.presenter.renderResourceForm(layer.id);
  2961. });
  2962. Ext.get('layer_checkbox_' + layer.id).on('click', function(){
  2963. var checked = this.dom.checked;
  2964. _self.presenter.layerCheckboxClicked(layer.id,checked);
  2965. });
  2966. Ext.get('layer_title_' + layer.id).on('click', function(){
  2967. var el = Ext.get("layer_checkbox_" + layer.id);
  2968. if(el.dom.checked)
  2969. _self.presenter.layerTitleClick(layer);
  2970. });
  2971. }
  2972. }
  2973. });
  2974. },
  2975. generateLayerTitle:function(layer){
  2976. layer.icon = Util.func.getLayerIcon(layer.icon);
  2977. var checked = this.presenter.getLayerChecked(layer.id);
  2978. var layerTitleClass = checked? "": "disable";
  2979. var str = "<div class='layerCheckBox' > <input id='layer_checkbox_"+layer.id+"' type='checkbox' name='checkbox[]' value='"+layer.id+"' "+ checked +" /> </div> ";
  2980. str += "<div class='layerTitle' > <img src='"+ SETTING.MARKER_ICON_PATH+layer.icon +"' alt ='icon' align='left' />" + this.getLayerTitle(layer,layerTitleClass) +"</div>";
  2981. return str;
  2982. },
  2983. generateLayerTitleOwner:function(layer){
  2984. var checked = this.presenter.getLayerChecked(layer.id);
  2985. var layerTitleClass = checked? "": "disable";
  2986. layer.icon = Util.func.getLayerIcon(layer.icon);
  2987. var str = "<div class='layerCheckBox'> <input id='layer_checkbox_"+layer.id+"' type='checkbox' name='checkbox[]' value='"+layer.id+"' "+ checked +" /> </div> ";
  2988. str += "<div class='linkIcon' id='new_layer_" + layer.id + "' rel='" + layer.id + "' > New </div>";
  2989. str += "<div class='layerTitle' > <img src='"+ SETTING.MARKER_ICON_PATH+layer.icon +"' alt ='icon' align='left' />" + this.getLayerTitle(layer,layerTitleClass) +"</div>";
  2990. return str;
  2991. },
  2992. getLayerTitle: function(layer, layerTitleClass){
  2993. var str = " <a href='javascript:void(0);' id='layer_title_" + layer.id + "' rel='" + layer.id + "' class='" + layerTitleClass + "' >"+layer.name+" </a> ";
  2994. return str;
  2995. },
  2996. addLayerWithoutMembership: function(layer){
  2997. var _self = this;
  2998. var layer_window = Ext.getCmp("layer_window");
  2999. layer_window.add({
  3000. id: 'layer_' + layer.id,
  3001. html: _self.generateLayerTitle(layer),
  3002. height: 35,
  3003. cls :"layerBar",
  3004. listeners:{
  3005. afterRender:function(){
  3006. Ext.get('layer_checkbox_' + layer.id).on('click', function(){
  3007. var checked = this.dom.checked;
  3008. _self.presenter.layerCheckboxClicked(layer.id,checked);
  3009. });
  3010. Ext.get('layer_title_' + layer.id).on('click', function(){
  3011. var el = Ext.get("layer_checkbox_" + layer.id);
  3012. if(el.dom.checked)
  3013. _self.presenter.layerTitleClick(layer);
  3014. });
  3015. }
  3016. }
  3017. });
  3018. },
  3019. displayLayerWindow: function(){
  3020. var layerWindow = Ext.getCmp("layer_window");
  3021. layerWindow.show();
  3022. layerWindow.toRightPostion = function(){
  3023. var panelHeaderWidth = Ext.get("header").dom.offsetWidth;
  3024. var panelHeaderHeight = Ext.get("header").dom.offsetHeight;
  3025. var x = panelHeaderWidth - 270 - 5;//whole with minus window size include 5 margin to right
  3026. var y = 25; // panelHeaderHeight coz now the parent is the map
  3027. layerWindow.setPosition(x, y);//dom.style.left,dom.style.top,
  3028. };
  3029. layerWindow.toRightPostion();
  3030. layerWindow.doLayout(); //to redraw window layout
  3031. },
  3032. removeAllOldResourceForm: function(layer){
  3033. Ext.fly(layer.name).removeAll();
  3034. },
  3035. renderResourceForm: function(data){
  3036. var _self = this;
  3037. if (this.resource_form) {
  3038. this.resource_form.removeAll();
  3039. this.resource_form.destroy();
  3040. this.resource_form = null;
  3041. _self.presenter.removeDraggableMarker();
  3042. }
  3043. _self.removeResourceDetailForm();
  3044. this.createResourceForm(data);
  3045. this.resizeLayerWindow();
  3046. },
  3047. createResourceForm: function(data){
  3048. var layerId = data.layer_id;
  3049. var templates = data.templates;
  3050. var _self = this;
  3051. var formId = 'resource_form_for';
  3052. var resourceId = 'resource_name';
  3053. this.resource_form = new Ext.FormPanel({
  3054. id: formId,
  3055. cls: "layerForm",
  3056. bodyStyle: 'padding: 5px;',
  3057. renderTo: 'layer_' + layerId,
  3058. hideLabels: true,
  3059. autoShow :true,
  3060. items: [
  3061. {
  3062. html: 'Add new item',
  3063. cls: 'title',
  3064. },
  3065. {
  3066. xtype: 'hidden',
  3067. name: 'resource[layer_id]',
  3068. value: layerId
  3069. },
  3070. {
  3071. xtype: 'hidden',
  3072. name: 'resource[lat]',
  3073. id: "resource_lat",
  3074. value: "" // SETTING.MARKER_DEFAULT_LAT,
  3075. },
  3076. {
  3077. xtype: 'hidden',
  3078. name: 'resource[lng]',
  3079. id: "resource_lng",
  3080. value: ""//SETTING.MARKER_DEFAULT_LNG,
  3081. },
  3082. {
  3083. xtype: "panel",
  3084. id: "resource_error_msg",
  3085. width: 200,
  3086. cls: "error_msg",
  3087. html: "Error resource msg"
  3088. },
  3089. {
  3090. xtype: 'textfield',
  3091. id: resourceId,
  3092. name: 'resource[name]',
  3093. emptyText: ' Resource Name',
  3094. cls: "resourceName",
  3095. enableKeyEvents:true,
  3096. listeners: {
  3097. focus: _self.hideResourceMessage
  3098. }
  3099. },
  3100. {
  3101. xtype: "panel",
  3102. html: "<a href='javascript:void(0);' class='linkLocation' id='location_anchor_" + layerId + "' > Select Location</a>",
  3103. cls: "selectLocation",
  3104. listeners: {
  3105. afterRender: function(){
  3106. Ext.select(".linkLocation").on("click", function(){
  3107. Util.Cookies.set("selected_layer", layerId);
  3108. _self.disableLayerWindow();
  3109. _self.presenter.showSelectLocationWindow();
  3110. _self.presenter.showDraggableMarker();
  3111. return false;
  3112. });
  3113. }
  3114. }
  3115. },
  3116. {
  3117. xtype: 'panel',
  3118. id: 'properties_template',
  3119. layout: 'form',
  3120. cls: 'properties_template',
  3121. style: 'clear:both;',
  3122. items: _self.renderPropertyTemplates(templates)
  3123. },
  3124. {
  3125. xtype: 'fieldset',
  3126. id: 'properties_fieldset',
  3127. title: 'Add new variable',
  3128. cls: 'fieldset',
  3129. layout: 'anchor',
  3130. hideLabels: true,
  3131. items: [
  3132. {
  3133. xtype: "panel",
  3134. width: 200,
  3135. id: "property_error_msg",
  3136. cls: "error_msg",
  3137. style: 'padding-left: 0px; display: none; margin-bottom: 5px;',
  3138. html: "Label and Value can't be empty"
  3139. },
  3140. {
  3141. layout: 'hbox',
  3142. defaults: {
  3143. margins: '0 5 0 0'
  3144. },
  3145. items: [
  3146. {
  3147. xtype: 'textfield',
  3148. id: 'property_name',
  3149. name: 'property[name]',
  3150. emptyText: ' Label',
  3151. flex: 2,
  3152. enableKeyEvents: true,
  3153. listeners: {
  3154. focus: _self.hidePropertyMessage
  3155. }
  3156. },
  3157. {
  3158. xtype: 'textfield',
  3159. id: 'property_value',
  3160. name: 'property[value]',
  3161. emptyText: ' Value',
  3162. flex: 1,
  3163. enableKeyEvents: true,
  3164. listeners: {
  3165. focus: _self.hidePropertyMessage
  3166. }
  3167. }
  3168. ]
  3169. },
  3170. {
  3171. xtype: 'combo',
  3172. id: 'templates',
  3173. fieldLabel: 'Owner ',
  3174. store: _self.generateStore(templates),
  3175. typeAhead: true,
  3176. triggerAction: 'all',
  3177. lazyRender: true,
  3178. mode: 'local',
  3179. valueField: 'templates',
  3180. displayField: 'templates',
  3181. hiddenName: 'membership[user_id]',
  3182. hideTrigger: true,
  3183. typeAhead: true,
  3184. minChars: 3,
  3185. selectOnFocus: true,
  3186. style: 'margin-top: 5px;display: none;',
  3187. }
  3188. ],
  3189. buttons:[{
  3190. text: 'Add Field',
  3191. handler: function(){
  3192. var templateName = Ext.getCmp('templates').value;
  3193. templateName =(templateName)?templateName:"default";
  3194. _self.presenter.submitPropertyForm(templateName);
  3195. }
  3196. }]
  3197. }
  3198. ],
  3199. buttons: [
  3200. {
  3201. text: 'Save',
  3202. handler: function(){
  3203. _self.presenter.saveResource();
  3204. }
  3205. }
  3206. ]
  3207. });
  3208. },
  3209. handleCreateResourceResponse: function(jsonData) {
  3210. if(jsonData.name) {
  3211. this.presenter.addResource(jsonData);
  3212. this.presenter.removeDraggableMarker();
  3213. this.presenter.resetDraggleMarkerPosition();
  3214. this.resetResourceForm();
  3215. }
  3216. else {
  3217. var errors = [];
  3218. for(var i=0;i<jsonData.length;i++)
  3219. {
  3220. errors.push(jsonData[i][0]+" "+jsonData[i][1]);
  3221. }
  3222. alert(errors.join("\n"));
  3223. }
  3224. },
  3225. closeSelectLocationWindow: function() {
  3226. var select_location_window = Ext.getCmp("select_location_window");
  3227. if(select_location_window)
  3228. select_location_window.close();
  3229. },
  3230. disableLayerWindow: function(){
  3231. Ext.getCmp("layer_window").disable();
  3232. },
  3233. enableLayerWindow: function() {
  3234. Ext.getCmp("layer_window").enable();
  3235. },
  3236. updateLocationAnchor: function(text) {
  3237. if (Ext.fly("location_anchor_" + Ext.util.Cookies.get("selected_layer")) != null)
  3238. Ext.fly("location_anchor_" + Ext.util.Cookies.get("selected_layer")).update(text);
  3239. },
  3240. resetResourceForm: function(){
  3241. Ext.getCmp('resource_name').reset();
  3242. Ext.getCmp('resource_lat').reset();
  3243. Ext.getCmp('resource_lng').reset();
  3244. this.updateLocationAnchor("Select Location");
  3245. this.presenter.resetPropertiesListForm();
  3246. this.resetPropertyForm();
  3247. },
  3248. addLayerItem: function(layer){
  3249. this.presenter.addLayerItem(layer);
  3250. },
  3251. hideResourceMessage: function() {
  3252. if (Ext.fly("resource_error_msg") != null) {
  3253. Ext.fly("resource_error_msg").update('').addClass("error_msg").show();
  3254. }
  3255. },
  3256. hidePropertyMessage: function() {
  3257. if (Ext.fly("property_error_msg") != null) {
  3258. Ext.fly("property_error_msg").dom.style.display="none";
  3259. }
  3260. },
  3261. createSelectLocationWindow: function() {
  3262. var _self = this;
  3263. var windowLocation =Ext.getCmp("select_location_window");
  3264. if (windowLocation) ;
  3265. else {
  3266. windowLocation = new Ext.Window({
  3267. id: "select_location_window",
  3268. title: "Select Location",
  3269. frame: true,
  3270. width: 300,
  3271. renderTo: 'region_center',
  3272. closable: false,
  3273. resizable: false,
  3274. draggable: false,
  3275. items:[{
  3276. xtype:"panel",
  3277. html: "<p class='paragraph_msg'>Move the pin to your prefer location. Click on done when finished.</p>",
  3278. },
  3279. {
  3280. html: "",
  3281. id: 'latLngStatus'
  3282. },
  3283. {
  3284. xtype: 'panel',
  3285. layout: 'form',
  3286. cls: 'paragraph_msg',
  3287. items: [
  3288. {
  3289. xtype: 'textfield',
  3290. fieldLabel: 'Lat',
  3291. id: "resource_lat_tmp",
  3292. name: 'resourceLat',
  3293. labelStyle: 'width: 60px;',
  3294. cls: "minSizeValue",
  3295. },
  3296. {
  3297. xtype: 'textfield',
  3298. fieldLabel: 'Lng',
  3299. id: "resource_lng_tmp",
  3300. name: 'resourceLng',
  3301. labelStyle: 'width: 60px;',
  3302. cls: "minSizeValue",
  3303. }
  3304. ]
  3305. }
  3306. ],
  3307. buttons: [
  3308. {
  3309. text: 'Done',
  3310. handler: function() {
  3311. var lat = Ext.getCmp('resource_lat_tmp').el.dom.value;
  3312. var lng = Ext.getCmp('resource_lng_tmp').el.dom.value;
  3313. if(_self.valideLatLng(lat, lng)){
  3314. _self.enableLayerWindow();
  3315. _self.updateLocationAnchor('Change Location');
  3316. _self.presenter.setMarkerUnDraggable();
  3317. _self.presenter.setPositionDraggableMarker(lat,lng);
  3318. _self.setLatLng(lat, lng);
  3319. _self.presenter.updateResourceLatLngObject(lat, lng);
  3320. _self.closeSelectLocationWindow();
  3321. }
  3322. }
  3323. }
  3324. ]
  3325. });
  3326. }
  3327. windowLocation.show();
  3328. windowLocation.setPosition(90,3);
  3329. } ,
  3330. getFormData: function(id) {
  3331. return Ext.getCmp(id).getForm().getValues();
  3332. },
  3333. showLoginError: function() {
  3334. Ext.fly("login_error_msg").update("Invalid login").replaceClass("login_request", 'login_error').show();
  3335. },
  3336. showRequestLoginMsg: function(){
  3337. Ext.fly("login_error_msg").update("Waiting for server response").replaceClass('login_error', "login_request").show();
  3338. },
  3339. showResourceMessage: function(message,cls) {
  3340. if (Ext.fly("resource_error_msg")){
  3341. Ext.fly("resource_error_msg").update(message).replaceClass("login_request", 'login_error').show();
  3342. Ext.fly("resource_error_msg").dom.className = cls;
  3343. }
  3344. },
  3345. showPropertyMessage: function(message, className) {
  3346. Ext.fly("property_error_msg").update(message);
  3347. Ext.fly("property_error_msg").dom.className = className;
  3348. Ext.fly("property_error_msg").dom.style.display= "block";
  3349. },
  3350. hideResourceMessage: function() {
  3351. if (Ext.fly("resource_error_msg") != null) {
  3352. Ext.fly("resource_error_msg").update('').addClass("error_msg").show();
  3353. }
  3354. },
  3355. renderResourceDetail: function(resource){
  3356. var _self = this;
  3357. _self.removeResourceForm();
  3358. _self.removeResourceDetailForm();
  3359. _self.closeSelectLocationWindow();
  3360. _self.enableLayerWindow();
  3361. _self.createResourceDetailForm(resource);
  3362. _self.presenter.removeDraggableMarker();
  3363. _self.resizeLayerWindow();
  3364. },
  3365. createResourceDetailForm: function(resource){
  3366. var _self = this;
  3367. var layerWindowId = "layer_" + resource.layer_id;
  3368. new Ext.FormPanel({
  3369. cls: "layerForm",
  3370. bodyStyle: 'padding: 5px',
  3371. id: "resource_form_for",
  3372. renderTo: layerWindowId,
  3373. hideLabels: true,
  3374. items: [{
  3375. html: _self.resourceDetailHtml(resource),
  3376. cls: "dataDetail",
  3377. }],
  3378. listeners:{
  3379. afterRender: function(){
  3380. try {
  3381. Ext.get("edit_resource").on('click', function(){
  3382. var id = this.dom.rel;
  3383. _self.presenter.editResource(id);
  3384. });
  3385. }catch(ex){}
  3386. }
  3387. }
  3388. });
  3389. },
  3390. removeResourceForm: function(){
  3391. if (this.resource_form) {
  3392. this.resource_form.removeAll();
  3393. this.resource_form.destroy();
  3394. }
  3395. },
  3396. removeResourceDetailForm: function(){
  3397. if (Ext.getCmp("resource_form_for")) {
  3398. Ext.getCmp("resource_form_for").destroy();
  3399. }
  3400. },
  3401. resourceDetailHtml: function(resource){
  3402. var templates = resource.templates;
  3403. var _self = this;
  3404. var str = "<ul>";
  3405. str += "<li>"
  3406. +"<div style='float:left;' ><span class='resource-name-title'>" + resource.name
  3407. +"<span>" +"[ID=" + resource.id +"]" +"</span>" +"</div>";
  3408. if(_self.presenter.canUpdate(Helper.layerHelper.getLayer(resource.layer_id))){
  3409. str += "<div style='float:right' > <a href='javascript:void(0)' class='edit' id='edit_resource' rel='" + resource.id + "' > Edit </a> </div>";
  3410. }
  3411. str += "<li class='clear' ><ul class='sub-item'>";
  3412. var templateExists = false;
  3413. for(templateName in templates ){
  3414. var propertyExist = false;
  3415. var strTag = "";
  3416. var template = templates[templateName];
  3417. strTag += "<li>";
  3418. strTag += "<fieldset><legend class='label-template-name'>" +Util.func.getTemplateName(templateName) +"</span></legend>";
  3419. strTag += "<ul>";
  3420. for(propertyName in template){
  3421. var propertyValue = template[propertyName];
  3422. if (propertyValue) {
  3423. strTag += "<li>";
  3424. strTag += "<label class='label-property-name'>" + propertyName + "</label>";
  3425. strTag += ":<span>" + propertyValue + "</span>"
  3426. strTag += "</li>";
  3427. propertyExist = true;
  3428. }
  3429. }
  3430. strTag += "</ul>";
  3431. strTag += "</fieldset>";
  3432. strTag += "</li>";
  3433. if (propertyExist) {
  3434. str += strTag;
  3435. templateExists = true;
  3436. }
  3437. }
  3438. if(!templateExists){
  3439. str += "<li><span class='no-record'>No Variable(s)</span></li>";
  3440. }
  3441. str += "</ul></li>";
  3442. str += "</ul>";
  3443. return str;
  3444. },
  3445. getTemplateField: function(templateName){
  3446. var element = Ext.getCmp("properties_fieldset_" + Util.func.replaceSpaceToUnderscore(templateName));
  3447. if (!element) {
  3448. element = this.createTemplateFieldSet(templateName);
  3449. }
  3450. return element;
  3451. },
  3452. addPropertyToResource: function(property, templateName){
  3453. templateName = templateName || "default";
  3454. var properties_list_panel = this.getTemplateField(templateName);
  3455. properties_list_panel.add(this.createTextFieldElement(property, templateName));
  3456. properties_list_panel.doLayout();
  3457. },
  3458. createTextFieldElement: function(property,templateName){
  3459. var _self = this;
  3460. var textField = new Ext.form.TextField({
  3461. id: "property_" +property.name,
  3462. fieldLabel: property.name,
  3463. labelStyle: 'width: 60px;',
  3464. value: property.value,
  3465. cls: "minSizeValue",
  3466. templateName:templateName,
  3467. listeners:{
  3468. change: function(){
  3469. var templateName = this.templateName;
  3470. _self.presenter.propertiesListChanged(property.name, textField.el.dom.value,templateName);
  3471. }
  3472. }
  3473. });
  3474. return textField;
  3475. },
  3476. getPropertyName: function(){
  3477. return Ext.getCmp('property_name').el.dom.value;
  3478. },
  3479. getPropertyValue: function(){
  3480. return Ext.getCmp('property_value').el.dom.value;
  3481. },
  3482. getPropertyNameEmptyText: function(){
  3483. return Ext.getCmp('property_name').emptyText;
  3484. },
  3485. getPropertyValueEmptyText: function(){
  3486. return Ext.getCmp('property_value').emptyText;
  3487. },
  3488. resetPropertyForm: function(){
  3489. Ext.getCmp('property_name').reset();
  3490. Ext.getCmp('property_value').reset();
  3491. Ext.getCmp('templates').reset();
  3492. },
  3493. getResourceFormData: function(){
  3494. return this.getFormData('resource_form_for');
  3495. },
  3496. getResourceNameEmptyText: function(){
  3497. return Ext.getCmp('resource_name').emptyText;
  3498. },
  3499. resetTextFieldById: function(textFieldId){
  3500. Ext.getCmp(textFieldId).reset();
  3501. Ext.getCmp(textFieldId).el.dom.value = "";
  3502. },
  3503. handleActiveLayer:function(layerId,checked){
  3504. this.presenter.handleActiveLayer(layerId,checked);
  3505. },
  3506. showResourcesListWindow: function(layer){
  3507. var _self = this;
  3508. var layerIdHidden = "layer_id_resource_list";
  3509. var wndId = "resource_list_window";
  3510. var resourceListGridId = "resource_list_grid";
  3511. var myPageSize = 30 ;
  3512. var windowResourceList =Ext.getCmp(wndId);
  3513. var url = SETTING.WEBROOT + "layers/"+layer.id+"/resources.json";
  3514. if (windowResourceList) {
  3515. var store = Ext.getCmp("resource_list_grid").store ;
  3516. store.proxy.api.read.url = url;
  3517. store.load({params:{start:0, limit:myPageSize}});
  3518. }
  3519. else {
  3520. var proxy = new Ext.data.HttpProxy({
  3521. method: 'GET',
  3522. api: {
  3523. read : url
  3524. }
  3525. });
  3526. var resourceRecord = Ext.data.Record.create([
  3527. {name: 'id'},
  3528. {name: 'name',type: 'string'}
  3529. ]);
  3530. var readerOption = {
  3531. totalProperty: 'total',
  3532. successProperty: 'success',
  3533. idProperty: 'id',
  3534. root: 'rows',
  3535. messageProperty: 'message'
  3536. };
  3537. var reader = new Ext.data.JsonReader(readerOption,resourceRecord);
  3538. var store = new Ext.data.Store({
  3539. id: 'resources_list_store',
  3540. proxy: proxy,
  3541. reader: reader
  3542. });
  3543. var windowWidth = 400;
  3544. windowResourceList = new Ext.Window({
  3545. id: wndId,
  3546. title: "<span><b>List</b> Resources</span>",
  3547. frame: true,
  3548. width: windowWidth,
  3549. renderTo: 'region_center',
  3550. closable: true,
  3551. resizable: true,
  3552. draggable: true,
  3553. layout:'fit',
  3554. autoScroll:true,
  3555. height:300,
  3556. items:{
  3557. xtype:"grid",
  3558. id:resourceListGridId,
  3559. store: store,
  3560. cls : 'clickable',
  3561. layout:'fit',
  3562. height:180,
  3563. autoScroll:true,
  3564. columns: [
  3565. new Ext.grid.RowNumberer({width : 30,header:"#",renderer:_self.generateRecordNumber}),
  3566. { header: "NAME",sortable: true,dataIndex: 'name',width:250,renderer:_self.generateResourceName}
  3567. ],
  3568. frame:true,
  3569. bbar: new Ext.PagingToolbar({
  3570. store: store,
  3571. displayInfo: true,
  3572. pageSize: myPageSize,
  3573. prependButtons: true,
  3574. }),
  3575. listeners: {
  3576. cellclick : function( grid, rowIndex,columnIndex,e ){
  3577. var resourceId = grid.store.data.items[rowIndex].data.id;
  3578. _self.presenter.showResourceDetail(resourceId);
  3579. }
  3580. }
  3581. }
  3582. });
  3583. store.load({params:{start:0, limit:myPageSize}});
  3584. }
  3585. windowResourceList.setTitle(_self.generateResourceTitle(layer));
  3586. var layerWindow = Ext.getCmp("layer_window");
  3587. var pos= layerWindow.getPosition();
  3588. windowResourceList.setPosition(pos[0] - windowWidth , pos[1] - 50);
  3589. windowResourceList.show();
  3590. },
  3591. generateResourceTitle:function(layer){
  3592. var icon = Util.func.getLayerIcon(layer.icon);
  3593. var str = "<img src='"+ SETTING.MARKER_ICON_PATH + icon +"' align='left' /> <span class='windowTitle' > "+layer.name+"</span>";
  3594. return str;
  3595. },
  3596. generateRecordNumber: function(v, p, record, rowIndex){
  3597. var store = Ext.getCmp("resource_list_grid").store ;
  3598. try {
  3599. start = parseInt(Ext.getCmp("resource_list_grid").store.reader.jsonData.start);
  3600. }catch(ex){ start = 0};
  3601. p.attr = "ext:qtip='Click on here to see the detail' ext:qtitle='' ";
  3602. return rowIndex+start+1;
  3603. },
  3604. generateResourceName:function(v, p, record, rowIndex){
  3605. p.attr = "ext:qtip='Click on here to see the detail' ext:qtitle='' ";
  3606. return v;
  3607. },
  3608. setLayerTitleClass: function(id, checked){
  3609. var el = Ext.get("layer_title_" + id);
  3610. try{
  3611. if(checked == false)
  3612. el.dom.className = "disable";
  3613. else
  3614. el.dom.className = "";
  3615. }catch(ex){
  3616. }
  3617. },
  3618. redraw: function(){
  3619. this.draw();
  3620. },
  3621. draw: function(){
  3622. this.presenter.showLayerWindow();
  3623. },
  3624. updateResourceLatLngDragging:function(latLng){
  3625. Ext.getCmp('resource_lat_tmp').el.dom.value = Util.func.formatPrecision(latLng.lat,6);
  3626. Ext.getCmp('resource_lng_tmp').el.dom.value = Util.func.formatPrecision(latLng.lng,6);
  3627. },
  3628. renderEditResourceForm: function(resource){
  3629. var _self = this;
  3630. if (this.resource_form) {
  3631. this.resource_form.removeAll();
  3632. this.resource_form.destroy();
  3633. this.resource_form = null;
  3634. _self.presenter.removeDraggableMarker();
  3635. }
  3636. _self.removeResourceDetailForm();
  3637. this.createEditResourceForm(resource);
  3638. this.resizeLayerWindow();
  3639. },
  3640. createEditResourceForm: function(resource){
  3641. var _self = this;
  3642. var formId = 'resource_form_for';
  3643. var resourceId = 'resource_name';
  3644. this.resource_form = new Ext.FormPanel({
  3645. id: formId,
  3646. cls: "layerForm",
  3647. bodyStyle: 'padding: 5px',
  3648. renderTo: 'layer_' + resource.layer_id,
  3649. hideLabels: true,
  3650. autoShow :true,
  3651. items: [
  3652. {
  3653. html: 'Edit item',
  3654. cls: 'title'
  3655. },
  3656. {
  3657. xtype: 'hidden',
  3658. name: 'resource[layer_id]',
  3659. value: resource.layer_id
  3660. },
  3661. {
  3662. xtype: 'hidden',
  3663. name: 'resource[lat]',
  3664. id: "resource_lat",
  3665. value: resource.lat
  3666. },
  3667. {
  3668. xtype: 'hidden',
  3669. name: 'resource[lng]',
  3670. id: "resource_lng",
  3671. value: resource.lng
  3672. },
  3673. {
  3674. xtype: "panel",
  3675. id: "resource_error_msg",
  3676. width: 200,
  3677. cls: "error_msg",
  3678. html: "Error resource msg"
  3679. },
  3680. {
  3681. xtype: 'textfield',
  3682. id: resourceId,
  3683. name: 'resource[name]',
  3684. emptyText: ' Resource Name',
  3685. value: resource.name,
  3686. cls: "resourceName",
  3687. enableKeyEvents:true,
  3688. listeners: {
  3689. focus: _self.hideResourceMessage
  3690. }
  3691. },
  3692. {
  3693. xtype: "panel",
  3694. html: "<a href='javascript:void(0);' class='linkLocation' id='location_anchor_" + resource.layer_id + "' > Change Location</a>",
  3695. cls: "selectLocation",
  3696. listeners: {
  3697. afterRender: function(){
  3698. Ext.select(".linkLocation").on("click", function(){
  3699. Util.Cookies.set("selected_layer", resource.layer_id);
  3700. _self.disableLayerWindow();
  3701. var latlng = Ext.getCmp('resource_lat').el.dom.value + "," + Ext.getCmp('resource_lng').el.dom.value;
  3702. _self.presenter.showSelectLocationWindow();
  3703. _self.presenter.showDraggableMarker(latlng);
  3704. return false;
  3705. });
  3706. }
  3707. }
  3708. },
  3709. {
  3710. xtype: 'panel',
  3711. id: 'properties_template',
  3712. layout: 'form',
  3713. style: 'clear:both;',
  3714. items: _self.renderPropertyTemplates(resource.templates)
  3715. },
  3716. {
  3717. xtype: 'fieldset',
  3718. id: 'properties_fieldset',
  3719. title: 'Add new variable',
  3720. layout: 'anchor',
  3721. hideLabels: true,
  3722. items: [
  3723. {
  3724. xtype: "panel",
  3725. width: 200,
  3726. id: "property_error_msg",
  3727. cls: "error_msg",
  3728. style: 'padding-left: 0px; display: none; margin-bottom: 5px;',
  3729. html: "Label and Value can't be empty"
  3730. },
  3731. {
  3732. layout: 'hbox',
  3733. defaults: {
  3734. margins: '0 5 0 0'
  3735. },
  3736. items: [
  3737. {
  3738. xtype: 'textfield',
  3739. id: 'property_name',
  3740. name: 'property[name]',
  3741. emptyText: ' Label',
  3742. flex: 2,
  3743. enableKeyEvents:true,
  3744. listeners: {
  3745. focus: _self.hidePropertyMessage
  3746. }
  3747. },
  3748. {
  3749. xtype: 'textfield',
  3750. id: 'property_value',
  3751. name: 'property[value]',
  3752. emptyText: ' Value',
  3753. flex: 1,
  3754. enableKeyEvents:true,
  3755. listeners: {
  3756. focus: _self.hidePropertyMessage
  3757. }
  3758. }
  3759. ]
  3760. }
  3761. ,{
  3762. xtype: 'combo',
  3763. id: 'templates',
  3764. fieldLabel: 'Owner ',
  3765. store: _self.generateStore(resource.templates),
  3766. typeAhead: true,
  3767. triggerAction: 'all',
  3768. lazyRender:true,
  3769. mode: 'local',
  3770. valueField: 'templates',
  3771. displayField: 'templates',
  3772. hiddenName: 'membership[user_id]',
  3773. hideTrigger: true,
  3774. typeAhead: true,
  3775. minChars: 3,
  3776. selectOnFocus: true,
  3777. style: 'margin-top: 5px; display: none;',
  3778. }
  3779. ],
  3780. buttons:[{
  3781. text: 'Add Field',
  3782. handler: function(){
  3783. var templateName = Ext.getCmp('templates').value;
  3784. templateName =(templateName)?templateName:"default";
  3785. _self.presenter.submitPropertyForm(templateName);
  3786. }
  3787. }]
  3788. }
  3789. ],
  3790. buttons: [
  3791. {
  3792. text: 'Updates',
  3793. handler: function(){
  3794. _self.presenter.saveResource('Update');
  3795. }
  3796. }
  3797. ]
  3798. });
  3799. },
  3800. renderPropertyTemplates:function(templates){
  3801. var result = new Array();
  3802. for(templateName in templates){
  3803. var properties = templates[templateName]
  3804. var fieldset = {
  3805. xtype: 'fieldset',
  3806. id: 'properties_fieldset_'+Util.func.replaceSpaceToUnderscore(templateName),
  3807. title: Util.func.getTemplateName(templateName),
  3808. items: this.renderProperties(properties,templateName),
  3809. cls: 'properties_template fieldset'
  3810. }
  3811. result.push(fieldset);
  3812. }
  3813. return result;
  3814. },
  3815. renderProperties: function(properties,templateName){
  3816. var result = [];
  3817. for(propertyName in properties){
  3818. var propertyValue = properties[propertyName];
  3819. property = {};
  3820. property['name'] = propertyName;
  3821. property['value'] = propertyValue;
  3822. var elm = this.createTextFieldElement(property,templateName);
  3823. result.push(elm);
  3824. }
  3825. return result;
  3826. },
  3827. generateStore: function(templates){
  3828. var dataTemplates = [];
  3829. for(templateName in templates)
  3830. dataTemplates.push([templateName,templateName]);
  3831. var myStore = new Ext.data.ArrayStore({
  3832. fields: [
  3833. 'templates',
  3834. 'templates'
  3835. ],
  3836. data: dataTemplates
  3837. });
  3838. return myStore;
  3839. },
  3840. createTemplateFieldSet: function(templateName){
  3841. var _self = this;
  3842. var fieldsetId = 'properties_fieldset_'+Util.func.replaceSpaceToUnderscore(templateName);
  3843. var fieldset = new Ext.form.FieldSet({
  3844. id: fieldsetId,
  3845. title: Util.func.getTemplateName(templateName),
  3846. cls: 'properties_template fieldset'
  3847. });
  3848. Ext.getCmp("properties_template").add(fieldset);
  3849. Ext.getCmp("properties_template").doLayout();
  3850. return fieldset;
  3851. },
  3852. setLatLng: function(lat, lng){
  3853. var formPanelId = "resource_form_for";
  3854. formDom = Ext.getCmp(formPanelId).form.el.dom;
  3855. formDom["resource[lat]"].value = lat;
  3856. formDom["resource[lng]"].value = lng;
  3857. },
  3858. resetTemplate: function(templateName){
  3859. this.presenter.resetTemplate(templateName);
  3860. },
  3861. formRedraw: function(){
  3862. Ext.getCmp("resource_form_for").doLayout();
  3863. },
  3864. valideLatLng: function(lat, lng){
  3865. if(parseFloat(lat) >= -90 && parseFloat(lat) <= 90 && parseFloat(lng) >= -180 && parseFloat(lng) <= 180){
  3866. return true;
  3867. }
  3868. else{
  3869. this.generateErrorLocation();
  3870. return false;
  3871. }
  3872. },
  3873. generateErrorLocation: function(){
  3874. Ext.getCmp("latLngStatus").el.update("<div class='error_msg' style='display:block;'><p class='paragraph_msg'>Lat or Lng is not valid</p></div>");
  3875. }
  3876. };
  3877. Presenter.LayerWindowPresenter = function(view){
  3878. this.view = view;
  3879. var _self = this;
  3880. this.resetResource = function(){
  3881. _self.resource = {};
  3882. _self.resource.templates = {};
  3883. };
  3884. };
  3885. Presenter.LayerWindowPresenter.prototype ={
  3886. initialize:function(){
  3887. this.view.createLayerWindows();
  3888. this.resetResource();
  3889. },
  3890. populateLayers: function(layers){
  3891. this.view.removeAllLayers();
  3892. for(var i=0;i<layers.length;i++){
  3893. var layer = layers[i];
  3894. this.view.addLayerItem(layer);
  3895. }
  3896. this.view.displayLayerWindow();
  3897. this.view.resizeLayerWindow();
  3898. GEvent.dispatchEvent(new Events.LayersEvent(Events.LayersEvent.LAYERS_LOAD_COMPLETED));
  3899. },
  3900. canUpdate: function(layer)
  3901. {
  3902. user_id = Authentication.getCurrentUserId();
  3903. var membership = Util.func.getUserMembership(layer, user_id);
  3904. if(membership){
  3905. var isOwner = membership.role == 'Owner';
  3906. var hasUpdateAccess = membership.access_rights & SETTING.ACCESS_RIGHTS_UPDATE;
  3907. return isOwner || hasUpdateAccess;
  3908. }
  3909. return false;
  3910. },
  3911. addLayerItem: function(layer){
  3912. if (this.canUpdate(layer)) {
  3913. this.view.addLayerWithMembership(layer);
  3914. } else{
  3915. this.view.addLayerWithoutMembership(layer);
  3916. }
  3917. },
  3918. showLayerWindow: function(){
  3919. GEvent.dispatchEvent(new Events.LayersEvent(Events.LayersEvent.LAYERS_LOAD));
  3920. },
  3921. removeDraggableMarker: function() {
  3922. GEvent.dispatchEvent(new Events.MapsEvent(Events.MapsEvent.MAPS_MARKER_REMOVE));
  3923. },
  3924. showSelectLocationWindow : function(){
  3925. this.view.createSelectLocationWindow();
  3926. },
  3927. showDraggableMarker: function(strLatLng){
  3928. GEvent.dispatchEvent(new Events.MapsEvent(Events.MapsEvent.MAPS_MARKER_SHOW_DRAGGABLE,strLatLng));
  3929. },
  3930. setMarkerUnDraggable: function(){
  3931. GEvent.dispatchEvent(new Events.MapsEvent(Events.MapsEvent.MAPS_MARKER_UNDRAGGABLE));
  3932. },
  3933. saveResource: function(update) {
  3934. var resourceForm = this.view.getResourceFormData();
  3935. var resourceNameEmptyText = this.view.getResourceNameEmptyText();
  3936. if(resourceForm["resource[name]"] == resourceNameEmptyText || resourceForm["resource[name]"] == ""){
  3937. this.view.showResourceMessage("Please enter the resource name ", "error");
  3938. return;
  3939. }
  3940. else if(resourceForm["resource[lat]"]=="" || resourceForm["resource[lng]"]== ""){
  3941. this.view.showResourceMessage("Please select location ", "error");
  3942. return;
  3943. }
  3944. this.resource.name = resourceForm["resource[name]"];
  3945. this.resource.lat = resourceForm["resource[lat]"];
  3946. this.resource.lng = resourceForm["resource[lng]"];
  3947. this.resource.layer_id = resourceForm["resource[layer_id]"];
  3948. this.saveResourceWithDispatchEvent(update);
  3949. },
  3950. saveResourceWithDispatchEvent: function(update){
  3951. param = this.resource;
  3952. if(update)
  3953. GEvent.dispatchEvent(new Events.ResourcesEvent(Events.ResourcesEvent.RESOURCES_UPDATE, param));
  3954. else
  3955. GEvent.dispatchEvent(new Events.ResourcesEvent(Events.ResourcesEvent.RESOURCES_SAVE, param));
  3956. },
  3957. createNewMaker: function(resource){
  3958. GEvent.dispatchEvent(new Events.MapsEvent(Events.MapsEvent.MAPS_MARKER_DRAGGABLE_RESET, resource));
  3959. },
  3960. updateForm: function(data){
  3961. if(data){
  3962. window.data = data;
  3963. this.view.showResourceMessage("Item is created successfully", "success");
  3964. this.view.resetResourceForm();
  3965. this.createNewMaker(data);
  3966. this.resetResource();
  3967. }
  3968. else{
  3969. this.view.showResourceMessage("Failed to create resource", "error");
  3970. }
  3971. },
  3972. renderResourceDetail: function(resource){
  3973. this.view.renderResourceDetail(resource);
  3974. this.view.resizeLayerWindow();
  3975. },
  3976. submitPropertyForm: function(templateName){
  3977. var propertyName = this.view.getPropertyName();
  3978. var propertyValue = this.view.getPropertyValue();
  3979. propertyNameEmptyText = this.view.getPropertyNameEmptyText();
  3980. propertyValueEmptyText = this.view.getPropertyValueEmptyText();
  3981. if(propertyName == propertyNameEmptyText || propertyValue == propertyValueEmptyText){
  3982. this.view.showPropertyMessage("Label and Value fields can not be empty", "error");
  3983. return;
  3984. }
  3985. var property = {
  3986. name: this.view.getPropertyName(),
  3987. value: this.view.getPropertyValue()
  3988. };
  3989. if(!this.resource.templates[templateName]){
  3990. this.resource.templates[templateName] = {};
  3991. }
  3992. this.resource.templates[templateName][propertyName] = propertyValue;
  3993. this.addPropertyToResource(property,templateName);
  3994. this.resetPropertyForm();
  3995. this.view.formRedraw();
  3996. },
  3997. createTemplateFieldSet: function(templateName){
  3998. this.view.createTemplateFieldSet(templateName);
  3999. },
  4000. propertiesListChanged: function(propertyName, propertyValue,templateName){
  4001. templateName = (templateName)?templateName:"default";
  4002. this.resource.templates[templateName] = this.resource.templates[templateName] || {}
  4003. this.resource.templates[templateName][propertyName] = propertyValue;
  4004. },
  4005. addPropertyToResource: function(property,templateName){
  4006. this.view.showPropertyMessage("Field has been created successfully", "success");
  4007. this.view.addPropertyToResource(property,templateName);
  4008. },
  4009. resetPropertyForm: function(){
  4010. this.view.resetPropertyForm();
  4011. },
  4012. resetPropertiesData: function(){
  4013. this.resource.templates['default'] = {
  4014. name: 'default',
  4015. properties: {
  4016. }
  4017. }
  4018. },
  4019. renderResourceForm: function(layerId){
  4020. this.resetResource();
  4021. var templatesLoad = new Events.TemplatesEvent(Events.TemplatesEvent.TEMPLATES_LOAD,layerId);
  4022. GEvent.dispatchEvent(templatesLoad);
  4023. },
  4024. populateTemplates: function(data){
  4025. this.view.renderResourceForm(data);
  4026. },
  4027. resetPropertiesListForm: function(){
  4028. for(templateName in this.resource.templates){
  4029. this.view.resetTemplate(templateName);
  4030. }
  4031. },
  4032. resetTemplate: function(templateName){
  4033. var properties = this.resource.templates[templateName];
  4034. for(propertyName in properties){
  4035. var textFieldId = "property_" +propertyName;
  4036. this.view.resetTextFieldById(textFieldId);
  4037. }
  4038. },
  4039. layerCheckboxClicked: function(id,checked){
  4040. this.view.handleActiveLayer(id,checked);//must be called first
  4041. this.view.setLayerTitleClass(id,checked);
  4042. var markerStatus = new Events.MapsEvent(Events.MapsEvent.MARKER_STATUS);
  4043. GEvent.dispatchEvent(markerStatus);
  4044. },
  4045. handleActiveLayer:function(layerId,checked){
  4046. Util.func.setLayerChecked(layerId,checked)
  4047. },
  4048. getLayerChecked: function(layerId){
  4049. return (Util.func.getLayerChecked(layerId))?" checked " : "" ;
  4050. },
  4051. layerTitleClick: function(layer){
  4052. this.view.showResourcesListWindow(layer);
  4053. },
  4054. showResourceDetail: function(id){
  4055. GEvent.dispatchEvent(new Events.ResourcesEvent(Events.ResourcesEvent.RESOURCE_LOAD_DETAIL_FOR_RESOURCE_LIST, id));
  4056. },
  4057. redraw: function(){
  4058. this.view.redraw();
  4059. },
  4060. updateResourceLatLngDragging:function(latLng){
  4061. this.view.updateResourceLatLngDragging(latLng);
  4062. },
  4063. editResource: function(resourceId){
  4064. GEvent.dispatchEvent(new Events.ResourcesEvent(Events.ResourcesEvent.RESOURCE_EDIT, resourceId));
  4065. },
  4066. renderEditResourceForm: function(resource){
  4067. this.resource = resource;
  4068. this.view.renderEditResourceForm(resource);
  4069. },
  4070. handleUpdateSuccess: function(){
  4071. this.showResourceDetail(this.resource.id);
  4072. },
  4073. setPositionDraggableMarker: function(lat, lng){
  4074. latLng = {}
  4075. latLng['lat'] = lat;
  4076. latLng['lng'] = lng;
  4077. GEvent.dispatchEvent(new Events.MapsEvent(Events.MapsEvent.SET_POSITION_DRAGGABLE_MARKER, latLng));
  4078. },
  4079. updateResourceLatLngObject: function(lat, lng){
  4080. this.resource.lat = lat;
  4081. this.resource.lng = lng;
  4082. }
  4083. };
  4084. View.ImportResourcesView = function(){
  4085. this.element = null;
  4086. this.presenter = new Presenter.ImportResourcesPresenter(this);
  4087. };
  4088. View.ImportResourcesView.prototype = {
  4089. createImportResourcesWindow: function(data){
  4090. var _importView = this ;
  4091. if(!_importView.getImportResourcesWindow()){
  4092. new Ext.Window({
  4093. id: "import_resources_window",
  4094. title: "Import Resources",
  4095. closable: true,
  4096. draggable: true,
  4097. width:400,
  4098. zIndex :30000,
  4099. modal: true,
  4100. autoHeight:true,
  4101. items:[
  4102. {
  4103. xtype:"panel",
  4104. cls:'paragraph_msg',
  4105. autoHeight:true,
  4106. items:[
  4107. {
  4108. id: "import_resources_title",
  4109. html : "Import Resources",
  4110. frame: true
  4111. },
  4112. {
  4113. id: "swf_container",
  4114. html : _importView.swfContainer(),
  4115. frame: false,
  4116. listeners:{
  4117. afterRender:function(){
  4118. Ext.fly("import_button").on("click",function(){
  4119. _importView.presenter.startImportResources(SETTING.swfImport);
  4120. });
  4121. }
  4122. }
  4123. }
  4124. ]
  4125. },
  4126. {
  4127. xtype: 'hidden',
  4128. value: data.id,
  4129. id: 'importLayerId'
  4130. }
  4131. ],
  4132. listeners:{
  4133. afterRender: function(){
  4134. _importView.createFlashUploadObj(data.id);
  4135. _importView.generateUploadLabel(data.layer_name);
  4136. },
  4137. close: function(){
  4138. SETTING.swfImport = null;
  4139. }
  4140. }
  4141. });
  4142. }
  4143. },
  4144. getLayerId: function(){
  4145. return Ext.getCmp('importLayerId').value;
  4146. },
  4147. createFlashUploadObj:function(layer_id){
  4148. var _importView = this;
  4149. var options = {
  4150. flash_url : window.SETTING.WEBROOT + "javascripts/lib/swfupload/Flash/swfupload.swf",
  4151. upload_url: window.SETTING.UPLOAD_IMPORT_RESOURCES,
  4152. post_params: {"auth_token" : Authentication.getAuthToken(), "layer_id":layer_id},
  4153. file_size_limit : "500 KB",
  4154. file_types : "*.csv",
  4155. file_types_description : "All Files",
  4156. file_upload_limit : 100,
  4157. file_queue_limit : 100,
  4158. custom_settings : {
  4159. progressTarget : "fsUploadProgress",
  4160. cancelButtonId : "btnCancel"
  4161. },
  4162. button_image_url: SETTING.WEBROOT + "images/upload.png",
  4163. button_width: "100",
  4164. button_height: "30",
  4165. button_text : "Choose File " ,
  4166. button_placeholder_id: "spanButtonPlaceHolder",
  4167. button_text_style: ".theFont { font-size:28px; } ",
  4168. button_text_left_padding: 12,
  4169. button_text_top_padding: 3,
  4170. button_cursor : SWFUpload.CURSOR.HAND,
  4171. button_action : SWFUpload.BUTTON_ACTION.SELECT_FILE,
  4172. file_queued_handler : _importView.presenter._fileQueued,
  4173. file_queue_error_handler :_importView._fileQueueError,
  4174. upload_start_handler : _importView.presenter._uploadStart,
  4175. upload_progress_handler :_importView.presenter._uploadProgress,
  4176. upload_error_handler : _importView.presenter._uploadError,
  4177. upload_success_handler : _importView.presenter._uploadSuccess
  4178. };
  4179. window.SETTING.swfImport = new SWFUpload(options);
  4180. window.SETTING.swfImport.addSetting();
  4181. },
  4182. generateUploadLabel: function(layer_name){
  4183. var str = "<div> Import resources to layer <span class='highText'> " + layer_name +"</span> </div>" ;
  4184. str += "<div> Maximum size <span class='highText'> " + SETTING.swfImport.settings.file_size_limit + "</span> </div><br />";
  4185. Ext.fly("import_resources_title").update(str);
  4186. },
  4187. showImportResourcesWindow: function(){
  4188. this.getImportResourcesWindow().show();
  4189. },
  4190. hideImportResourcesWindow: function(){
  4191. this.getImportResourcesWindow().hide();
  4192. },
  4193. closeImportResourcesWindow: function(){
  4194. this.getImportResourcesWindow().close();
  4195. },
  4196. getImportResourcesWindow:function(){
  4197. return Ext.getCmp("import_resources_window");
  4198. },
  4199. swfContainer:function(){
  4200. str ='<div class="fieldset flash" id="fsUploadProgress"> <span class="legend"> </span></div>';
  4201. str += "<div id='status'>";
  4202. str += "<div id='progress_wrapper'> ";
  4203. str += "<div id='progress'> </div>";
  4204. str += "</div>";
  4205. str += "<div id='percentage'> 0% </div>";
  4206. str += "</div>";
  4207. str += "<div class='clear'> </div>";
  4208. str += "<div id='fileUpload' class='fileUpload'> Please select a file to import </div> ";
  4209. str +="<div class='clear'></div>";
  4210. str += '<div style="float:right;" >' ;
  4211. str += '<span id="spanButtonPlaceHolder"> </span>';
  4212. str += '<a href ="javascript:void(0)" name="Upload" id="import_button" class="upload_button" > <span> Upload </span> </a>';
  4213. str += '</div> ';
  4214. return str;
  4215. },
  4216. fileQueued:function(file){
  4217. SETTING.swfImport.QueueFile = file;
  4218. var propertyFile = '<span class="fname">' + file.name + '</span>';
  4219. propertyFile += ' : <span class="fsize">(' + file.size + 'Bytes) </span>';
  4220. Ext.fly('fileUpload').update(propertyFile).replaceClass('fileFail','fileUpload');
  4221. },
  4222. fileQueueError:function(file, error_code, message){
  4223. var propertyFile = '<div><span class="fname">' + file.name + '</span>';
  4224. propertyFile += ' : <span class="fsize">(' + file.size + ' Bytes)</span></div>';
  4225. propertyFile += '<div> ' + message + "</div>";
  4226. Ext.fly('fileUpload').update(propertyFile).replaceClass('fileUpload','fileFail');
  4227. SETTING.swfImport.QueueFile = null;
  4228. },
  4229. uploadStart:function(file){
  4230. Ext.fly("status").setStyle({"visibility":"visible"});
  4231. },
  4232. uploadProgress:function(file, byteComplete, totalBytes){
  4233. var percentage = 100*(byteComplete/totalBytes);
  4234. percentage = (parseInt(percentage*100))/100;
  4235. var width = (byteComplete/totalBytes) * 180;
  4236. Ext.fly("progress").setStyle({"width":width+"px"});
  4237. Ext.fly("percentage").update(percentage+"% ");
  4238. },
  4239. uploadError:function(file, code, httpErrorCode){
  4240. try{
  4241. var propertyFile = '<div><span class="fname">' + file.name + '</span>';
  4242. propertyFile += ' : <span class="fsize">(' + file.size + ' Bytes)</span></div>';
  4243. propertyFile += '<div> Http status : <b> ' + httpErrorCode + "</b></div>";
  4244. propertyFile += '<div> <b> Please try again later </b></div>';
  4245. Ext.fly('fileUpload').update(propertyFile).replaceClass('fileUpload','fileFail');
  4246. }
  4247. catch(Ex){
  4248. }
  4249. SETTING.swfImport.QueueFile = null;
  4250. Ext.fly("status").setStyle({"visibility":"hidden"});
  4251. },
  4252. importSuccess:function(file, responseText, response){
  4253. Ext.fly("status").setStyle({"visibility":"hidden"});
  4254. this.getImportResourcesWindow().close();
  4255. },
  4256. showUploadFileNullError: function(){
  4257. var propertyFile = '<div> ' + 'Please select file to upload' + "</div>";
  4258. Ext.fly('fileUpload').update(propertyFile).replaceClass('fileUpload','fileFail');
  4259. }
  4260. }
  4261. Presenter.ImportResourcesPresenter = function(view){
  4262. this.view = view;
  4263. _this = this;
  4264. this.children = {};
  4265. }
  4266. Presenter.ImportResourcesPresenter.prototype = {
  4267. showImportResourceWindow: function(data){
  4268. this.view.createImportResourcesWindow(data);
  4269. this.view.showImportResourcesWindow();
  4270. },
  4271. startImportResources: function(swf){
  4272. if(!swf.QueueFile ){
  4273. this.view.showUploadFileNullError();
  4274. return;
  4275. }
  4276. GEvent.dispatchEvent(new Events.UtilitiesEvent(Events.UtilitiesEvent.IMPORT_RESOURCES,swf))
  4277. },
  4278. _fileQueued: function(file){
  4279. _this.view.fileQueued(file);
  4280. },
  4281. _fileQueueError: function(file, error_code, message){
  4282. _this.view.fileQueueError(file, error_code, message);
  4283. },
  4284. _uploadStart:function(file){
  4285. _this.view.uploadStart(file);
  4286. },
  4287. _uploadProgress:function(file, byteComplete, totalBytes){
  4288. _this.view.uploadProgress(file, byteComplete, totalBytes);
  4289. },
  4290. _uploadError:function(file, code, httpErrorCode){
  4291. _this.view.uploadError(file, code, httpErrorCode);
  4292. },
  4293. _uploadSuccess:function(file, responseText){
  4294. var layerId = _this.view.getLayerId();
  4295. _this.view.closeImportResourcesWindow();
  4296. var data = {};
  4297. data['layerId'] = layerId;
  4298. data['responseText'] = responseText;
  4299. GEvent.dispatchEvent(new Events.ResourcesEvent(Events.ResourcesEvent.LOAD_CONFIRMED_RESOURCES,data));
  4300. },
  4301. reloadData: function(){
  4302. this.loaded = false;
  4303. }
  4304. }
  4305. View.ConfirmDataResourcesView = function(){
  4306. this.element = null;
  4307. this.presenter = new Presenter.ConfirmDataResourcesPresenter(this);
  4308. }
  4309. View.ConfirmDataResourcesView.prototype = {
  4310. createConfirmDataResourcesWindow: function(content){
  4311. var _self = this;
  4312. var wndId = 'confirm_window';
  4313. var data = Json.decode(content.responseText);
  4314. var headerData = data.content[0];
  4315. var windowWidth = 150 + (100* headerData.length);
  4316. windowWidth = (windowWidth>1024)?1024:windowWidth;
  4317. var windowResourceList = new Ext.Window({
  4318. id: wndId,
  4319. title: "List Import Data",
  4320. frame: true,
  4321. width: windowWidth,
  4322. height:300,
  4323. closable: true,
  4324. resizable: true,
  4325. draggable: true,
  4326. layout:'anchor',
  4327. modal: true,
  4328. items:_self.generateConfirmItems(data)
  4329. });
  4330. windowResourceList.show();
  4331. },
  4332. generateConfirmItems: function(data){
  4333. var _self = this;
  4334. var resourceListGridId = 'confirm_grid';
  4335. var rowHeader = data.content[0];
  4336. var rows = data.content.slice(1);
  4337. var result = [];
  4338. if(this.invalidResourcesExist(rows)){
  4339. result.push(
  4340. {
  4341. html: 'Record(s) in red can not be imported',
  4342. id: 'grid_error_title',
  4343. cls: 'error',
  4344. style:'height:20px;',
  4345. anchor: "100%"
  4346. });
  4347. }
  4348. result.push(
  4349. {
  4350. xtype:"grid",
  4351. id:resourceListGridId,
  4352. store: _self.generateGridStore(data),
  4353. cls : 'clickable',
  4354. anchor: "100% 90%" ,
  4355. autoScroll:true,
  4356. frame:true,
  4357. columns: _self.generateColumnHeaderGrid(rowHeader),
  4358. buttons: [
  4359. {
  4360. text: "<span id='buttonConfirmImport'>Cancel</span>",
  4361. handler :function(){
  4362. Ext.getCmp('confirm_window').close();
  4363. }
  4364. },
  4365. {
  4366. text: "<span id='buttonConfirmImport'>Confirm Import</span>",
  4367. handler :function(){
  4368. var fileName = Ext.getCmp('fileName').value;
  4369. var layerId = Ext.getCmp('importLayerId').value;
  4370. _self.presenter.confirmImport(fileName, layerId);
  4371. }
  4372. }
  4373. ]
  4374. },
  4375. {
  4376. xtype: 'hidden',
  4377. value: data.layer_id,
  4378. id: 'importLayerId'
  4379. },
  4380. {
  4381. xtype: 'hidden',
  4382. id: 'fileName',
  4383. value: data.file_name
  4384. }
  4385. );
  4386. return result;
  4387. },
  4388. generateColumnHeaderGrid: function(column){
  4389. var arrCol = [];
  4390. for(var i = 0; i < column.length; i++){
  4391. var width = 100;
  4392. if(i<column.length-1)
  4393. width = 100;
  4394. else
  4395. width = 200;
  4396. var colHeader = { header: column[i], width: width, dataIndex: "" + column[i] };
  4397. arrCol.push(colHeader);
  4398. }
  4399. return arrCol;
  4400. },
  4401. generateGridStore: function(data){
  4402. var rowHeader = data.content[0];
  4403. var gridStore = new Ext.data.ArrayStore({
  4404. fields: rowHeader,
  4405. idIndex: 0
  4406. });
  4407. rows = this.rendererGridRecord(data.content);
  4408. gridStore.loadData(rows);
  4409. return gridStore;
  4410. },
  4411. rendererGridRecord: function(data){
  4412. var RESOURCE_FIELDS = 3;
  4413. var rowHeader = data[0];
  4414. var rows = data.slice(1);
  4415. for(var i = 0; i < rows.length; i++){
  4416. var row = rows[i];
  4417. var lastColumn = row[row.length - 1];
  4418. if(lastColumn.length){
  4419. var errors = [];
  4420. for(var j = 0; j < RESOURCE_FIELDS; j++){
  4421. var error = this.getColumnError(lastColumn, rowHeader[j]);
  4422. if (error){
  4423. errors.push(error);
  4424. row[j] = (row[j])?"<span class='red'> " + row[j]+ "</span>":"";
  4425. }
  4426. }
  4427. if(errors.length){
  4428. var errors_msg = errors.join("<br/>");
  4429. row[row.length - 1] = "<span class='red'> " + errors_msg+ "</span>";
  4430. }
  4431. }
  4432. }
  4433. return rows;
  4434. },
  4435. invalidResourcesExist: function(rows){
  4436. for(var i = 0; i < rows.length; i++){
  4437. var row = rows[i];
  4438. if (row[row.length - 1].length) {
  4439. return true;
  4440. }
  4441. }
  4442. return false;
  4443. },
  4444. getColumnError: function(lastColumn, headerName){
  4445. for(var i = 0; i < lastColumn.length; i++){
  4446. if(lastColumn[i][0] == headerName)
  4447. return Util.func.firstLetterUpperCase(headerName) + " " + lastColumn[i][1];
  4448. }
  4449. return "";
  4450. },
  4451. getConfirmDataResourcesWindow:function(){
  4452. return Ext.getCmp("confirm_window");
  4453. },
  4454. closeConfirmDataResourcesWindow: function(){
  4455. this.getConfirmDataResourcesWindow().close();
  4456. },
  4457. showConfirmDataResourcesWindow: function(){
  4458. this.getConfirmDataResourcesWindow().show();
  4459. },
  4460. closeUploadIconWindow:function(){
  4461. this.getConfirmDataResourcesWindow().close();
  4462. },
  4463. showLoadingImportWindow: function(){
  4464. this.myMask = new Ext.LoadMask(Ext.getBody(), {msg:"Importing in progess ..."});
  4465. this.myMask.show();
  4466. },
  4467. closeLoadingImportWindow: function(){
  4468. this.myMask.hide();
  4469. }
  4470. }
  4471. Presenter.ConfirmDataResourcesPresenter = function(view){
  4472. this.view = view;
  4473. }
  4474. Presenter.ConfirmDataResourcesPresenter.prototype = {
  4475. showConfirmDataResourceWindow: function(data){
  4476. if(data)
  4477. {
  4478. this.view.createConfirmDataResourcesWindow(data);
  4479. }
  4480. },
  4481. confirmImport: function(fileName, layerId){
  4482. var data = {}
  4483. data['fileName'] = fileName;
  4484. data['layerId'] = layerId;
  4485. GEvent.dispatchEvent(new Events.ResourcesEvent(Events.ResourcesEvent.CONFIRMED_IMPORT_RESOURCES, data));
  4486. },
  4487. hideConfirmDataResourceWindow: function(){
  4488. this.view.closeConfirmDataResourcesWindow();
  4489. },
  4490. showLoadingImportWindow: function(){
  4491. this.view.showLoadingImportWindow();
  4492. },
  4493. closeLoadingImportWindow: function(){
  4494. this.view.closeLoadingImportWindow();
  4495. }
  4496. }
  4497. View.FrontLayerView = function(){
  4498. this.element = null;
  4499. this.presenter = new Presenter.FrontLayerPresenter(this);
  4500. }
  4501. View.FrontLayerView.prototype = {
  4502. createFrontLayerWindow: function(layer){
  4503. var _self = this;
  4504. var frontLayerId= "front_layer";
  4505. var myLayer = Ext.fly("my_layer");
  4506. var height = myLayer.getHeight();
  4507. var myPageSize = 10 ;
  4508. var url = SETTING.WEBROOT + "layers/"+layer.id+"/memberships.json";
  4509. var resourceRecord = Ext.data.Record.create([
  4510. {name: 'id'},
  4511. {name: 'name',type: 'string'}
  4512. ]);
  4513. var readerOption = {
  4514. totalProperty: 'total',
  4515. successProperty: 'success',
  4516. idProperty: 'id',
  4517. root: 'rows',
  4518. messageProperty: 'message'
  4519. };
  4520. var reader = new Ext.data.JsonReader(readerOption,resourceRecord);
  4521. var proxy = new Ext.data.HttpProxy({
  4522. method: 'GET',
  4523. api: {
  4524. read : url
  4525. }
  4526. });
  4527. var store = new Ext.data.Store({
  4528. id: 'member_list_store',
  4529. proxy: proxy,
  4530. reader: reader
  4531. });
  4532. var windowResourceList = _self.getFrontLayerCmp(frontLayerId);
  4533. windowResourceList = new Ext.FormPanel({
  4534. id : frontLayerId,
  4535. height: height,
  4536. renderTo: myLayer.dom,
  4537. cls: 'frontLayer',
  4538. layoutConfig:{
  4539. align: "stretch"
  4540. },
  4541. listeners:{
  4542. afterRender:function(){
  4543. Ext.fly("closeFrontLayer").on("click",function(){
  4544. Ext.getCmp("front_layer").destroy(true);
  4545. });
  4546. }
  4547. },
  4548. items:[{
  4549. xtype: 'hidden',
  4550. id: 'frontLayerId',
  4551. value: layer.id
  4552. },
  4553. {
  4554. height: 40,
  4555. layout: "hbox",
  4556. align : "stretch",
  4557. style: "padding: 10px;",
  4558. items:[{
  4559. html: layer.name,
  4560. value: layer.name,
  4561. id: 'frontLayerName',
  4562. cls: 'header_title',
  4563. width: 250
  4564. },
  4565. {
  4566. html: "<a href='javascript:void(0)' id='closeFrontLayer' > Close </a>",
  4567. flex: 1,
  4568. style: "text-align: right;"
  4569. }]
  4570. },
  4571. {
  4572. xtype:'tabpanel',
  4573. activeTab: 0,
  4574. items: [{
  4575. title: "Member",
  4576. items: [
  4577. {
  4578. xtype: "grid",
  4579. id: 'member_list_grid',
  4580. store: store,
  4581. cls : 'clickable',
  4582. height:350,
  4583. autoScroll:true,
  4584. columns: [
  4585. new Ext.grid.RowNumberer({width : 30,header:"#",renderer:_self.generateRecordNumber}),
  4586. { header: "NAME",sortable: true,dataIndex: 'name',width:250,renderer:_self.generateResourceName}
  4587. ],
  4588. frame:true,
  4589. bbar: new Ext.PagingToolbar({
  4590. store: store,
  4591. displayInfo: true,
  4592. pageSize: myPageSize,
  4593. prependButtons: true
  4594. }),
  4595. listeners: {
  4596. cellclick : function (grid, rowIndex,columnIndex,e ){
  4597. if (columnIndex == 1 && rowIndex>=0){
  4598. window.grid = grid;
  4599. var data = {};
  4600. data['userId'] = grid.store.data.items[rowIndex].data.id ;
  4601. data['layerId'] = Ext.getCmp('frontLayerId').value;
  4602. _self.presenter.editMemberAccessRights(data);
  4603. }
  4604. }
  4605. },
  4606. tbar:[{
  4607. html: "<a href='javascript:void(0);' class='add' > Add Member </a>",
  4608. cls : "toolbar",
  4609. handler :function(){
  4610. var layerId = Ext.getCmp('frontLayerId').value;
  4611. _self.presenter.showAddNewMember(layerId);
  4612. }
  4613. }]
  4614. }
  4615. ]
  4616. }]
  4617. }]
  4618. });
  4619. store.load({params:{start:0, limit:myPageSize}});
  4620. },
  4621. generateRecordNumber: function(v, p, record, rowIndex){
  4622. var member_grid = Ext.getCmp("member_list_grid");
  4623. var store = member_grid.store ;
  4624. try {
  4625. start = parseInt(member_grid.store.reader.jsonData.start);
  4626. }catch(ex){ start = 0};
  4627. p.attr = "ext:qtip='Click on here to edit' ext:qtitle='' ";
  4628. return rowIndex+start+1;
  4629. },
  4630. generateResourceName:function(v, p, record, rowIndex){
  4631. p.attr = "ext:qtip='Click on here to see the detail' ext:qtitle='' ";
  4632. return v;
  4633. },
  4634. getFrontLayerCmp: function(frontLayerId){
  4635. return Ext.getCmp(frontLayerId);
  4636. },
  4637. reloadMemberToGrid: function(data){
  4638. var store = Ext.getCmp('member_list_grid').store;
  4639. store.reload();
  4640. },
  4641. closeFrontLayerWindow: function(){
  4642. if(Ext.getCmp("front_layer"))
  4643. Ext.getCmp("front_layer").destroy(true);
  4644. }
  4645. }
  4646. Presenter.FrontLayerPresenter = function(view){
  4647. this.view = view;
  4648. }
  4649. Presenter.FrontLayerPresenter.prototype = {
  4650. showFrontLayerWindow: function(layer){
  4651. this.view.createFrontLayerWindow(layer);
  4652. },
  4653. showAddNewMember: function(frontLayerId){
  4654. GEvent.dispatchEvent(new Events.MemberEvent(Events.MemberEvent.SHOW_ADD_NEW_MEMBER_WINDOW, frontLayerId));
  4655. },
  4656. handleMemberSaved: function(data){
  4657. this.view.reloadMemberToGrid(data);
  4658. },
  4659. closeFrontLayerWindow: function(){
  4660. this.view.closeFrontLayerWindow();
  4661. },
  4662. editMemberAccessRights: function(data){
  4663. GEvent.dispatchEvent(new Events.MemberEvent(Events.MemberEvent.EDIT_MEMBER_ACCESS_RIGHTS, data));
  4664. }
  4665. }
  4666. View.FrontMemberView = function(){
  4667. this.presenter = new Presenter.FrontMemberPresenter(this);
  4668. }
  4669. View.FrontMemberView.prototype = {
  4670. createMemberWindow: function(layerId){
  4671. var _self = this;
  4672. var wnd = new Ext.Window({
  4673. id :"member_wnd",
  4674. title: 'New member',
  4675. modal: true,
  4676. resizable: true,
  4677. border: false,
  4678. width:450,
  4679. items:[
  4680. {
  4681. id : "flashFrontMember",
  4682. html: "",
  4683. },
  4684. {
  4685. id :"front_member_form",
  4686. xtype: 'form',
  4687. padding: 10,
  4688. labelWidth: 150,
  4689. defaults: {
  4690. labelStyle: 'text-align: right',
  4691. xtype: 'textfield',
  4692. width: 220
  4693. },
  4694. items: [
  4695. {
  4696. xtype: 'hidden',
  4697. id: 'memberLayerId',
  4698. value: layerId,
  4699. name: 'memebership[layer_id]'
  4700. },
  4701. {
  4702. id: 'user_name',
  4703. name: 'user[name]',
  4704. fieldLabel: 'User name ',
  4705. allowBlank: false,
  4706. blankText: "User name can not be empty"
  4707. },
  4708. {
  4709. name: 'user[password]',
  4710. id: 'password',
  4711. fieldLabel: 'Password ',
  4712. inputType: 'password',
  4713. allowBlank: false,
  4714. blankText: "Password can not be empty"
  4715. },
  4716. {
  4717. name: 'password_confirmation',
  4718. id: 'password_confirmation',
  4719. fieldLabel: 'Password Confirmation ',
  4720. inputType: 'password',
  4721. allowBlank: false,
  4722. blankText: "Password confirmation can not be empty"
  4723. },
  4724. {
  4725. name: 'phone_number',
  4726. id: 'phone_number',
  4727. fieldLabel: 'Phone Number ',
  4728. allowBlank: true,
  4729. },
  4730. {
  4731. xtype: 'fieldset',
  4732. id: 'access_rights_fieldset',
  4733. title: 'Membership Access Rights',
  4734. cls: 'fieldset',
  4735. layout: 'anchor',
  4736. hideLabels: true,
  4737. height:65,
  4738. width: 380,
  4739. items: [
  4740. {
  4741. layout: 'hbox',
  4742. defaults: {
  4743. margins: '0 5 0 0'
  4744. },
  4745. items: [
  4746. {
  4747. xtype: 'checkbox',
  4748. id: 'membership_view',
  4749. fieldLabel: 'Check to apply',
  4750. value: SETTING.ACCESS_RIGHTS_READ,
  4751. boxLabel: 'View',
  4752. name: 'membership_view'
  4753. }, {
  4754. xtype: 'checkbox',
  4755. id: 'membership_update',
  4756. fieldLabel: '',
  4757. value: SETTING.ACCESS_RIGHTS_UPDATE,
  4758. labelSeparator: '',
  4759. boxLabel: 'Update',
  4760. name: 'membership_update'
  4761. }, {
  4762. xtype: 'checkbox',
  4763. id: 'membership_delete',
  4764. fieldLabel: '',
  4765. value: SETTING.ACCESS_RIGHTS_DELETE,
  4766. labelSeparator: '',
  4767. boxLabel: 'Delete',
  4768. name: 'membership_delete'
  4769. }
  4770. ]
  4771. }
  4772. ]
  4773. }
  4774. ]
  4775. }
  4776. ],
  4777. listeners: {
  4778. beforeclose: function(){
  4779. }
  4780. },
  4781. buttons: [
  4782. {
  4783. text: 'Create',
  4784. handler: function(){
  4785. var formData = _self.getMemberFormData();
  4786. _self.presenter.saveMember(formData);
  4787. }
  4788. },
  4789. {
  4790. text: 'Cancel',
  4791. handler: function(){
  4792. _self.closeMemberWindow();
  4793. }
  4794. }
  4795. ]
  4796. });
  4797. wnd.show();
  4798. },
  4799. closeMemberWindow: function(){
  4800. Ext.getCmp("member_wnd").close();
  4801. },
  4802. getMemberFormData: function(){
  4803. return Ext.getCmp('front_member_form').getForm().getValues();
  4804. },
  4805. showFlashMsg: function(errs, cls){ //flashFrontMember
  4806. var msg = errs;
  4807. if(typeof errs =="object"){
  4808. msg = errs.join("<br />");
  4809. }
  4810. this.setFlashMsg(msg,cls);
  4811. },
  4812. showFlashResponse : function(serverErrs,cls){
  4813. var errors = []
  4814. for(var i=0 ; i<serverErrs.length;i++){
  4815. var field = serverErrs[i][0];
  4816. var err = serverErrs[i][1];
  4817. var errorMsg = field.substr(0,1).toUpperCase()+field.substr(1) + " " + err;
  4818. errors.push(errorMsg);
  4819. }
  4820. this.showFlashMsg(errors,cls);
  4821. },
  4822. removeFlashMsg: function(){
  4823. Ext.fly("flashFrontMember").hide();
  4824. },
  4825. setFlashMsg: function(msg,cls){
  4826. Ext.fly("flashFrontMember").update(msg);
  4827. Ext.fly("flashFrontMember").addClass(cls);
  4828. Ext.fly("flashFrontMember").show();
  4829. Ext.getCmp("member_wnd").doLayout();
  4830. },
  4831. showEditMemberWindow: function(data){
  4832. var _self = this;
  4833. var wnd = new Ext.Window({
  4834. id :"edit_member_wnd",
  4835. title: 'Edit member',
  4836. modal: true,
  4837. resizable: true,
  4838. border: false,
  4839. width:450,
  4840. items:[
  4841. {
  4842. id : "flashFrontMember",
  4843. html: "",
  4844. },
  4845. {
  4846. id :"front_edit_member_form",
  4847. xtype: 'form',
  4848. padding: 10,
  4849. labelWidth: 150,
  4850. defaults: {
  4851. labelStyle: 'text-align: right',
  4852. xtype: 'textfield',
  4853. width: 220
  4854. },
  4855. items: [
  4856. {
  4857. xtype: 'hidden',
  4858. id: 'membershipId',
  4859. value: data.id,
  4860. name: 'memebership[id]'
  4861. },
  4862. {
  4863. id: 'user_name',
  4864. xtype: 'panel',
  4865. height: 25,
  4866. html: "User : " + data.user['name']
  4867. },
  4868. {
  4869. xtype: 'fieldset',
  4870. id: 'access_rights_fieldset',
  4871. title: 'Membership Access Rights',
  4872. cls: 'fieldset',
  4873. layout: 'anchor',
  4874. hideLabels: true,
  4875. height:65,
  4876. width: 380,
  4877. items: [
  4878. {
  4879. layout: 'hbox',
  4880. defaults: {
  4881. margins: '0 5 0 0'
  4882. },
  4883. items: [
  4884. {
  4885. xtype: 'checkbox',
  4886. id: 'membership_view',
  4887. fieldLabel: 'Check to apply',
  4888. value: SETTING.ACCESS_RIGHTS_READ,
  4889. boxLabel: 'View',
  4890. name: 'membership_view',
  4891. checked: _self.isChecked(SETTING.ACCESS_RIGHTS_READ, data.access_rights)
  4892. }, {
  4893. xtype: 'checkbox',
  4894. id: 'membership_update',
  4895. fieldLabel: '',
  4896. value: SETTING.ACCESS_RIGHTS_UPDATE,
  4897. labelSeparator: '',
  4898. boxLabel: 'Update',
  4899. name: 'membership_update',
  4900. checked: _self.isChecked(SETTING.ACCESS_RIGHTS_UPDATE, data.access_rights)
  4901. }, {
  4902. xtype: 'checkbox',
  4903. id: 'membership_delete',
  4904. fieldLabel: '',
  4905. value: SETTING.ACCESS_RIGHTS_DELETE,
  4906. labelSeparator: '',
  4907. boxLabel: 'Delete',
  4908. name: 'membership_delete',
  4909. checked: _self.isChecked(SETTING.ACCESS_RIGHTS_DELETE, data.access_rights)
  4910. }
  4911. ]
  4912. }
  4913. ]
  4914. }
  4915. ]
  4916. }
  4917. ],
  4918. listeners: {
  4919. afterRender: function(){
  4920. },
  4921. beforeclose: function(){
  4922. }
  4923. },
  4924. buttons: [
  4925. {
  4926. text: 'Update',
  4927. handler: function(){
  4928. var formData = _self.getEditMemberFormData();
  4929. _self.presenter.updateMember(formData);
  4930. }
  4931. },
  4932. {
  4933. text: 'Cancel',
  4934. handler: function(){
  4935. _self.closeEditMemberWindow();
  4936. }
  4937. }
  4938. ]
  4939. });
  4940. wnd.show();
  4941. },
  4942. isChecked: function(x, y){
  4943. return x & y;
  4944. },
  4945. closeEditMemberWindow: function(){
  4946. Ext.getCmp('edit_member_wnd').close();
  4947. },
  4948. getEditMemberFormData: function(){
  4949. return Ext.getCmp('front_edit_member_form').getForm().getValues();
  4950. },
  4951. showUpdatedError: function(){
  4952. Ext.getCmp("flashFrontMember").el.update("<div class='error'> Process update access rights failed</div>");
  4953. }
  4954. }
  4955. Presenter.FrontMemberPresenter = function(view){
  4956. this.view = view;
  4957. }
  4958. Presenter.FrontMemberPresenter.prototype = {
  4959. showMemberWindow: function(layerId){
  4960. this.view.createMemberWindow(layerId);
  4961. },
  4962. saveMember: function(data){
  4963. var memberName = data['user[name]'];
  4964. var password = data['user[password]'];
  4965. var confPassword = data['password_confirmation'];
  4966. var phoneNumber = data['phone_number'];
  4967. var errs = [];
  4968. var access_rights = 0;
  4969. if(data['membership_view'])
  4970. access_rights = access_rights + parseInt(Ext.getCmp('membership_view').value);
  4971. if(data['membership_update'])
  4972. access_rights = access_rights + parseInt(Ext.getCmp('membership_update').value);
  4973. if(data['membership_delete'])
  4974. access_rights = access_rights + parseInt(Ext.getCmp('membership_delete').value);
  4975. if(memberName == '')
  4976. errs.push("Name can't be blank");
  4977. if(password == '')
  4978. errs.push("Password can't be blank");
  4979. if(password != confPassword)
  4980. errs.push("Password not matched");
  4981. if(access_rights == 0)
  4982. errs.push("Please give access rights to member");
  4983. if(errs.length){
  4984. this.view.showFlashMsg(errs, "error");
  4985. return ;
  4986. }
  4987. this.view.removeFlashMsg();
  4988. var params = {};
  4989. params['name'] = memberName;
  4990. params['password'] = password;
  4991. params['layer_id'] = data['memebership[layer_id]'];
  4992. params['phone_number'] = phoneNumber;
  4993. params['access_rights'] = access_rights;
  4994. GEvent.dispatchEvent(new Events.MemberEvent(Events.MemberEvent.SAVE_MEMBER, params));
  4995. },
  4996. showMemberCreatedFailed: function(errs){
  4997. this.view.showFlashResponse(errs,"error");
  4998. },
  4999. closeMemberWindow: function(){
  5000. this.view.closeMemberWindow();
  5001. },
  5002. showEditMemberWindow: function(data){
  5003. this.view.showEditMemberWindow(data);
  5004. },
  5005. updateMember: function(data){
  5006. var errs = [];
  5007. var access_rights = 0;
  5008. var membership_id = data['memebership[id]'];
  5009. if(data['membership_view'])
  5010. access_rights = access_rights + parseInt(Ext.getCmp('membership_view').value);
  5011. if(data['membership_update'])
  5012. access_rights = access_rights + parseInt(Ext.getCmp('membership_update').value);
  5013. if(data['membership_delete'])
  5014. access_rights = access_rights + parseInt(Ext.getCmp('membership_delete').value);
  5015. if(errs.length){
  5016. this.view.showFlashMsg(errs,"error");
  5017. return ;
  5018. }
  5019. var params = {};
  5020. params['id'] = membership_id;
  5021. params['access_rights'] = access_rights;
  5022. GEvent.dispatchEvent(new Events.MemberEvent(Events.MemberEvent.UPDATE_MEMBER, params));
  5023. },
  5024. showUpdatedError: function(){
  5025. this.view.showUpdatedError();
  5026. },
  5027. closeEditMemberWindow: function(){
  5028. this.view.closeEditMemberWindow();
  5029. }
  5030. }
  5031. Events.MapsEvent = function(type,data){
  5032. this.type = type;
  5033. this.data = data ;
  5034. }
  5035. Events.MapsEvent.MAPS_MARKER_REMOVE= "mapRemoveDraggableMarker";
  5036. Events.MapsEvent.MAPS_MARKER_SHOW_DRAGGABLE = "mapShowDraggableMarker";
  5037. Events.MapsEvent.MAPS_MARKER_UNDRAGGABLE = "mapUnDraggableMarker";
  5038. Events.MapsEvent.MAPS_MARKER_DRAGGABLE_RESET = "mapMarkerDraggleReset";
  5039. Events.ResourcesEvent.MAPS_MARKER_HIDE_DRAGGABLE = "mapMarkerDraggableHide";
  5040. Events.MapsEvent.VIEW_SHOW = "viewShowMapEvent";
  5041. Events.MapsEvent.MARKER_STATUS = "markerStatusEvent";
  5042. Events.MapsEvent.SET_CENTER = "mapCenterEvent";
  5043. Events.MapsEvent.SET_CENTER = "mapCenterEvent";
  5044. Events.MapsEvent.SET_POSITION_DRAGGABLE_MARKER = "mapSetPostionDraggableMarker";
  5045. Events.MapsEvent.LOADING_WINDOW_SHOW = "mapLoadingWindowShow";
  5046. Events.MapsEvent.LOADING_WINDOW_CLOSE = "mapLoadingWindowClose";
  5047. Events.MemberEvent = function(type,data){
  5048. this.type = type;
  5049. this.data = data ;
  5050. }
  5051. Events.MemberEvent.SHOW_ADD_NEW_MEMBER_WINDOW = 'showAddNewMemberWindowEvents';
  5052. Events.MemberEvent.SAVE_MEMBER = 'saveMemberEvents';
  5053. Events.MemberEvent.MEMBER_CREATED = "memberCreatedMemberEvents" ;
  5054. Events.MemberEvent.MEMBER_CREATED_FAILED = "memberCreatedFailedMemberEvents" ;
  5055. Events.MemberEvent.EDIT_MEMBER_ACCESS_RIGHTS = "memberEditAccessRightsEvents";
  5056. Events.MemberEvent.UPDATE_MEMBER = "memberUpdateEvents";
  5057. Events.MemberEvent.MEMBER_GET_UPDATED = "memberGetUpdatedEvents";
  5058. Events.MemberEvent.MEMBER_GET_UPDATED_FAILED = "memberGetUpdatedFailedEvents";
  5059. Events.MemberEvent.GET_MEMBER_SUCCESS = "memberGetMemberSuccessEvents";
  5060. Events.UtilitiesEvent = function(type,data){
  5061. this.type = type;
  5062. this.data = data;
  5063. };
  5064. Events.UtilitiesEvent.VIEW_HIDE_ALL = 'viewHideAllUtilitiesEvent';
  5065. Events.UtilitiesEvent.VIEW_SWITCHER = 'viewSwitcherUtilitiesEvent';
  5066. Events.UtilitiesEvent.UPLOAD_ICON = 'viewUploadIconUtilitiesEvent';
  5067. Events.UtilitiesEvent.IMPORT_RESOURCES = 'viewImportResourceUtilitiesEvent';
  5068. /**
  5069. * @author iLab js lib
  5070. */
  5071. function waterMark(){
  5072. var water_mark = Ext.select(".waterMark");
  5073. Ext.each(water_mark.elements, function(elm){
  5074. var waterMarkText = elm.value;
  5075. Ext.get(elm).on("blur",function(){
  5076. if(this.dom.value == '') {
  5077. this.dom.value = waterMarkText;
  5078. }
  5079. if(this.dom.value == waterMarkText) {
  5080. this.addClass('waterMark');
  5081. }
  5082. }).on("focus",function(){
  5083. this.removeClass('waterMark');
  5084. if(this.dom.value == waterMarkText){
  5085. this.dom.value = "";
  5086. }
  5087. });
  5088. });
  5089. }
  5090. function waterMarkById(id){
  5091. var water_mark = Ext.getCmp(id);
  5092. if(water_mark){
  5093. var waterMarkText = water_mark.value;
  5094. water_mark.el.on("blur", function(){
  5095. if (this.dom.value == '') {
  5096. this.dom.value = waterMarkText;
  5097. }
  5098. if (this.dom.value == waterMarkText) {
  5099. this.addClass('waterMark');
  5100. }
  5101. }).on("focus", function(){
  5102. this.removeClass('waterMark');
  5103. if (this.dom.value == waterMarkText) {
  5104. this.dom.value = "";
  5105. }
  5106. });
  5107. }
  5108. }
  5109. View.MyLayerView = function(){
  5110. this.presenter = new Presenter.MyLayerPresenter(this);
  5111. this.layerRecord = Ext.data.Record.create([ {name: "id"}, {name: "name"}, {name: "icon"} ]);
  5112. this.presenter.initialize();
  5113. var _myLayerView = this;
  5114. };
  5115. View.MyLayerView.prototype = {
  5116. createMyLayer: function(){
  5117. var _self = this;
  5118. var _myLayerView = this;
  5119. new Ext.FormPanel({
  5120. id: "my_layer",
  5121. style:"background-color:#fff;",
  5122. renderTo:document.body,
  5123. autoScroll:true,
  5124. layout: 'hbox',
  5125. items: [
  5126. {
  5127. html: '<h2 > My Layers </h2>',
  5128. cls: 'myLayersTitle'
  5129. },
  5130. {
  5131. html: " ",
  5132. id: 'importResourceStatus'
  5133. },
  5134. {
  5135. xtype: 'grid',
  5136. id: 'my_layers_grid',
  5137. frame: true,
  5138. width: 800,
  5139. height:500,
  5140. autoScroll: true,
  5141. store: {
  5142. xtype: 'jsonstore',
  5143. fields: ['id', 'name' ,'icon', 'description', 'is_public', '']
  5144. },
  5145. viewConfig: { autoFill: true },
  5146. columns: [
  5147. { header: 'Icon', dataIndex: 'icon',width:70, mapping: 'icon', renderer:_myLayerView.generateIcon},
  5148. { header: 'Layers', dataIndex: 'name', mapping: 'name', renderer:_myLayerView.generateLink},
  5149. { header: 'Description', dataIndex: 'description' },
  5150. { header: 'Public', width: 40, dataIndex: 'is_public',renderer:_myLayerView.generateCheckBox},
  5151. { header: 'Template', renderer: _myLayerView.generateTemplate},
  5152. { header: 'Import CSV', renderer: _myLayerView.generateImportCSV}
  5153. ],
  5154. listeners: {
  5155. afterRender: function(){
  5156. _myLayerView.presenter.loadMyLayer();
  5157. },
  5158. cellclick : function (grid, rowIndex,columnIndex,e ){
  5159. if( columnIndex == 0 && rowIndex>=0 ){
  5160. var id = grid.store.data.items[rowIndex].data.id ;
  5161. var layer_name = grid.store.data.items[rowIndex].data.name ;
  5162. _myLayerView.presenter.displayUploadIconWindow(id,layer_name);
  5163. }
  5164. if( columnIndex == 5 && rowIndex>=0 ){
  5165. var id = grid.store.data.items[rowIndex].data.id ;
  5166. var layer_name = grid.store.data.items[rowIndex].data.name ;
  5167. var data = {};
  5168. data['id'] = id;
  5169. data['layer_name'] = layer_name;
  5170. _myLayerView.presenter.displayImportResourcesWindows(data);
  5171. }
  5172. if (columnIndex == 4 && rowIndex>=0){
  5173. var id = grid.store.data.items[rowIndex].data.id ;
  5174. var url = SETTING.WEBROOT + "layers/" + id + "/property_templates.csv";
  5175. window.location.href =url;
  5176. }
  5177. if (columnIndex == 1 && rowIndex>=0){
  5178. var layerId = grid.store.data.items[rowIndex].data.id ;
  5179. _myLayerView.presenter.showFrontLayer(layerId);
  5180. }
  5181. }
  5182. },
  5183. tbar:[{
  5184. html: "<a href='javascript:void(0);' class='add' > Add Layer </a>",
  5185. cls : "toolbar",
  5186. handler :function(){
  5187. _myLayerView.presenter.showNewLayerWindow();
  5188. }
  5189. }],
  5190. bbar:[
  5191. {
  5192. html:"",
  5193. id: "sbMyLayerStatus"
  5194. }
  5195. ],
  5196. buttons:[{
  5197. text: "<span id='buttonUpdate' class='update'>Update</span>",
  5198. handler :function(){
  5199. var cbStatus = Ext.query("input[name=public_status]");
  5200. _self.showUpdateProcess();
  5201. if(cbStatus){
  5202. var status = {"layer":{}};
  5203. for(var i=0;i<cbStatus.length;i++){
  5204. status["layer"][cbStatus[i].value] = (cbStatus[i].checked)?1:0;
  5205. }
  5206. var data = Json.encode(status);
  5207. _myLayerView.presenter.updateLayerStatus(data);
  5208. }
  5209. }
  5210. }]
  5211. }
  5212. ],
  5213. listeners:{
  5214. afterRender:function(){
  5215. _myLayerView.drawMyLayerOverLay();
  5216. }
  5217. }
  5218. });
  5219. },
  5220. generateLink: function (nam,row,col){
  5221. var layer_id = col.data.id;
  5222. var layer_name = col.data.name;
  5223. var str = "<a href='javascript:void(0);' class='nameMyLayer' > ";
  5224. str += layer_name ;
  5225. str += "</a>";
  5226. return str;
  5227. },
  5228. generateIcon: function(icon,row,col){
  5229. var layer_id = col.data.id ;
  5230. var icon = (!icon)? SETTING.MARKER_ICON_DEFAULT:icon;
  5231. var str = "<a class='iconMyLayer noUnderline' href='javascript:void(0);' > ";
  5232. if(!icon)
  5233. icon = SETTING.MARKER_ICON_DEFAULT ;
  5234. str += "<img src='"+ SETTING.MARKER_ICON_PATH + icon + "' /> ";
  5235. str += "<br />";
  5236. str += "Change icon </a>";
  5237. return str;
  5238. },
  5239. generateCheckBox: function(isPublic, metaData, record, rowIndex, colIndex, store){
  5240. var layerId = record.data.id;
  5241. var state="";
  5242. if(isPublic)
  5243. state = "checked";
  5244. var str = "<input type='checkbox' id ='myLayerCheckboxGrid_"+layerId+"' value='"+layerId+"' name='public_status' class='my_layer_check' " + state + " /> ";
  5245. str += "<input type='checkbox' id ='myLayerCheckboxGridHide_"+layerId+"' value='"+layerId+"' name='public_status_hide' style='display:none;' " + state + " /> ";
  5246. return str;
  5247. },
  5248. drawMyLayerOverLay:function(){
  5249. var w = Ext.fly("region_center").getWidth();
  5250. var h = Ext.fly("region_center").getHeight();
  5251. var top = Ext.fly("region_center").dom.style.top;
  5252. Ext.fly("my_layer").dom.style.top = 50 +"px";
  5253. Ext.fly("my_layer").dom.style.position ="absolute";
  5254. Ext.getCmp("my_layer").setWidth(w);
  5255. Ext.getCmp("my_layer").setHeight(h);
  5256. },
  5257. addItem: function(layer){
  5258. Ext.getCmp('my_layers_grid').getStore().add(new this.layerRecord(layer));
  5259. },
  5260. clear: function(){
  5261. Ext.getCmp('my_layers_grid').getStore().removeAll();
  5262. },
  5263. createUploadWindow: function(id, layer_name){
  5264. _myLayerView = this ;
  5265. if(!_myLayerView.getUploadIconWindow()){
  5266. new Ext.Window({
  5267. id: "upload_icon_window",
  5268. title: "Upload icon",
  5269. renderTo: 'my_layer',
  5270. closable: true,
  5271. draggable: true,
  5272. width:400,
  5273. zIndex :30000,
  5274. modal: true,
  5275. autoHeight:true,
  5276. listeners:{
  5277. close: function(){
  5278. try{
  5279. window.SETTING.swfUpload =null;
  5280. }
  5281. catch(ex){}
  5282. }
  5283. },
  5284. items:[
  5285. {
  5286. xtype:"panel",
  5287. cls:'paragraph_msg',
  5288. autoHeight:true,
  5289. items:[
  5290. {
  5291. id: "upload_icon_layer_title",
  5292. html : "Upload image",
  5293. frame: true
  5294. },
  5295. {
  5296. id: "swf_container",
  5297. html : _myLayerView.swfContainer(),
  5298. frame: false,
  5299. listeners:{
  5300. afterRender:function(){
  5301. Ext.fly("upload_button").on("click",function(){
  5302. _myLayerView.presenter.startUploadIcon(SETTING.swfUpload);
  5303. });
  5304. }
  5305. }
  5306. }
  5307. ]
  5308. }
  5309. ]
  5310. });
  5311. }
  5312. },
  5313. createFlashUploadObj:function(layer_id){
  5314. var _myLayerView = this;
  5315. var settings = {
  5316. flash_url : window.SETTING.WEBROOT + "javascripts/lib/swfupload/Flash/swfupload.swf",
  5317. upload_url: window.SETTING.UPLOAD_ICON,
  5318. post_params: {"auth_token" : Authentication.getAuthToken(),"layer_id":layer_id},
  5319. file_size_limit : "500 KB",
  5320. file_types : "*.png;*.jpeg;*.gif;*.jpg;*.ico",
  5321. file_types_description : "All Files",
  5322. file_upload_limit : 100,
  5323. file_queue_limit : 100,
  5324. custom_settings : {
  5325. progressTarget : "fsUploadProgress",
  5326. cancelButtonId : "btnCancel"
  5327. },
  5328. button_image_url: SETTING.WEBROOT + "images/upload.png",
  5329. button_width: "100",
  5330. button_height: "30",
  5331. button_text : "Choose File " ,
  5332. button_placeholder_id: "spanButtonPlaceHolder",
  5333. button_text_style: ".theFont { font-size:28px; } ",
  5334. button_text_left_padding: 12,
  5335. button_text_top_padding: 3,
  5336. button_cursor : SWFUpload.CURSOR.HAND,
  5337. button_action : SWFUpload.BUTTON_ACTION.SELECT_FILE,
  5338. file_queued_handler : _myLayerView.fileQueued,
  5339. file_queue_error_handler :_myLayerView._fileQueueError,
  5340. upload_start_handler : _myLayerView.uploadStart,
  5341. upload_progress_handler :_myLayerView.uploadProgress,
  5342. upload_error_handler : _myLayerView.uploadError,
  5343. upload_success_handler : _myLayerView.uploadSuccess
  5344. };
  5345. window.SETTING.swfUpload = new SWFUpload(settings);
  5346. SETTING.swfUpload.addSetting();
  5347. },
  5348. generateUploadLabel: function(layer_name){
  5349. var str = "<div> Upload image for using as icon <span class='highText'> " + layer_name +"</span> </div>" ;
  5350. str += "<div> Maximum size <span class='highText'> " + SETTING.swfUpload.settings.file_size_limit+ "</span> </div><br />";
  5351. Ext.fly("upload_icon_layer_title").update(str);
  5352. },
  5353. showUploadIconWindow: function(){
  5354. this.getUploadIconWindow().show();
  5355. },
  5356. hideUploadIconWindow: function(){
  5357. this.getUploadIconWindow().hide();
  5358. },
  5359. getUploadIconWindow:function(){
  5360. return Ext.getCmp("upload_icon_window");
  5361. },
  5362. swfContainer:function(){
  5363. str ='<div class="fieldset flash" id="fsUploadProgress"> <span class="legend"> </span></div>';
  5364. str += "<div id='status'>";
  5365. str += "<div id='progress_wrapper'> ";
  5366. str += "<div id='progress'> </div>";
  5367. str += "</div>";
  5368. str += "<div id='percentage'> 0% </div>";
  5369. str += "</div>";
  5370. str += "<div class='clear'> </div>";
  5371. str += "<div id='fileUpload' class='fileUpload'> Please select a file to upload </div> ";
  5372. str +="<div class='clear'></div>";
  5373. str += '<div style="float:right;" >' ;
  5374. str += '<span id="spanButtonPlaceHolder"> </span>';
  5375. str += '<a href ="javascript:void(0)" name="Upload" id="upload_button" class="upload_button" > <span> Upload </span> </a>';
  5376. str += '</div> ';
  5377. return str;
  5378. },
  5379. hide: function(){
  5380. Ext.getCmp("my_layer").hide();
  5381. },
  5382. show: function(){
  5383. Ext.getCmp("my_layer").show();
  5384. },
  5385. closeUploadIconWindow:function(){
  5386. window.SETTING.swfUpload = null;
  5387. Ext.getCmp("upload_icon_window").close();
  5388. },
  5389. fileQueued:function(file){
  5390. SETTING.swfUpload.QueueFile = file;
  5391. var propertyFile = '<span class="fname">' + file.name + '</span>';
  5392. propertyFile += ' : <span class="fsize">(' + file.size + 'Bytes) </span>';
  5393. Ext.fly('fileUpload').update(propertyFile).replaceClass('fileFail','fileUpload');
  5394. },
  5395. fileQueueError:function(file, error_code, message){
  5396. var propertyFile = '<div><span class="fname">' + file.name + '</span>';
  5397. propertyFile += ' : <span class="fsize">(' + file.size + ' Bytes)</span></div>';
  5398. propertyFile += '<div> ' + message + "</div>";
  5399. Ext.fly('fileUpload').update(propertyFile).replaceClass('fileUpload','fileFail');
  5400. SETTING.swfUpload.QueueFile = null;
  5401. },
  5402. uploadStart:function(file){
  5403. Ext.fly("status").setStyle({"visibility":"visible"});
  5404. },
  5405. uploadProgress:function(file, byteComplete, totalBytes){
  5406. var percentage = 100*(byteComplete/totalBytes);
  5407. percentage = (parseInt(percentage*100))/100;
  5408. var width = (byteComplete/totalBytes) * 180;
  5409. Ext.fly("progress").setStyle({"width":width+"px"});
  5410. Ext.fly("percentage").update(percentage+"% ");
  5411. },
  5412. uploadError:function(file, code, httpErrorCode){
  5413. try{
  5414. var propertyFile = '<div><span class="fname">' + file.name + '</span>';
  5415. propertyFile += ' : <span class="fsize">(' + file.size + ' Bytes)</span></div>';
  5416. propertyFile += '<div> Http status : <b> ' + httpErrorCode + "</b></div>";
  5417. propertyFile += '<div> <b> Please try again later </b></div>';
  5418. Ext.fly('fileUpload').update(propertyFile).replaceClass('fileUpload','fileFail');
  5419. }
  5420. catch(Ex){
  5421. }
  5422. SETTING.swfUpload.QueueFile = null;
  5423. Ext.fly("status").setStyle({"visibility":"hidden"});
  5424. },
  5425. uploadSuccess:function(file, responseText){
  5426. if(responseText == SETTING.swfUpload.QueueFile.size){
  5427. _myLayerView.presenter.iconUploaded();
  5428. _myLayerView._uploadSuccess();
  5429. }
  5430. },
  5431. _uploadSuccess:function(file, responseText, response){
  5432. Ext.fly("status").setStyle({"visibility":"hidden"});
  5433. Ext.getCmp("upload_icon_window").close();
  5434. },
  5435. showUploadFileNullError: function(){
  5436. var propertyFile = '<div> ' + 'Please select file to upload' + "</div>";
  5437. Ext.fly('fileUpload').update(propertyFile).replaceClass('fileUpload','fileFail');
  5438. },
  5439. showNewLayerWindow: function(){
  5440. var _self = this;
  5441. var width = 300;
  5442. var windId = "new_layer_window" ;
  5443. var newLayerWindow = new Ext.Window({
  5444. id:windId,
  5445. modal: true,
  5446. renderTo: 'my_layer',
  5447. width:450,
  5448. title: "New Layer",
  5449. items:[{
  5450. xtype: 'form',
  5451. layout: 'form',
  5452. align: 'right',
  5453. id: "new_layer_form",
  5454. bodyStyle: 'padding: 5px',
  5455. items: [
  5456. {
  5457. xtype: "panel",
  5458. id: "add_new_layer_error_msg",
  5459. cls: "error_msg",
  5460. html: ""
  5461. },
  5462. {
  5463. xtype: 'textfield',
  5464. name: 'layer[name]',
  5465. id: "layer_new",
  5466. emptyText: '',
  5467. width: width,
  5468. enableKeyEvents:true,
  5469. fieldLabel: 'Name<span class="require">*</span>',
  5470. listeners: {
  5471. }
  5472. },
  5473. {
  5474. xtype: 'textarea',
  5475. name: 'layer[description]',
  5476. id: "layer_description",
  5477. emptyText: '',
  5478. width: width,
  5479. enableKeyEvents:true,
  5480. fieldLabel: 'Description',
  5481. listeners: {
  5482. }
  5483. },
  5484. {
  5485. xtype: 'checkbox',
  5486. name: 'layer[is_public]',
  5487. id: "layer_public",
  5488. value: 1,
  5489. emptyText: '',
  5490. width: width,
  5491. enableKeyEvents:true,
  5492. fieldLabel: 'Allow to public',
  5493. listeners: {
  5494. }
  5495. }
  5496. ]
  5497. }],
  5498. buttons: [
  5499. {
  5500. text: 'Save',
  5501. handler: function(){
  5502. var dataForm = Ext.getCmp('new_layer_form').getForm().getValues();
  5503. dataForm["layer[is_public]"] = (Ext.get("layer_public").dom.checked)?1:0;
  5504. _self.hideErrorMessage();
  5505. _self.presenter.createLayer(dataForm);
  5506. }
  5507. }
  5508. ]
  5509. });
  5510. newLayerWindow.show();
  5511. },
  5512. showErrorMessage: function(errors){
  5513. var errorsMessages = [];
  5514. for(var i=0;i<errors.length;i++){
  5515. var fieldName = errors[i][0];
  5516. var firstLetter = fieldName.substr(0,1);
  5517. var subStr = fieldName.substr(1);
  5518. var errField = firstLetter.toUpperCase() + subStr ;
  5519. errorsMessages.push(errField + " : " + errors[i][1]);
  5520. }
  5521. var errorStr = errorsMessages.join("<br />");
  5522. Ext.fly("add_new_layer_error_msg").update(errorStr).show();
  5523. },
  5524. hideErrorMessage: function(){
  5525. try{
  5526. Ext.fly("add_new_layer_error_msg").hide();
  5527. }catch(ex){
  5528. alert(ex.toString())
  5529. }
  5530. },
  5531. closeAddNewLayerWindow: function(){
  5532. Ext.getCmp('new_layer_window').close();
  5533. },
  5534. showMyLayerStatusSaved: function(){
  5535. Ext.getCmp("sbMyLayerStatus").el.update("<div class='success'> Layer status have been saved successfully</div>");
  5536. },
  5537. showMyLayerStatusSavedFailed: function(data){
  5538. Ext.getCmp("sbMyLayerStatus").el.update("<div class='error'> Layer status could not be updated </div>");
  5539. for(layerId in data){
  5540. Ext.get("myLayerCheckboxGrid_"+layerId).dom.checked = Ext.get("myLayerCheckboxGridHide_"+layerId).dom.checked
  5541. }
  5542. },
  5543. showUpdateProcess: function(){
  5544. Ext.getCmp("sbMyLayerStatus").el.update("<div class='div_progress' > Update in progress </div>");
  5545. },
  5546. generateTemplate: function(name, row, col){
  5547. var action_link = "<a href='javascript:void(0);' class='my-layer-grid-action' >download template</a>" ;
  5548. return action_link;
  5549. },
  5550. generateImportCSV: function(name, row, col){
  5551. var action_link = "<a href='javascript:void(0)' class='my-layer-grid-action'>import csv</a>";
  5552. return action_link;
  5553. },
  5554. showImportSuccessMessage: function(){
  5555. Ext.getCmp("importResourceStatus").el.update("<div class='import-success'> Data is imported successfully</div>");
  5556. Ext.getCmp("importResourceStatus").el.fadeIn({endOpacity: 0,duration: 0.5});
  5557. Ext.getCmp('importResourceStatus').el.fadeOut({
  5558. endOpacity: 0, //can be any value between 0 and 1 (e.g. .5)
  5559. easing: 'easeOut',
  5560. duration: 15,
  5561. remove: false,
  5562. useDisplay: false
  5563. });
  5564. }
  5565. };
  5566. Presenter.MyLayerPresenter = function(view){
  5567. this.view = view;
  5568. _this = this;
  5569. this.loaded = false;
  5570. };
  5571. Presenter.MyLayerPresenter.prototype ={
  5572. initialize:function(){
  5573. this.view.createMyLayer();
  5574. },
  5575. loadMyLayer: function(){
  5576. GEvent.dispatchEvent(new Events.LayersEvent(Events.LayersEvent.MYLAYER_LOAD));
  5577. this.loaded = true;
  5578. },
  5579. populate: function(layers){
  5580. this.view.clear();
  5581. for(var i=0; i<layers.length; i++){
  5582. this.view.addItem(layers[i]);
  5583. }
  5584. },
  5585. displayUploadIconWindow: function(id, layer_name){
  5586. this.view.createUploadWindow();
  5587. this.view.createFlashUploadObj(id);
  5588. this.view.generateUploadLabel(layer_name);
  5589. this.view.showUploadIconWindow();
  5590. },
  5591. hideView: function(){
  5592. this.view.hide();
  5593. },
  5594. showView: function(){
  5595. if(this.loaded ==false)
  5596. this.loadMyLayer();
  5597. this.view.show();
  5598. },
  5599. startUploadIcon: function(swf){
  5600. if(!swf.QueueFile ){
  5601. this.view.showUploadFileNullError();
  5602. return;
  5603. }
  5604. GEvent.dispatchEvent(new Events.UtilitiesEvent(Events.UtilitiesEvent.UPLOAD_ICON,swf))
  5605. },
  5606. showNewLayerWindow: function(){
  5607. this.view.showNewLayerWindow();
  5608. },
  5609. createLayer: function(data){
  5610. GEvent.dispatchEvent(new Events.LayersEvent(Events.LayersEvent.CREATE_MY_LAYER,data))
  5611. },
  5612. addNewLayerToMyLayerGrid: function(layer){
  5613. this.view.addItem(layer);
  5614. this.view.closeAddNewLayerWindow();
  5615. },
  5616. showAddNewLayerError: function(errors){
  5617. this.view.showErrorMessage(errors);
  5618. },
  5619. updateLayerStatus: function(statusList){
  5620. GEvent.dispatchEvent(new Events.LayersEvent(Events.LayersEvent.UPDATE_MY_LAYER_STATUS,statusList));
  5621. },
  5622. showMyLayerStatusSaved: function(){
  5623. this.view.showMyLayerStatusSaved();
  5624. },
  5625. showMyLayerStatusSavedFailed: function(data){
  5626. this.view.showMyLayerStatusSavedFailed(data);
  5627. },
  5628. displayImportResourcesWindows: function(data){
  5629. GEvent.dispatchEvent(new Events.ResourcesEvent(Events.ResourcesEvent.SHOW_IMPORT_RESOURCES,data));
  5630. },
  5631. iconUploaded: function(){
  5632. GEvent.dispatchEvent(new Events.LayersEvent(Events.LayersEvent.MYLAYER_LOAD));
  5633. GEvent.dispatchEvent(new Events.LayersEvent(Events.LayersEvent.LAYERS_LOAD));
  5634. GEvent.dispatchEvent(new Events.ResourcesEvent(Events.ResourcesEvent.RESOURCE_LOAD));
  5635. },
  5636. reloadData: function(){
  5637. this.loaded = false;
  5638. },
  5639. showImportMessageStatus: function(){
  5640. this.view.showImportSuccessMessage();
  5641. },
  5642. showFrontLayer: function(layerId){
  5643. GEvent.dispatchEvent(new Events.LayersEvent(Events.LayersEvent.SHOW_FRONT_LAYER_EVENT, layerId));
  5644. },
  5645. };
  5646. org.instedd.ResourceMap.Home = function(){
  5647. }
  5648. org.instedd.ResourceMap.Home.prototype = {
  5649. init: function(){
  5650. this.authenticate();
  5651. var view = new View.HomeView();
  5652. GEvent.dispatchEvent(new Events.SystemEvent(Events.SystemEvent.PREINITIALIZE));
  5653. new Controller.HomeController(view.presenter);
  5654. GEvent.dispatchEvent(new Events.SystemEvent(Events.SystemEvent.INITIALIZE));
  5655. },
  5656. authenticate: function()
  5657. {
  5658. if(Authentication.verify()){
  5659. AjaxRequest.authenticate(Authentication.getAuthToken());
  5660. }
  5661. }
  5662. }
  5663. Controller.HomeController = function(presenter){
  5664. var _self = this;
  5665. this.presenter = presenter;
  5666. this.layerManager = Model.Factory.create('LayerManager');
  5667. this.resourceManager = Model.Factory.create('ResourceManager');
  5668. this.authManager = Model.Factory.create('AuthenticationManager');
  5669. this.templateManager = Model.Factory.create('TemplateManager');
  5670. this.uploadManager = Model.Factory.create('UploadManager');
  5671. GEvent.addEventListener(Events.SystemEvent.INITIALIZE, function(e){
  5672. });
  5673. GEvent.addEventListener(Events.ResourcesEvent.RESOURCES_CHANGED, function(e){
  5674. _self.presenter.children.mapPresenter.populate(_self.resourceManager.resources);
  5675. });
  5676. GEvent.addEventListener(Events.LayersEvent.LAYERS_LOAD, function(e){
  5677. if(Authentication.verify()){
  5678. _self.layerManager.getLayers(Authentication.getCurrentUser());
  5679. } else {
  5680. _self.layerManager.getPublicLayers();
  5681. }
  5682. });
  5683. GEvent.addEventListener(Events.LayersEvent.LAYERS_CHANGED, function(e){
  5684. _self.presenter.children.layerWindowPresenter.populateLayers(_self.layerManager.layers);
  5685. });
  5686. GEvent.addEventListener(Events.AuthenticationEvent.USER_LOGIN, function(e){
  5687. _self.authManager.login(e.data);
  5688. });
  5689. GEvent.addEventListener(Events.AuthenticationEvent.LOGIN_SUCCESS, function(e){
  5690. Authentication.saveSession(_self.authManager.session);
  5691. _self.presenter.loginSuccess();
  5692. });
  5693. GEvent.addEventListener(Events.AuthenticationEvent.LOGIN_FAILED, function(e){
  5694. _self.presenter.loginFailed();
  5695. });
  5696. GEvent.addEventListener(Events.MapsEvent.MAPS_MARKER_REMOVE, function(e){
  5697. _self.presenter.children.mapPresenter.removeDraggableMarker();
  5698. });
  5699. GEvent.addEventListener(Events.MapsEvent.MAPS_MARKER_SHOW_DRAGGABLE, function(e){
  5700. _self.presenter.children.mapPresenter.showDraggableMarker(e.data);
  5701. });
  5702. GEvent.addEventListener(Events.MapsEvent.MAPS_MARKER_UNDRAGGABLE, function(e){
  5703. _self.presenter.children.mapPresenter.setMarkerDraggability(false);
  5704. });
  5705. GEvent.addEventListener(Events.MapsEvent.MAPS_MARKER_DRAGGABLE_RESET, function(e){
  5706. layers = _self.layerManager.layers;
  5707. resource = e.data;
  5708. _self.presenter.children.mapPresenter.updateResourceMarker(resource,layers);
  5709. });
  5710. GEvent.addEventListener(Events.ResourcesEvent.RESOURCES_SAVE, function(e){
  5711. _self.resourceManager.createResource(e.data);
  5712. });
  5713. GEvent.addEventListener(Events.ResourcesEvent.RESOURCE_ADDED, function(e){
  5714. _self.presenter.children.layerWindowPresenter.updateForm(e.data);
  5715. });
  5716. GEvent.addEventListener(Events.ResourcesEvent.RESOURCE_GET_DETAIL, function(e){
  5717. _self.presenter.children.layerWindowPresenter.renderResourceDetail(e.data);
  5718. });
  5719. GEvent.addEventListener(Events.ResourcesEvent.RESOURCE_REQUEST_GET_DETAIL, function(e){
  5720. _self.resourceManager.getResourceDetail(e.data);
  5721. });
  5722. GEvent.addEventListener(Events.ResourcesEvent.RESOURCE_LOAD, function(e){
  5723. _self.resourceManager.loadResources();
  5724. });
  5725. GEvent.addEventListener(Events.LayersEvent.MYLAYER_LOAD, function(e){
  5726. _self.layerManager.loadMyLayer();
  5727. });
  5728. GEvent.addEventListener(Events.LayersEvent.MYLAYERS_CHANGED, function(e){
  5729. _self.presenter.getMyLayerPresenter().populate(e.data);
  5730. });
  5731. GEvent.addEventListener(Events.LayersEvent.MYLAYERS_HIDE, function(e){
  5732. _self.presenter.getMyLayerPresenter().hideMyLayer();
  5733. });
  5734. GEvent.addEventListener(Events.UtilitiesEvent.VIEW_HIDE_ALL, function(e){
  5735. _self.presenter.hideAll();
  5736. });
  5737. GEvent.addEventListener(Events.LayersEvent.MYLAYERS_SHOW, function(e){
  5738. _self.presenter.getMyLayerPresenter().showView();
  5739. });
  5740. GEvent.addEventListener(Events.MapsEvent.VIEW_SHOW , function(e){
  5741. _self.presenter.getMapPresenter().showView();
  5742. });
  5743. GEvent.addEventListener(Events.TemplatesEvent.TEMPLATES_LOAD, function(e){
  5744. _self.templateManager.loadTemplates(e.data);
  5745. });
  5746. GEvent.addEventListener(Events.TemplatesEvent.TEMPLATES_CHANGED, function(e){
  5747. _self.presenter.children.layerWindowPresenter.populateTemplates(_self.templateManager.templates);
  5748. });
  5749. GEvent.addEventListener(Events.UtilitiesEvent.UPLOAD_ICON, function(e){
  5750. _self.uploadManager.startUploadIcon(e.data);
  5751. });
  5752. this.presenter.initialize();
  5753. GEvent.addEventListener(Events.MapsEvent.MARKER_STATUS, function(e){
  5754. _self.presenter.getMapPresenter().setMarkerStatus();
  5755. });
  5756. GEvent.addEventListener(Events.ResourcesEvent.RESOURCES_LOAD_TEMPLATE, function(e){
  5757. _self.resourceManager.getResourceTemplate(e.data);
  5758. });
  5759. GEvent.addEventListener(Events.ResourcesEvent.RESOURCE_GET_TEMPLATE, function(e){
  5760. _self.presenter.children.layerWindowPresenter.showResourcesListWindow(e.data);
  5761. });
  5762. GEvent.addEventListener(Events.ResourcesEvent.RESOURCE_LOAD_DETAIL_FOR_RESOURCE_LIST, function(e){
  5763. _self.resourceManager.getResourceDetailForResourceList(e.data);
  5764. });
  5765. GEvent.addEventListener(Events.ResourcesEvent.RESOURCE_GET_DETAIL_FOR_RESOURCE_LIST, function(e){
  5766. var resource = e.data;
  5767. _self.presenter.children.mapPresenter.moveToPoint(resource);
  5768. _self.presenter.children.layerWindowPresenter.renderResourceDetail(resource);
  5769. });
  5770. GEvent.addEventListener(Events.AuthenticationEvent.USER_LOGOUT, function(e){
  5771. _self.authManager.logout();
  5772. });
  5773. GEvent.addEventListener(Events.LayersEvent.CREATE_MY_LAYER, function(e){
  5774. _self.layerManager.createMyLayer(e.data);
  5775. });
  5776. GEvent.addEventListener(Events.AuthenticationEvent.LOGOUT_SUCCESS, function(e){
  5777. Authentication.reset();
  5778. _self.presenter.getFrontLayerPresenter().closeFrontLayerWindow();
  5779. _self.presenter.getMyLayerPresenter().reloadData();
  5780. _self.presenter.logoutSuccess();
  5781. });
  5782. GEvent.addEventListener(Events.LayersEvent.MY_LAYER_ADDED, function(e){
  5783. var layers = _self.layerManager.layers;
  5784. _self.presenter.children.layerWindowPresenter.populateLayers(layers);
  5785. _self.presenter.getMyLayerPresenter().addNewLayerToMyLayerGrid(e.data);
  5786. });
  5787. GEvent.addEventListener(Events.LayersEvent.MY_LAYER_ADDED_FAILED, function(e){
  5788. _self.presenter.getMyLayerPresenter().showAddNewLayerError(e.data);
  5789. });
  5790. GEvent.addEventListener(Events.LayersEvent.UPDATE_MY_LAYER_STATUS, function(e){
  5791. _self.layerManager.updateMyLayerStatus(e.data);
  5792. });
  5793. GEvent.addEventListener(Events.LayersEvent.LAYERS_MY_LAYER_STATUS_SAVED, function(e){
  5794. _self.presenter.getMyLayerPresenter().showMyLayerStatusSaved();
  5795. });
  5796. GEvent.addEventListener(Events.LayersEvent.LAYERS_MY_LAYER_STATUS_SAVED_FAILED, function(e){
  5797. _self.presenter.getMyLayerPresenter().showMyLayerStatusSavedFailed(e.data);
  5798. });
  5799. GEvent.addEventListener(Events.LayersEvent.LAYERS_UPDATE_RESOURCE_LOCATION_DRAGGING, function(e){
  5800. _self.presenter.children.layerWindowPresenter.updateResourceLatLngDragging(e.data);
  5801. });
  5802. GEvent.addEventListener(Events.LayersEvent.LAYERS_LOAD_COMPLETED, function(e){
  5803. var queryString = "layers=";
  5804. for(var i = 0; i < _self.layerManager.layers.length; i++){
  5805. queryString += _self.layerManager.layers[i].name + ","
  5806. }
  5807. _self.resourceManager.loadResourcesOf(queryString);
  5808. });
  5809. GEvent.addEventListener(Events.ResourcesEvent.SHOW_IMPORT_RESOURCES, function(e){
  5810. _self.presenter.getImportResourcePresenter().showImportResourceWindow(e.data);
  5811. });
  5812. GEvent.addEventListener(Events.UtilitiesEvent.IMPORT_RESOURCES, function(e){
  5813. _self.uploadManager.startImportResources(e.data);
  5814. });
  5815. GEvent.addEventListener(Events.ResourcesEvent.LOAD_CONFIRMED_RESOURCES, function(e){
  5816. _self.presenter.getConfirmDataResourcesPresenter().showConfirmDataResourceWindow(e.data);
  5817. });
  5818. GEvent.addEventListener(Events.ResourcesEvent.CONFIRMED_IMPORT_RESOURCES, function(e){
  5819. _self.resourceManager.confirmImport(e.data.fileName, e.data.layerId);
  5820. });
  5821. GEvent.addEventListener(Events.ResourcesEvent.IMPORT_RESOURCES_FROM_CSV_SUCCESS, function(e){
  5822. _self.presenter.getMapPresenter().fitBounds();
  5823. _self.presenter.getConfirmDataResourcesPresenter().hideConfirmDataResourceWindow();
  5824. _self.presenter.getMyLayerPresenter().showImportMessageStatus();
  5825. });
  5826. GEvent.addEventListener(Events.ResourcesEvent.RESOURCE_ITEM_ADDED, function(e){
  5827. _self.presenter.getMapPresenter().generateMarkerItem(e.data);
  5828. });
  5829. GEvent.addEventListener(Events.ResourcesEvent.RESOURCE_EDIT, function(e){
  5830. _self.resourceManager.editResource(e.data);
  5831. });
  5832. GEvent.addEventListener(Events.ResourcesEvent.RESOURCE_EDIT_SUCCESS, function(e){
  5833. _self.presenter.children.layerWindowPresenter.renderEditResourceForm(e.data);
  5834. });
  5835. GEvent.addEventListener(Events.ResourcesEvent.RESOURCES_UPDATE, function(e){
  5836. _self.resourceManager.updateResource(e.data);
  5837. });
  5838. GEvent.addEventListener(Events.ResourcesEvent.RESOURCES_UPDATE_SUCCESS, function(e){
  5839. _self.presenter.getMapPresenter().updateResouceMarker(e.data, true);
  5840. _self.presenter.children.layerWindowPresenter.handleUpdateSuccess(e.data);
  5841. });
  5842. GEvent.addEventListener(Events.MapsEvent.SET_POSITION_DRAGGABLE_MARKER, function(e){
  5843. _self.presenter.getMapPresenter().setDraggableMarkerPosition(e.data);
  5844. });
  5845. GEvent.addEventListener(Events.MapsEvent.LOADING_WINDOW_SHOW, function(e){
  5846. _self.presenter.getMapPresenter().showLoadingWindow();
  5847. });
  5848. GEvent.addEventListener(Events.MapsEvent.LOADING_WINDOW_CLOSE, function(e){
  5849. _self.presenter.getMapPresenter().closeLoadingWindow();
  5850. });
  5851. GEvent.addEventListener(Events.LayersEvent.SHOW_FRONT_LAYER_EVENT, function(e){
  5852. var layer = Helper.layerHelper.getLayer(e.data);
  5853. _self.presenter.getFrontLayerPresenter().showFrontLayerWindow(layer);
  5854. });
  5855. GEvent.addEventListener(Events.MemberEvent.SHOW_ADD_NEW_MEMBER_WINDOW, function(e){
  5856. _self.presenter.getFrontMemberPresenter().showMemberWindow(e.data);
  5857. });
  5858. GEvent.addEventListener(Events.MemberEvent.SAVE_MEMBER, function(e){
  5859. _self.layerManager.saveMember(e.data);
  5860. });
  5861. GEvent.addEventListener(Events.MemberEvent.MEMBER_CREATED, function(e){
  5862. _self.presenter.getFrontLayerPresenter().handleMemberSaved(e.data);
  5863. _self.presenter.getFrontMemberPresenter().closeMemberWindow();
  5864. });
  5865. GEvent.addEventListener(Events.MemberEvent.MEMBER_CREATED_FAILED, function(e){
  5866. _self.presenter.getFrontMemberPresenter().showMemberCreatedFailed(e.data);
  5867. });
  5868. GEvent.addEventListener(Events.ResourcesEvent.LOADING_IMPORT_WINDOW_SHOW, function(e){
  5869. _self.presenter.getConfirmDataResourcesPresenter().showLoadingImportWindow();
  5870. });
  5871. GEvent.addEventListener(Events.ResourcesEvent.LOADING_IMPORT_WINDOW_CLOSE, function(e){
  5872. _self.presenter.getConfirmDataResourcesPresenter().closeLoadingImportWindow();
  5873. });
  5874. GEvent.addEventListener(Events.MemberEvent.EDIT_MEMBER_ACCESS_RIGHTS, function(e){
  5875. _self.layerManager.editMember(e.data);
  5876. });
  5877. GEvent.addEventListener(Events.MemberEvent.UPDATE_MEMBER, function(e){
  5878. _self.layerManager.updateMember(e.data);
  5879. });
  5880. GEvent.addEventListener(Events.MemberEvent.MEMBER_GET_UPDATED, function(e){
  5881. _self.presenter.getFrontMemberPresenter().closeEditMemberWindow();
  5882. });
  5883. GEvent.addEventListener(Events.MemberEvent.MEMBER_GET_UPDATED_FAILED, function(e){
  5884. _self.presenter.getFrontMemberPresenter().showUpdatedError();
  5885. });
  5886. GEvent.addEventListener(Events.MemberEvent.GET_MEMBER_SUCCESS, function(e){
  5887. _self.presenter.getFrontMemberPresenter().showEditMemberWindow(e.data);
  5888. });
  5889. }