zengh
2022-05-16 63ad2c3598400370dd7da5534659fd7e768a0a4a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
define([
        "dojo/Evented",
        "dojo/on",
        "dojo/dom",
        "dojo/dom-attr",
        "dojo/dom-style",
        "dojo/_base/declare",
        "dojo/dom-construct",
        "dojo/dom-style",
        "dojo/_base/lang",
        "dojo/dom-class",
        "esri/domUtils",
        "esri/InfoWindowBase",
        "base/utils/GeometryUtil",
        "controls/infowindow/InfoTemplate",
        "esri/layers/FeatureLayer",
        "esri/tasks/query",
        "esri/tasks/QueryTask",
        "base/AppEvent",
    ],
    function(
        Evented,
        on,
        dom,
        domAttr,
        domStyle,
        declare,
        domConstruct,
        domStyle,
        lang,
        domClass,
        domUtils,
        InfoWindowBase,
        GeometryUtil,
        InfoTemplate,
        FeatureLayer,
        Query,
        QueryTask,
        AppEvent
    ) {
        return declare([InfoWindowBase, Evented], {
 
            isContentShowing: false,
            _location: null,
            _pointerDiv: null,
            _items: [],
            _nextButton: null,
            _preButton: null,
            _countSpan: null,
            titleField: "title",
            contentField: "content",
            _currentGraphic: null,
            _currentIndex: 0,
            _collectButton: null,
            width: null,
            height: 250,
            _point: null,
            infoTemplate: null,
            constructor: function(parameters) {
                var csspath = require.toUrl("controls/infowindow/InfoWindow.css");
                dojo.create("link", {
                        href: csspath,
                        type: 'text/css',
                        rel: 'stylesheet'
                    },
                    document.getElementsByTagName('head')[0]);
                lang.mixin(this, parameters);
 
                this.offsetX = 0;
                this.offsetX = 0;
 
                domClass.add(this.domNode, "custom-infoWindow");
                this._controlbar = domConstruct.create("div", {
                    "class": "custom-infoWindow-controlbar"
                }, this.domNode);
                this._title = domConstruct.create("span", {
                    "class": "custom-infoWindow-title"
                }, this._controlbar);
                this._closeButton = domConstruct.create("span", {
                    "class": "custom-infoWindow-closebutton",
                    "title": "关闭"
                }, this._controlbar);
                domConstruct.create("span", {
                    "class": "custom-infoWindow-split"
                }, this._controlbar);
                this._collectButton = domConstruct.create("span", {
                    "class": "custom-infoWindow-collectButton",
                    "title": "收藏"
                }, this._controlbar);
                this._content = domConstruct.create("div", {
                    "class": "custom-infoWindow-content"
                }, this.domNode);
                this._pointerDiv = domConstruct.create("div", {
                    "class": "custom-infoWindow-pointer"
                }, this.domNode);
                this._nextButton = domConstruct.create("span", {
                    "class": "custom-infoWindow-nextbutton",
                    "title": "下一条"
                }, this._controlbar);
                this._countSpan = domConstruct.create("span", {
                    "class": "custom-infoWindow-count",
                    "innerHTML": "1/20"
                }, this._controlbar);
                this._preButton = domConstruct.create("span", {
                    "class": "custom-infoWindow-prebutton",
                    "title": "上一条"
                }, this._controlbar);
                this._preButton = domConstruct.create("span", {
                    "class": "custom-infoWindow-fullposition",
                    "title": "全景"
                }, this._controlbar);
                this._preButton = domConstruct.create("span", {
                    "class": "custom-infoWindow-vedio",
                    "title": "视频"
                }, this._controlbar);
                this._preButton = domConstruct.create("span", {
                    "class": "custom-infoWindow-detailIntro",
                    "title": "详情"
                }, this._controlbar);
                this._preButton = domConstruct.create("audio", {
                    "class": "custom-infoWindow-audio",
                    "title": "音频"
                }, this._controlbar);
                on(this._closeButton, "click", lang.hitch(this, function() {
                    this.hide();
                }));
                on(this._collectButton, "click", lang.hitch(this, function(evt) {
                    var self = this;
                    try {
                        if(!value) {
                            showlogin();
                            return;
                        }
                        dojo.xhrPost({
                            url: getUrl() + 'collect/addCollectData.do',
                            postData: {
                                "collect.userinfo.id": value,
                                "nameCode": domAttr.get(evt.currentTarget, "code"),
                                "collect.type": "1"
                            },
                            handleAs: "json",
                            load: function(data) {
                                if(data.result == "取消收藏") {
                                    domStyle.set(self._collectButton, "background-image", "url('controls/infowindow/ico/uncollect.png')");
                                } else {
                                    domStyle.set(self._collectButton, "background-image", "url('controls/infowindow/ico/collect.png')");
                                }
                            },
                            error: function(e) {
                                alert('服务器繁忙!');
                            }
                        });
                    } catch(e) {}
                }));
                on(this._preButton, "click", lang.hitch(this, function() {
                    if(this._currentIndex > 0) {
                        this._currentIndex--;
                        this.showItem(this._items[this._currentIndex]);
                        this._countSpan.innerHTML = (this._currentIndex + 1) + "/" + this._items.length;
                    }
                }));
                on(this._nextButton, "click", lang.hitch(this, function() {
                    if(this._currentIndex < this._items.length - 1) {
                        this._currentIndex++;
                        this.showItem(this._items[this._currentIndex]);
                        this._countSpan.innerHTML = (this._currentIndex + 1) + "/" + this._items.length;
                    }
                }));
                domUtils.hide(this.domNode);
                this.isShowing = false;
                this.setItems([]);
                this.resize(this.width, this.height);
            },
            //窗体定位方法
            setMap: function(map) {
                this.inherited(arguments);
                if(!this.domNode.parentNode) {
                    domConstruct.place(this.domNode, dom.byId(map.id));
                }
                this.infoTemplate = new InfoTemplate();
                domConstruct.place(this.infoTemplate.domNode, this._content);
                this.infoTemplate.startup();
                map.on("pan-start", lang.hitch(this, function() {
                    //this.hide();
                }));
                map.on("zoom-start", lang.hitch(this, function() {
                    //this.hide();
                }));
                map.on("pan", lang.hitch(this, function(evt) {
                    if(this.isShowing) {
                        this._show(this._location, evt.delta.x, evt.delta.y);
                    }
                }));
                map.on("pan-end", lang.hitch(this, function() {
                    if(this.isShowing) {
                        this._show(this._location);
                    }
 
                }));
                map.on("zoom-end", lang.hitch(this, function() {
                    if(this.isShowing) {
                        this._show(this._location);
                    }
                }));
 
            },
            setTitle: function(title) {
                var thisWidth = domStyle.get(this.domNode, "width");
                domStyle.set(this._title, "maxWidth", (thisWidth - 40).toString() + "px");
                this.place(title, this._title);
 
            },
            setContent: function(content, width, height) {
                this.infoTemplate.reset();
                this.infoTemplate.setContent(content);
                if(width !== undefined && height !== undefined) {
                    this.resize(width, height);
                } else {
                    this.resize(width, height);
                }
            },
            setTitleAndContent: function(code, title, content, showTab, width, height) {
                if(code) {
                    domAttr.set(this._collectButton, "code", code);
                    domStyle.set(this._collectButton, "display", "");
                    try {
                        var self = this;
                        dojo.xhrPost({
                            url: getUrl() + 'collect/checkCollect.do',
                            postData: {
                                "id": code,
                                "model": "map",
                                "userid": value
                            },
                            handleAs: "json",
                            load: function(data) {
                                if(data.resultDesc == "未收藏") {
                                    domStyle.set(self._collectButton, "background-image", "url('controls/infowindow/ico/uncollect.png')");
                                } else {
                                    domStyle.set(self._collectButton, "background-image", "url('controls/infowindow/ico/collect.png')");
                                }
                            },
                            error: function(e) {
                                alert('服务器繁忙!');
                            }
                        });
                    } catch(e) {
                        alert("服务器繁忙!");
                    }
                } else {
                    domStyle.set(this._collectButton, "display", "none");
                }
                this.setContent(content, width, height);
                this.setTitle(title);
                if(showTab !== undefined) {
                    if(!showTab) {
                        this.infoTemplate.hideTab();
                    }
                }
            },
            setTab: function(type) {
                this.infoTemplate.switchTab(type);
            },
            setGraphic: function(graphic) {
                this.infoTemplate.setGraphic(graphic);
            },
            getGraphic: function(graphic) {
                return this.infoTemplate.getGraphic();
            },
            show: function(location, offsexX, offsetY) {
                if(offsexX)
                    this.offsetX = offsexX;
                else
                    this.offsetX = 0;
                if(offsetY)
                    this.offsetY = offsetY;
                else
                    this.offsetY = 0;
                this._show(location);
            },
            _show: function(location, dx, dy) {
                this._point = location;
                if(!location) {
                    return;
                }
                if(location.type && location.type != "point") {
                    location = GeometryUtil.getCenter(location);
                }
                this._location = location;
                if(location.spatialReference) {
                    location = this.map.toScreen(location);
                }
                var position = this._getPosition(location.x, location.y)
                if(dx) {
                    location.x = location.x + dx;
                }
                if(dy) {
                    location.y = location.y + dy
                }
                location.x += this.offsetX;
                location.y += this.offsetY;
                this._positionWindow(position, location)
                //display the info window
                domUtils.show(this.domNode);
                this.isShowing = true;
                this.onShow();
                this._position(this._point);
            },
            _position: function(point) {
                $(document).on("keyup", "#start,#end", function() {
                    var that = $(this);
                    var keyword = $(this).val();
                    type = $(this).attr("id");
                    if(keyword.length > 0) {
                        var featurelayer = new FeatureLayer("http://192.168.0.100:6080/arcgis/rest/services/TAIHE/taihelyjd/FeatureServer/0");
                        featurelayer.on("load", function(e) {
                            this.objName = "JDMC";
                        });
                        this.layerDatas = [];
                        var query = new Query();
                        query.returnGeometry = false;
                        query.outFields = ["JDMC", "OBJECTID"];
                        query.where = "JDMC like '%" + keyword + "%'";
                        featurelayer.queryFeatures(query, function(result) {
                            if(result.features.length > 0) {
                                var X = that.offset().left;
                                var Y = that.offset().top;
                                var inners = "";
                                for(var x in result.features) {
                                    inners += "<li id='" + result.features[x].attributes.OBJECTID + "'>" + result.features[x].attributes.JDMC + "</li>";
                                }
                                $('.showInfo ul').html(inners);
                                $('.showInfo').show();
                            }
                        });
                    }
 
                });
 
                $(document).click(function() {
                    $('.showInfo ul').html('');
                    $('.showInfo').hide();
                });
 
                $(document).unbind('click').on("click", ".showInfo ul li", function(event) {
                    var type;
                    if($(".infoInputDiv2").css("display") == "block") {
                        type = "start"
                    } else if($(".infoInputDiv1").css("display") == "block") {
                        type = "end";
                    } else if($(".infoInputDiv3").css("display") == "block") {
                        type = "nearby";
                    }
                    $("#start").val("");
                    $("#end").val("");
                    $("#nearby").val("");
                    $('.infoDivInputText').val($(this).text());
                    $(".showInfo").hide();
                    AppEvent.dispatchAppEvent(_AppEvent.RUN_WIDGET, "routeWidget");
                    AppEvent.dispatchAppEvent("changeWidgets", {
                        id: "routeWidget"
                    });
                    
                    if(point != null) {
                        AppEvent.dispatchAppEvent("infoWindow", {
                            "id": $(this).attr("id"),
                            "type": type,
                            "text": $(this).text(),
                            "position": point
                        });
                    }
                    event.stopPropagation();
                });
                var _keyword = "";
                $('.selectKey').unbind();
                $('.selectKey').click(function() {
                    $(".selectKey").css("background", "#fff");
                    $(".selectKey").css("color", "#14a1ff");
                    _keyword = $(this).text();
                    $(this).css("background", "#14a1ff");
                    $(this).css("color", "#fff");
                    $('#infoBtnSh').trigger("click");
                });
                //弹出窗口的点击事件
                $(document).on("click", ".threeDiv div", function() {
                    var num = parseInt($(this).attr("class").substr(-1, 1));
                    for(var i = 1; i <= 3; i++) {
                        $(".threeDiv" + i).css("border-top-color", "#ccc");
                        $(".threeDiv" + i).css("color", "#5d5d5d");
                        $(".infoInputDiv" + i).css("display", "none");
                    }
                    $(".threeDiv" + num).css("border-top-color", "#15A1FF");
                    $(".threeDiv" + num).css("color", "#15A1FF");
                    $(".infoInputDiv" + num).css("display", "block");
                });
                //周边搜索点击事件
                $('#infoBtnSh').unbind();
                $('#infoBtnSh').click(function() {
                    $(".showInfo").hide();
                    AppEvent.dispatchAppEvent("changeWidgets", {
                        id: "searchScenceWidget"
                    });
                    var inputword = $("#nearby").val();
                    var spanword = _keyword;
                    AppEvent.dispatchAppEvent("nearby", {
                        "inputword": inputword,
                        "spanword": spanword,
                        "point": point
                    });
                });
            },
            hide: function() {
                domUtils.hide(this.domNode);
                this.isShowing = false;
                this.onHide();
            },
            resize: function(width, height) {
                this.width = width;
                //                this.height = height;
                if(!this.domNode) {
                    return;
                }
                domStyle.set(this._content, {
                    "width": width + "px"
                });
                domStyle.set(this._controlbar, {
                    "width": width + "px"
                });
                domStyle.set(this.domNode, {
                    "width": width + "px"
                    //                    "height": (height + 30).toString() + "px"
                });
                if(this.isShowing) {
                    this._show(this._location);
                }
 
            },
            destroy: function() {
                domConstruct.destroy(this.domNode);
                this._closeButton = this._title = this._content = null;
            },
 
            _positionWindow: function(arg, location) {
                var thisWidth = domStyle.get(this.domNode, "width");
                var thisHeight = domStyle.get(this.domNode, "height");
                domClass.remove(this._pointerDiv);
                domClass.add(this._pointerDiv, "custom-infoWindow-pointer");
                switch(arg) {
                    case "topLeft":
                        domStyle.set(this.domNode, {
                            "left": (location.x - 12) + "px",
                            "top": location.y + 10 + "px"
                        });
                        domClass.add(this._pointerDiv, "pointer-top");
                        domStyle.set(this._pointerDiv, {
                            "left": "3px",
                            "top": "-9px"
                        });
                        break;
                    case "topRight":
                        domStyle.set(this.domNode, {
                            "left": (location.x - thisWidth + 11) + "px",
                            "top": location.y + 10 + "px"
                        });
                        domClass.add(this._pointerDiv, "pointer-top");
                        domStyle.set(this._pointerDiv, {
                            "left": (thisWidth - 19) + "px",
                            "top": "-9px"
                        });
                        break;
                    case "top":
                        domStyle.set(this.domNode, {
                            "left": (location.x - thisWidth / 2) + "px",
                            "top": location.y + 10 + "px"
                        });
                        domClass.add(this._pointerDiv, "pointer-top");
                        domStyle.set(this._pointerDiv, {
                            "left": (thisWidth / 2 - 8) + "px",
                            "top": "-9px"
                        });
                        break;
                    case "left":
                        domStyle.set(this.domNode, {
                            "left": location.x + 12 + "px",
                            "top": (location.y - thisHeight / 2 - 15) + "px"
                        });
                        domClass.add(this._pointerDiv, "pointer-left");
                        domStyle.set(this._pointerDiv, {
                            "left": "-10px",
                            "top": (thisHeight / 2 + 5) + "px"
                        });
                        break;
                    case "right":
                        domStyle.set(this.domNode, {
                            "left": (location.x - (thisWidth + 12)) + "px",
                            "top": (location.y - thisHeight / 2 - 15) + "px"
                        });
                        domClass.add(this._pointerDiv, "pointer-right");
                        domStyle.set(this._pointerDiv, {
                            "left": (thisWidth - 8) + "px",
                            "top": (thisHeight / 2 + 5) + "px"
                        });
                        break;
                    case "bottomLeft":
                        domStyle.set(this.domNode, {
                            "left": (location.x - 12) + "px",
                            "top": (location.y - thisHeight - 12) + "px"
                        });
                        domClass.add(this._pointerDiv, "pointer-bottom");
                        domStyle.set(this._pointerDiv, {
                            "left": "3px",
                            "top": (thisHeight - 8) + "px"
                        });
                        break;
                    case "bottomRight":
                        domStyle.set(this.domNode, {
                            "left": (location.x - thisWidth + 11) + "px",
                            "top": (location.y - thisHeight - 12) + "px"
                        });
                        domClass.add(this._pointerDiv, "pointer-bottom");
                        domStyle.set(this._pointerDiv, {
                            "left": (thisWidth - 20) + "px",
                            "top": (thisHeight - 8) + "px"
                        });
                        break;
                        //                case "bottom":
                        //                    break;
                    default:
                        //默认pointer显示在下面
                        domStyle.set(this.domNode, {
                            "left": (location.x - thisWidth / 2) + "px",
                            "top": (location.y - thisHeight - 12) + "px"
                        });
                        domClass.add(this._pointerDiv, "pointer-bottom");
                        domStyle.set(this._pointerDiv, {
                            "left": (thisWidth / 2 - 10) + "px",
                            "top": (thisHeight - 8) + "px"
                        });
                        break;
                }
            },
 
            /**
             * 计算pointer处于的方位,左上、上、右上、左、默认、右、左下、下、右下
             * @param x 
             * @param y
             */
            _getPosition: function(x, y) {
 
                var widthPer = this.map.width / 4
                var heightPer = this.map.height / 4
                if(y < heightPer) {
                    if(x < widthPer) {
                        return "topLeft";
                    } else if(x > widthPer * 3) {
                        return "topRight";
                    } else {
                        return "top";
                    }
                }
                if(y >= heightPer && y < heightPer * 3) {
                    if(x < widthPer) {
                        return "left";
                    } else if(x > widthPer * 3) {
                        return "right";
                    } else {
                        return "default";
                    }
                }
                if(y > heightPer * 3) {
                    if(x < widthPer) {
                        return "bottomLeft";
                    } else if(x > widthPer * 3) {
                        return "bottomRight";
                    } else {
                        return "bottom";
                    }
                } else {
                    return "default";
                }
            },
            setItems: function(items) {
                this._items = items;
                if(!this.domNode)
                    return;
                var thisWidth = domStyle.get(this.domNode, "width");
                if(!items || items.length <= 1) {
                    //domStyle.set(this._content,"bottom","20px");
                    //domStyle.set(this._pageDiv,"display","none");
                    domStyle.set(this._title, "maxWidth", (thisWidth - 40).toString() + "px");
                    domStyle.set(this._nextButton, "display", "none");
                    domStyle.set(this._countSpan, "display", "none");
                    domStyle.set(this._preButton, "display", "none");
                    _currentIndex = 0;
                } else {
                    //有多个graphics
                    domStyle.set(this._title, "maxWidth", (thisWidth - 135).toString() + "px");
                    this.showItem(items[0]);
                    domStyle.set(this._nextButton, "display", "inline-block");
                    domStyle.set(this._countSpan, "display", "inline-block");
                    domStyle.set(this._preButton, "display", "inline-block");
                    this._countSpan.innerHTML = "1/" + this._items.length;
                    _currentIndex = 0;
                    return;
                }
                if(items.length == 1) {
                    //如果只有一个graphic
                    this.showItem(items[_currentIndex]);
                }
            },
            showItem: function(item) {
                if(item) {
                    if(item[this.titleField]) {
                        this._title.innerHTML = item[this.titleField];
                    } else {
                        this._title.innerHTML = "无标题";
                    }
                    if(item[this.contentField]) {
                        this.setContent(item[this.contentField]);
                    } else {
                        this.setContent("");
                    }
                }
                this._location = item.geometry;
                if(this.isShowing) {
                    this._show(this._location);
                }
                //            var maxWidth = domStyle.get(this._title,"maxWidth");
                //            if(maxWidth<this._title.offsetWidth)
                //            {
                //                this._title.title = graphic.attributes[this.titleField];
                //            }
                //            else
                //            {
                //                this._title.title = "";
                //            }
            }
 
        });
 
    });