AddressExplorer.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  1. MWF.xDesktop.requireApp("CRM", "Explorer", null, false);
  2. MWF.xDesktop.requireApp("Template", "Explorer", null, false);
  3. MWF.xApplication.CRM.AddressExplorer = new Class({
  4. Extends: MWF.xApplication.CRM.Explorer,
  5. Implements: [Options, Events],
  6. initialize: function(node, app, actions, options){
  7. this.setOptions(options);
  8. this.app = app;
  9. this.path = "../x_component_CRM/$AddressExplorer/";
  10. this.cssPath = "../x_component_CRM/$AddressExplorer/"+this.options.style+"/css.wcss";
  11. this._loadCss();
  12. this.actions = actions;
  13. this.node = $(node);
  14. this.initData();
  15. },
  16. reload: function(){
  17. this.node.empty();
  18. this.load();
  19. },
  20. load: function(){
  21. this.loadToolbar();
  22. this.loadContentNode();
  23. this.loadContent();
  24. this.setNodeScroll();
  25. },
  26. destroy: function(){
  27. if( this.baiduMap ){
  28. this.baiduMap.map.clearOverlays();
  29. this.elementContentNode.destroy();
  30. }
  31. this.node.empty();
  32. delete this;
  33. },
  34. loadContent : function( filterData ){
  35. this.elementContentNode.empty();
  36. /*this.view = new MWF.xApplication.CRM.AddressExplorer.View(this.elementContentNode, this.app,this, this.viewData, this.options.searchKey );
  37. this.view.filterData = filterData;
  38. this.view.load();*/
  39. /*this.actions.listWorkplace( function(json){
  40. json.data = json.data || [];
  41. this.wpContent = this.toolbarNode.getElements("[name=wpContent]")[0];
  42. this.createList( json.data );
  43. this.baiduMap = new MWF.xApplication.CRM.AddressExplorer.BaiduMap( this.elementContentNode, this.app, this, {} );
  44. this.baiduMap.load( json.data );
  45. this.setContentSize();
  46. }.bind(this));*/
  47. var jdata = [];
  48. //this.wpContent = this.toolbarNode.getElements("[name=wpContent]")[0];
  49. //this.createList( jdata );
  50. this.baiduMap = new MWF.xApplication.CRM.AddressExplorer.BaiduMap( this.elementContentNode, this.app, this, {} );
  51. this.baiduMap.load( jdata );
  52. this.setContentSize();
  53. },
  54. reloadList: function(){
  55. this.actions.listWorkplace( function(json){
  56. this.wpContent.empty();
  57. this.createList( json.data || [] );
  58. }.bind(this))
  59. },
  60. createList: function( data ){
  61. this.wdList = new Element("div", {
  62. styles : this.css.wdList
  63. }).inject( this.wpContent );
  64. this.wdList.setStyle( "width" , this.toolbarNode.getSize().x - 200 + "px" );
  65. data.each( function( d ){
  66. var placeItem = new Element( "div", {
  67. styles : this.css.toolbarContentItem,
  68. text : d.placeName
  69. }).inject( this.wdList );
  70. placeItem.addEvent( "click" , function(e){
  71. this.obj.baiduMap.gotoMarker( this.data );
  72. e.stopPropagation();
  73. }.bind({ obj : this, data : d }) )
  74. }.bind(this) );
  75. this.arrow = "up";
  76. if( this.wdList.getScrollSize().y > this.wpContent.getSize().y ){
  77. this.wdList.addEvent("click",function(e){
  78. if( this.arrow != "down" ){
  79. this.openList( e );
  80. }else{
  81. this.closeList( e )
  82. }
  83. }.bind(this));
  84. this.arrowNode = new Element("div.arrowNode",{
  85. "styles" : this.css.arrowNode
  86. }).inject( this.wpContent, "top" );
  87. this.arrowNode.addEvents({
  88. "mouseover" : function(){
  89. this.arrowNode.setStyles( this.categoryArrow != "down" ? this.css.arrowNode_over : this.css.arrowNode_down_over);
  90. }.bind(this),
  91. "mouseout" : function(){
  92. this.arrowNode.setStyles( this.categoryArrow != "down" ? this.css.arrowNode : this.css.arrowNode_down);
  93. }.bind(this),
  94. "click" : function( e ){
  95. if( this.arrow != "down" ){
  96. this.openList( e );
  97. }else{
  98. this.closeList( e )
  99. }
  100. }.bind(this)
  101. });
  102. }
  103. },
  104. _setContentSize: function(){
  105. //this.wdList.setStyle( "width" , this.toolbarNode.getSize().x - 200 + "px" );
  106. },
  107. openList : function( e ){
  108. this.arrow = "down";
  109. //this.arrowNode.setStyles(this.css.arrowNode_down_over );
  110. this.arrowNode.setStyle("display","none");
  111. this.wdList.setStyles(this.css.wdList_all);
  112. window.closeList = this.closeList.bind(this);
  113. this.app.content.addEvent("click", window.closeList );
  114. e.stopPropagation();
  115. },
  116. closeList : function( e ){
  117. this.arrow = "up";
  118. //this.arrowNode.setStyles(this.css.arrowNode );
  119. this.arrowNode.setStyle("display","");
  120. this.wdList.setStyles(this.css.wdList);
  121. this.app.content.removeEvent("click" , window.closeList );
  122. e.stopPropagation();
  123. },
  124. createDocument: function(){
  125. this.baiduMap.createMarker();
  126. }
  127. });
  128. MWF.xApplication.CRM.AddressExplorer.BaiduMap = new Class({
  129. Implements: [Options, Events],
  130. options: {
  131. "style": "default"
  132. },
  133. initialize: function (container, app, explorer, options) {
  134. this.container = container;
  135. this.explorer = explorer;
  136. this.app = app;
  137. this.actions = explorer.actions;
  138. this.setOptions(options);
  139. this.markers = {};
  140. this.markerInfoWindows = {};
  141. },
  142. load : function( markerData ){
  143. this.markerData = markerData;
  144. this.mapNode = new Element("div", {styles : {
  145. width : "100%",
  146. height : "99%"
  147. }}).inject(this.container);
  148. setTimeout( function(){
  149. this.loadResource( );
  150. }.bind(this) , 200 )
  151. },
  152. loadResource: function (callback) {
  153. window.BMap_loadScriptTime = (new Date).getTime();
  154. //var apiPath = "http://api.map.baidu.com/api?v=2.0&ak=Qac4WmBvHXiC87z3HjtRrbotCE3sC9Zg";
  155. var apiPath = "http://api.map.baidu.com/getscript?v=2.0&ak=Qac4WmBvHXiC87z3HjtRrbotCE3sC9Zg&services=&t=20161219171637";
  156. if( !window.BDMapApiLoaded ){
  157. COMMON.AjaxModule.loadDom(apiPath, function () {
  158. window.BDMapApiLoaded = true;
  159. if( !window.BDMarkerToolLoaded ){
  160. COMMON.AjaxModule.load( "../x_component_CRM/BDMarkerTool.js", function(){
  161. window.BDMarkerToolLoaded = true;
  162. this._loadMap();
  163. if (callback)callback();
  164. }.bind(this) );
  165. }else{
  166. this._loadMap();
  167. if (callback)callback();
  168. }
  169. }.bind(this));
  170. }else{
  171. this._loadMap();
  172. if (callback)callback();
  173. }
  174. },
  175. _loadMap: function(){
  176. if (navigator.geolocation){
  177. try{
  178. navigator.geolocation.getCurrentPosition(this.loadMap.bind(this), this.loadMap.bind(this));
  179. }catch( e ){
  180. this.loadMap();
  181. }
  182. }else{
  183. this.loadMap();
  184. }
  185. },
  186. loadMap: function(position){
  187. this.createMap( position );
  188. this.addMapControl();
  189. if( this.markerData ){
  190. this.addMarkerArray( this.markerData );
  191. }
  192. },
  193. createMap: function( position ){
  194. var point = null;
  195. if (position && position.coords){
  196. point = new BMap.Point(position.coords.longitude, position.coords.latitude);
  197. }
  198. if( !point ){
  199. debugger
  200. if( this.markerData && this.markerData.length > 0){
  201. var json = this.markerData[0];
  202. point = new BMap.Point(json.longitude, json.latitude);
  203. }else{
  204. //point = new BMap.Point(116.404, 39.915);
  205. point = new BMap.Point(120.122, 30.298);//默认城市的坐标
  206. }
  207. }
  208. var map = this.map = new BMap.Map(this.mapNode); // 创建Map实例
  209. map.centerAndZoom(point, 12); // 初始化地图,设置中心点坐标和地图级别
  210. // map.centerAndZoom(new BMap.Point(116.404, 39.915), 11); // 初始化地图,设置中心点坐标和地图级别
  211. // map.setCurrentCity("杭州市"); // 设置地图显示的城市 此项是必须设置的
  212. map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
  213. },
  214. addMapControl: function(){
  215. //向地图中添加缩放控件
  216. var ctrl_nav = new BMap.NavigationControl({anchor:BMAP_ANCHOR_TOP_RIGHT,type:BMAP_NAVIGATION_CONTROL_LARGE});
  217. this.map.addControl(ctrl_nav);
  218. //向地图中添加缩略图控件
  219. var ctrl_ove = new BMap.OverviewMapControl({anchor:BMAP_ANCHOR_BOTTOM_RIGHT,isOpen:1});
  220. this.map.addControl(ctrl_ove);
  221. //向地图中添加比例尺控件
  222. var ctrl_sca = new BMap.ScaleControl({anchor:BMAP_ANCHOR_BOTTOM_LEFT});
  223. this.map.addControl(ctrl_sca);
  224. //map.addControl(new this.mapWindow.BMap.MapTypeControl()); //添加地图类型控件
  225. this.addCityListControl();
  226. },
  227. addCityListControl : function(){
  228. this.map.addControl(new BMap.CityListControl({
  229. anchor: BMAP_ANCHOR_TOP_LEFT,
  230. offset: new BMap.Size(10, 20),
  231. // 切换城市之间事件
  232. onChangeBefore: function( ){
  233. },
  234. // 切换城市之后事件
  235. onChangeAfter:function( ){
  236. }
  237. }));
  238. },
  239. getInfoWindowHtml: function( json ){
  240. json = json || {};
  241. //拼接infowindow内容字串
  242. var html = [];
  243. html.push('<br/>');
  244. html.push('<table border="0" cellpadding="1" cellspacing="1" id="markerTable" docId="'+ (json.id || "") +'" style="font-size:12px;">');
  245. html.push(' <tr>');
  246. html.push(' <td style="width:50px" align="left" class="common">名称:</td>');
  247. html.push(' <td style="width: 300px"><input type="text" size="40" value="'+(json.placeName || "") +'" id="placeName" ></td>');
  248. html.push(' <td style="width: 10px" valign="top"><span style="color:#ff0000">*</span></td>');
  249. html.push(' </tr>');
  250. html.push(' <tr>');
  251. html.push(' <td align="left" class="common">别名:</td>');
  252. html.push(' <td><input type="text" maxlength="300px" size="40" value="'+(json.placeAlias || "") +'" id="placeAlias" ></td>');
  253. html.push(' <td valign="top"></td>');
  254. html.push(' </tr>');
  255. html.push(' <tr>');
  256. html.push(' <td align="left" class="common">范围:</td>');
  257. html.push(' <td><input type="text" maxlength="300px" size="40" value="'+(json.errorRange || "") +'" id="errorRange" ></td>');
  258. html.push(' <td valign="top">米</td>');
  259. html.push(' </tr>');
  260. html.push(' <tr>');
  261. html.push(' <td align="left" class="common">备注:</td>');
  262. html.push(' <td><textarea rows="4" cols="31" id="description">'+ (json.description || "") +'</textarea></td>');
  263. html.push(' <td valign="top"></td>');
  264. html.push(' </tr>');
  265. html.push(' <tr>');
  266. html.push(' <td align="center" colspan="3">');
  267. html.push(' <input type="button" name="btnOK" id="submitPlace" value="保存">&nbsp;&nbsp;');
  268. if( json.id ){
  269. html.push(' <input type="button" name="btnMove" id="enableMovePlace" value="允许移动">&nbsp;&nbsp;');
  270. }
  271. html.push(' <input type="button" name="btnClear" id="cancelPlace" value="删除">');
  272. html.push(' </td>');
  273. html.push(' </tr>');
  274. html.push('</table>');
  275. return html.join("");
  276. },
  277. createMarker: function(){
  278. var _self = this;
  279. var mkrTool = new BMapLib.MarkerTool(this.map, {autoClose: true});
  280. mkrTool.addEventListener("markend", function(evt){
  281. var pt = evt.marker.point;
  282. var gc = new BMap.Geocoder();
  283. //var addrsssObj = _self.app.rightContentDiv.getElementById("detailaddress");
  284. gc.getLocation(pt, function (rs) {
  285. var addComp = rs.addressComponents;
  286. var province = (addComp.province).replace("省","").replace("市","").replace("自治区","").replace("回族","").replace("壮族","").replace("维吾尔","")
  287. var city = addComp.city;
  288. var area = addComp.district;
  289. jQuery("#detailaddress").val(rs.address);
  290. jQuery("#detailaddress").attr("location",province+","+city+","+area);
  291. jQuery("#detailaddress").attr("lng",rs.point.lng);
  292. jQuery("#detailaddress").attr("lat",rs.point.lat);
  293. jQuery("#detailaddress").attr("province",province);
  294. jQuery("#detailaddress").attr("city",city);
  295. });
  296. var mkr = evt.marker;
  297. mkr.addEventListener("dragend",function(){
  298. var pt = mkr.point;
  299. var gc = new BMap.Geocoder();
  300. gc.getLocation(pt, function (ts) {
  301. var addComp = ts.addressComponents;
  302. var province = (addComp.province).replace("省","").replace("市","").replace("自治区","").replace("回族","").replace("壮族","").replace("维吾尔","");
  303. var city = addComp.city;
  304. var area = addComp.district;
  305. debugger
  306. jQuery("#detailaddress").val(ts.address);
  307. jQuery("#detailaddress").attr("location",province+","+city+","+area);
  308. jQuery("#detailaddress").attr("lng",ts.point.lng);
  309. jQuery("#detailaddress").attr("lat",ts.point.lat);
  310. jQuery("#detailaddress").attr("province",province);
  311. jQuery("#detailaddress").attr("city",city);
  312. });
  313. });
  314. /*var infoWin = new BMap.InfoWindow(this.getInfoWindowHtml(), {offset: new BMap.Size(0, -10)});
  315. infoWin.addEventListener("open",function(){
  316. var table = document.id("markerTable");
  317. var submitPlace = table.getElements("[id='submitPlace']");
  318. submitPlace.addEvent("click", function(){
  319. this.obj.ok( this.mkr , this.table );
  320. }.bind({ obj : this, mkr : mkr, table : table }));
  321. var cancelPlace = table.getElements("[id='cancelPlace']");
  322. cancelPlace.addEvent("click", function(){
  323. this.obj.cancel( this.mkr, this.table );
  324. }.bind({ obj : this, mkr : mkr, table : table }));
  325. }.bind( _self ));
  326. var mkr = evt.marker;
  327. mkr.addEventListener("click",function(){
  328. this.openInfoWindow(infoWin);
  329. });
  330. mkr.addEventListener("dragend",function(){
  331. this.openInfoWindow(infoWin);
  332. });
  333. mkr.openInfoWindow(infoWin);
  334. */
  335. }.bind(this));
  336. mkrTool.open(); //打开工具
  337. var icon = BMapLib.MarkerTool.SYS_ICONS[14]; //设置工具样式,使用系统提供的样式BMapLib.MarkerTool.SYS_ICONS[0] -- BMapLib.MarkerTool.SYS_ICONS[23]
  338. mkrTool.setIcon(icon);
  339. },
  340. //创建marker
  341. addMarkerArray : function ( markerArr ){
  342. for(var i=0;i<markerArr.length;i++){
  343. var json = markerArr[i];
  344. this.addMarker( json );
  345. }
  346. },
  347. addMarker : function( json ){
  348. var _self = this;
  349. var point = new BMap.Point(json.longitude, json.latitude);
  350. var iconImg = BMapLib.MarkerTool.SYS_ICONS[8];
  351. var marker = new BMap.Marker(point,{
  352. icon:iconImg,
  353. enableDragging : false
  354. });
  355. var label = new BMap.Label(json.placeName,{"offset":new BMap.Size(0,-20)});
  356. marker.setLabel(label);
  357. this.map.addOverlay(marker);
  358. label.setStyle({
  359. borderColor:"#808080",
  360. color:"#333",
  361. cursor:"pointer"
  362. });
  363. (function(){
  364. var _iw = new BMap.InfoWindow(this.getInfoWindowHtml( json ), {offset: new BMap.Size(0, -10)});
  365. var _marker = marker;
  366. var _json = json;
  367. _marker.addEventListener("click",function(){
  368. this.openInfoWindow(_iw);
  369. });
  370. _marker.addEventListener("dragend",function(){
  371. this.openInfoWindow(_iw);
  372. });
  373. _iw.addEventListener("open",function(){
  374. _marker.getLabel().hide();
  375. var table = document.id("markerTable");
  376. var enableMovePlace = table.getElements("[id='enableMovePlace']");
  377. enableMovePlace.addEvent("click", function(){
  378. this.obj.enableMove( this.mkr );
  379. }.bind({ obj : this, mkr : _marker, table : table, id : _json.id }));
  380. var submitPlace = table.getElements("[id='submitPlace']");
  381. submitPlace.addEvent("click", function(){
  382. this.obj.ok( this.mkr , this.table, this.id );
  383. }.bind({ obj : this, mkr : _marker, table : table, id : _json.id }));
  384. var cancelPlace = table.getElements("[id='cancelPlace']");
  385. cancelPlace.addEvent("click", function(){
  386. this.obj.cancel( this.mkr, this.table, this.id );
  387. }.bind({ obj : this, mkr : _marker, table : table, id : _json.id }))
  388. }.bind( _self ));
  389. _iw.addEventListener("close",function(){
  390. _marker.getLabel().show();
  391. });
  392. label.addEventListener("click",function(){
  393. _marker.openInfoWindow(_iw);
  394. });
  395. this.markers[ json.id ] = marker;
  396. this.markerInfoWindows[ json.id ] = _iw;
  397. }.bind(this))();
  398. },
  399. enableMove: function( mrk ){
  400. mrk.closeInfoWindow();
  401. mrk.enableDragging();
  402. },
  403. gotoMarker : function( json ){
  404. var marker = this.markers[ json.id ];
  405. this.map.centerAndZoom(marker.point, 15);
  406. marker.openInfoWindow( this.markerInfoWindows[ json.id ] );
  407. },
  408. ok: function( mkr, table, id ){
  409. //var id = table.get("docId");
  410. var placeName = table.getElements("[id='placeName']")[0].get("value");
  411. if( placeName.trim() == "" ){
  412. this.app.notice( "工作场所不能为空", "error" );
  413. return false;
  414. }
  415. var placeAlias = table.getElements("[id='placeAlias']")[0].get("value");
  416. var description = table.getElements("[id='description']")[0].get("value");
  417. var errorRange = table.getElements("[id='errorRange']")[0].get("value");
  418. var data = {
  419. placeName : placeName,
  420. placeAlias : placeAlias,
  421. errorRange : errorRange,
  422. description : description,
  423. longitude : mkr.point.lng,
  424. latitude : mkr.point.lat
  425. };
  426. if(id)data.id = id;
  427. this.actions.saveWorkplace( data, function( json ){
  428. data.id = json.data.message;
  429. mkr.closeInfoWindow();
  430. mkr.remove();
  431. this.addMarker( data );
  432. this.explorer.reloadList();
  433. }.bind(this) )
  434. },
  435. cancel: function( mkr, table, id ){
  436. if( id ){
  437. this.actions.deleteWorkplace( id, function(){
  438. mkr.closeInfoWindow();
  439. var label = mkr.getLabel();
  440. if( label )label.remove();
  441. mkr.remove();
  442. this.explorer.reloadList();
  443. }.bind(this) )
  444. }else{
  445. mkr.closeInfoWindow();
  446. var label = mkr.getLabel();
  447. if( label )label.remove();
  448. mkr.remove();
  449. }
  450. }
  451. });