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

Last change on this file since 18174 was 18174, checked in by avar, 10 years ago

#2351: Make inspector and (and Yahoo) strings in Potlatch translatable.

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