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

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

Potlatch 1.3

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                        if (Key.isToggled(Key.CAPSLOCK)) { mapClickEnd(); return; }
99                        _root.nodes[this._name]=new Node(this._name,this._x,this._y,this.attr,this.version);
100                        addEndPoint(_root.nodes[this._name]);
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() {
114                clearFloater();
115                this.onMouseMove=function() { this.trackDrag(); };
116                this.onMouseUp  =function() { this.endDrag();   };
117                _root.firstxmouse=_root.map._xmouse;
118                _root.firstymouse=_root.map._ymouse;
119                this.originalx=this._x;         // saved for undo
120                this.originaly=this._y;         //  |
121        };
122        POI.prototype.trackDrag=function() {
123                this._x=_root.map._xmouse;
124                this._y=_root.map._ymouse;
125        };
126        POI.prototype.endDrag=function() {
127                delete this.onMouseMove;
128                delete this.onMouseUp;
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);
139                        _root.undo.append(UndoStack.prototype.undo_movepoi,
140                                                          new Array(this,this.originalx,this.originaly),
141                                                          iText('action_movepoi'));
142                }
143        };
144        POI.prototype.select=function() {
145                _root.pointselected=-2;
146                selectWay(0);
147                _root.panel.properties.tidy();
148                _root.panel.properties.saveAttributes();
149                _root.poiselected=this._name;
150                setTypeText(iText('point'),this._name);
151                removeIconPanel();
152                _root.panel.properties.init('POI',getPanelColumns(),4);
153                _root.panel.presets.init(_root.panel.properties);
154                updateButtons();
155                updateScissors(false);
156                updateInspector();
157                this.highlight();
158                var z=_root.noderels[this._name];
159                for (var rel in z) { _root.map.relations[rel].redraw(); }
160        };
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        };
166       
167        POI.prototype.saveUndo=function(str) {
168                _root.undo.append(UndoStack.prototype.undo_deletepoi,
169                                                  new Array(this._name,this._x,this._y,
170                                                                        deepCopy(this.attr)),iText('a_poi',str));
171        };
172
173        POI.prototype.highlight=function() {
174                var s=9*_root.poiscale/100;
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
185        POI.prototype.inspect=function() {
186                var str = iText('inspector_latlon', Math.floor(coord2lat (this._y)*10000)/10000, Math.floor(coord2long(this._x)*10000)/10000);
187
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'); }
191                return "<p>"+str+"</p>";
192        };
193
194
195        Object.registerClass("poi",POI);
196
197
198
199        // ==============================================================
200        // Support functions
201
202        function getName(attr,namelist) {
203                var a='';
204                if (attr['name'] && attr['name'].substr(0,6)!='(type ') {
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; }
212                if (attr['tiger:reviewed']=='aerial') { a+="*"; }
213                return a;
214        }
215
216        function resizePOIs() {
217                for (var qpoi in _root.map.pois) {
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; }
220                }
221                if (_root.poiselected) {
222                        _root.map.pois[poiselected].highlight();
223                }
224                for (var qp in _root.map.photos) {
225                        _root.map.photos[qp]._xscale=_root.map.photos[qp]._yscale=_root.poiscale;
226                }
227        }
228       
229        function getPOIIcon(attr) {
230                var a='poi';
231                for (var i in icontags) {
232                        var ok=true;
233                        var t=icontags[i]; for (var k in t) {
234                                if (!attr[k] || attr[k]!=icontags[i][k]) { ok=false; }
235                        }
236                        if (ok) { a='poi_'+i; }
237                }
238                return a;
239        }
240
241        function replaceIcon(poi,newicon) {
242                var x=poi._x; var y=poi._y;
243                var v=poi.version; var a=deepCopy(poi.attr);
244                var d=poi.getDepth(); var n=poi._name; var c=poi.clean;
245                _root.map.pois.attachMovie(newicon,n,d);
246                poi=_root.map.pois[n];
247                poi._x=x; poi._y=y;
248                poi._xscale=poi._yscale=_root.iconscale;
249                poi.version=v; poi.attr=a; poi.icon=newicon; poi.clean=c;
250                if (n==_root.poiselected) { poi.highlight(); _root.panel.properties.proparr=poi.attr; }
251        }
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        }
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.