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

Last change on this file since 18704 was 18431, checked in by richard, 10 years ago

Potlatch 1.2d

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