source: subversion/applications/editors/potlatch/poi.as @ 34598

Last change on this file since 34598 was 18749, checked in by richard, 10 years ago

Potlatch 1.3

File size: 8.9 KB
RevLine 
[11420]1
[6739]2        // =====================================================================================
3        // OOP classes - POI
4       
5        // ---- Initialise
6       
7        function POI() {
[11859]8                this.attr=new Object();
[6739]9                this.clean=true;
10                this.uploading=false;
11                this.locked=false;
[16416]12                this.icon='poi';
[11859]13                this.version=0;
[16700]14                this._xscale=this._yscale=_root.poiscale;
[6739]15        };
16        POI.prototype=new MovieClip();
17        POI.prototype.remove=function() {
[14695]18                memberDeleted('Node', this._name);
[13903]19                uploadDirtyRelations();
[15136]20                if (this._name>=0 && !this.locked) {
21                        if (_root.sandbox) {
22                                _root.poistodelete[this._name]=[this.version,coord2long(this._x),coord2lat(this._y),deepCopy(this.attr)];
[16388]23                                markClean(false);
[15136]24                        } else {
[18431]25                                if (renewChangeset()) { return; }
[15136]26                                poidelresponder = function() { };
27                                poidelresponder.onResult = function(result) { deletepoiRespond(result); };
28                                _root.writesrequested++;
29                                remote_write.call('putpoi',poidelresponder,_root.usertoken,_root.changeset,Number(this.version),Number(this._name),coord2long(this._x),coord2lat(this._y),this.attr,0);
30                        }
31                }
[16416]32                if (this._name<0 || _root.sandbox) {
[6739]33                        if (this._name==poiselected) { deselectAll(); }
34                        removeMovieClip(this);
35                }
36        };
[15136]37        function deletepoiRespond(result) {
38                _root.writesrequested--;
39                var code=result.shift(); var msg=result.shift(); if (code) { handleError(code,msg,result); return; }
40                if (poiselected==result[0]) { deselectAll(); }
41                delete _root.nodes[result[0]];
42                removeMovieClip(_root.map.pois[result[0]]);
43                operationDone(result[0]);
[18431]44                freshenChangeset();
[15136]45        }
[9416]46        POI.prototype.reload=function(timestamp) {
[6739]47                poirelresponder=function() {};
48                poirelresponder.onResult=function(result) {
[15136]49                        var code=result.shift(); var msg=result.shift(); if (code) { handleError(code,msg,result); return; }
[8894]50                        _root.map.pois[result[0]]._x  =long2coord(result[1]);
51                        _root.map.pois[result[0]]._y  =lat2coord (result[2]);
[7118]52                        _root.map.pois[result[0]].attr=result[3];
[11859]53                        _root.map.pois[result[0]].version=result[4];
[9416]54                        _root.map.pois[result[0]].select();
[6739]55                };
[13889]56                if (!timestamp) { timestamp=''; }
[11151]57                remote_read.call('getpoi',poirelresponder,Math.floor(this._name),timestamp);
[6739]58        };
59        POI.prototype.upload=function() {
60                poiresponder=function() { };
61                poiresponder.onResult=function(result) {
[15136]62                        _root.writesrequested--;
63                        var code=result.shift(); var msg=result.shift(); if (code) { handleError(code,msg,result); return; }
[11859]64                        var ni=result[1];       // new POI ID
[6739]65                        if (result[0]!=ni) {
66                                _root.map.pois[result[0]]._name=ni;
[14765]67                                noderels[ni]=noderels[result[0]]; delete noderels[result[0]];
[14695]68                                renumberMemberOfRelation('Node', result[0], ni);
[6739]69                                if (poiselected==result[0]) {
70                                        poiselected=ni;
71                                        if (_root.panel.t_details.text==result[0]) { _root.panel.t_details.text=ni; _root.panel.t_details.setTextFormat(plainText); }
72                                }
73                        }
[16525]74                        _root.map.pois[ni].clean=true;
[6739]75                        _root.map.pois[ni].uploading=false;
[11859]76                        _root.map.pois[ni].version=result[2];
[15136]77                        operationDone(result[0]);
[18431]78                        freshenChangeset();
[6739]79                };
[15136]80                if (!this.uploading && !this.locked && (!_root.sandbox || _root.uploading)) {
[18431]81                        if (renewChangeset()) { return; }
[11420]82                        _root.writesrequested++;
[16525]83                        this.uploading=true;
[13889]84                        remote_write.call('putpoi',poiresponder,_root.usertoken,_root.changeset,Number(this.version),Number(this._name),coord2long(this._x),coord2lat(this._y),this.attr,1);
[17422]85                } else { 
86                        operationDone(this._name);      // next please!
[6739]87                }
88        };
89        POI.prototype.onRollOver=function() {
90                setPointer('');
[14904]91                var a=getName(this.attr,nodenames); if (a) { setFloater(a); }
[6739]92        };
[14904]93        POI.prototype.onRollOut=function() { clearFloater(); };
[6739]94        POI.prototype.onPress=function() {
[8894]95                removeWelcome(true);
[6739]96                if (_root.drawpoint>-1) {
97                        // add POI to way
[18749]98                        if (Key.isToggled(Key.CAPSLOCK)) { mapClickEnd(); return; }
[12386]99                        _root.nodes[this._name]=new Node(this._name,this._x,this._y,this.attr,this.version);
[11040]100                        addEndPoint(_root.nodes[this._name]);
[6739]101                        _root.junction=true; restartElastic();
102                        removeMovieClip(this);
103                } else {
104                        // click POI
105                        if (_root.wayselected || _root.poiselected!=this._name) {
106                                stopDrawing(); uploadSelected(); deselectAll(); 
107                        }
108                        this.select();
109                        _root.clicktime=new Date();
110                        this.beginDrag();
111                }
112        };
113        POI.prototype.beginDrag=function() {
[16416]114                clearFloater();
[6739]115                this.onMouseMove=function() { this.trackDrag(); };
116                this.onMouseUp  =function() { this.endDrag();   };
117                _root.firstxmouse=_root.map._xmouse;
118                _root.firstymouse=_root.map._ymouse;
[7658]119                this.originalx=this._x;         // saved for undo
120                this.originaly=this._y;         //  |
[6739]121        };
122        POI.prototype.trackDrag=function() {
123                this._x=_root.map._xmouse;
124                this._y=_root.map._ymouse;
125        };
126        POI.prototype.endDrag=function() {
[10776]127                delete this.onMouseMove;
128                delete this.onMouseUp;
[6739]129                var t=new Date();
130                var xdist=Math.abs(_root.map._xmouse-_root.firstxmouse);
131                var ydist=Math.abs(_root.map._ymouse-_root.firstymouse);
132                var longclick=(t.getTime()-_root.clicktime)>300;
133
134                if ((xdist>=tolerance   || ydist>=tolerance  ) ||
135                   ((xdist>=tolerance/2 || ydist>=tolerance/2) && longclick)) {
136                        this.clean=false;
137                        this.select();
138                        markClean(false);
[7658]139                        _root.undo.append(UndoStack.prototype.undo_movepoi,
140                                                          new Array(this,this.originalx,this.originaly),
[17776]141                                                          iText('action_movepoi'));
[6739]142                }
143        };
144        POI.prototype.select=function() {
[12065]145                _root.pointselected=-2;
[16865]146                selectWay(0);
[8894]147                _root.panel.properties.tidy();
[7115]148                _root.panel.properties.saveAttributes();
[6739]149                _root.poiselected=this._name;
[17776]150                setTypeText(iText('point'),this._name);
[16416]151                removeIconPanel();
[7115]152                _root.panel.properties.init('POI',getPanelColumns(),4);
153                _root.panel.presets.init(_root.panel.properties);
154                updateButtons();
155                updateScissors(false);
[16888]156                updateInspector();
[16416]157                this.highlight();
[14765]158                var z=_root.noderels[this._name];
[14727]159                for (var rel in z) { _root.map.relations[rel].redraw(); }
[6739]160        };
[10776]161        POI.prototype.recolour=function() { 
162                this.redden=new Color(this);
163                if (this.locked) { this.redden.setTransform(to_red); }
164                                        else { this.redden.setTransform(to_normal); }
165        };
[6739]166       
[7718]167        POI.prototype.saveUndo=function(str) {
168                _root.undo.append(UndoStack.prototype.undo_deletepoi,
169                                                  new Array(this._name,this._x,this._y,
[17776]170                                                                        deepCopy(this.attr)),iText('a_poi',str));
[7718]171        };
172
[16416]173        POI.prototype.highlight=function() {
[16700]174                var s=9*_root.poiscale/100;
[16416]175                if (this.icon!="poi") { s*=1.3; }
176                highlightSquare(this._x,this._y,s);
177        };
178       
179        POI.prototype.redraw=function() {
180                var a=getPOIIcon(this.attr);
181                if (this.icon==a) { return; }
182                replaceIcon(this,a);
183        };
184
[16888]185        POI.prototype.inspect=function() {
[18174]186                var str = iText('inspector_latlon', Math.floor(coord2lat (this._y)*10000)/10000, Math.floor(coord2long(this._x)*10000)/10000);
[16888]187
[18174]188                if (this.locked) { str+=iText('inspector_locked') + "\n"; }
189                if (!this.clean) { str+=iText('inspector_unsaved'); }
190                if (this.uploading) { str+=' ' + iText('inspector_uploading'); }
[16888]191                return "<p>"+str+"</p>";
192        };
193
194
[6739]195        Object.registerClass("poi",POI);
196
[7718]197
198
199        // ==============================================================
200        // Support functions
201
[14904]202        function getName(attr,namelist) {
203                var a='';
[16525]204                if (attr['name'] && attr['name'].substr(0,6)!='(type ') {
[14904]205                        a=attr['name'];
206                } else {
207                        for (var i in namelist) {
208                                if (attr[namelist[i]]) { a=attr[namelist[i]]; }
209                        }
210                }
211                if (attr['ref']) { a=attr['ref']+" "+a; }
[16388]212                if (attr['tiger:reviewed']=='aerial') { a+="*"; }
[14904]213                return a;
214        }
215
[6739]216        function resizePOIs() {
217                for (var qpoi in _root.map.pois) {
[16700]218                        if (_root.map.pois.icon=='poi') { _root.map.pois[qpoi]._xscale=_root.map.pois[qpoi]._yscale=_root.poiscale; }
219                                                                           else { _root.map.pois[qpoi]._xscale=_root.map.pois[qpoi]._yscale=_root.iconscale; }
[6739]220                }
221                if (_root.poiselected) {
[16416]222                        _root.map.pois[poiselected].highlight();
[6739]223                }
[16388]224                for (var qp in _root.map.photos) {
[16700]225                        _root.map.photos[qp]._xscale=_root.map.photos[qp]._yscale=_root.poiscale;
[16388]226                }
[6739]227        }
[16416]228       
229        function getPOIIcon(attr) {
230                var a='poi';
231                for (var i in icontags) {
232                        var ok=true;
[16525]233                        var t=icontags[i]; for (var k in t) {
[16416]234                                if (!attr[k] || attr[k]!=icontags[i][k]) { ok=false; }
235                        }
236                        if (ok) { a='poi_'+i; }
237                }
238                return a;
239        }
[6739]240
[16416]241        function replaceIcon(poi,newicon) {
242                var x=poi._x; var y=poi._y;
[17985]243                var v=poi.version; var a=deepCopy(poi.attr);
[16446]244                var d=poi.getDepth(); var n=poi._name; var c=poi.clean;
[16416]245                _root.map.pois.attachMovie(newicon,n,d);
246                poi=_root.map.pois[n];
247                poi._x=x; poi._y=y;
[17985]248                poi._xscale=poi._yscale=_root.iconscale;
[16446]249                poi.version=v; poi.attr=a; poi.icon=newicon; poi.clean=c;
[17985]250                if (n==_root.poiselected) { poi.highlight(); _root.panel.properties.proparr=poi.attr; }
[16416]251        }
[6739]252
253        // purgePOIs - remove any clean POIs outside current view
254
255        function purgePOIs() {
256                var coord_l=long2coord(edge_l); var coord_t=lat2coord(edge_t);
257                var coord_r=long2coord(edge_r); var coord_b=lat2coord(edge_b);
258                for (qpoi in _root.map.pois) {
259                        if (qpoi==_root.poiselected) {
260                        } else if (!_root.map.pois[qpoi].clean) {
261                                _root.map.pois[qpoi].upload();
262                        } else if ((_root.map.pois[qpoi]._x<coord_l || _root.map.pois[qpoi]._x>coord_r) &&
263                                           (_root.map.pois[qpoi]._y<coord_b || _root.map.pois[qpoi]._y>coord_t)) {
264                                removeMovieClip(_root.map.pois[qpoi]);
265                                _root.poicount-=1;
266                        }
267                }
268        }
[18431]269
270        function uploadDirtyPOIs() {
271                if (_root.sandbox) { return; }
272                var z=_root.map.pois;
273                for (i in z) {
274                        if (!_root.map.pois[i].clean) { _root.map.pois[i].upload(); }
275                }
276        };
Note: See TracBrowser for help on using the repository browser.