source: subversion/applications/editors/potlatch/potlatch.as @ 14979

Last change on this file since 14979 was 14904, checked in by richard, 10 years ago

Potlatch 0.11b

File size: 43.0 KB
Line 
1
2        System.security.loadPolicyFile("http://www.openstreetmap.org/api/crossdomain.xml");
3
4        // =====================================================================================
5        // Initialise
6
7        // Resizable window, disable right-click
8        Stage.showMenu = false;
9        Stage.align="TL";
10        Stage.scaleMode="noScale";
11        resizeListener=new Object();
12        resizeListener.onResize=function() { resizeWindow(); };
13        Stage.addListener(resizeListener);
14        var panelheight=110;
15       
16        // Master movieclip for map
17        _root.createEmptyMovieClip("map",10);
18        _root.map.setMask(_root.masksquare);
19
20        // Master movieclip for panel
21        _root.createEmptyMovieClip("panel",15);
22        _root.panel._x=0; _root.panel._y=500;
23        _root.panel.beginFill(0xF3F3F3,100);
24        _root.panel.moveTo(0,0); _root.panel.lineTo(3000,0);
25        _root.panel.lineTo(3000,panelheight); _root.panel.lineTo(0,panelheight);
26        _root.panel.lineTo(0,0);
27        _root.panel.endFill();
28        _root.panel.createEmptyMovieClip("advice",0xFFFFFC);
29
30        _root.createEmptyMovieClip("windows",0xFFFFFD);
31        var windowdepth=1;
32        var windowsopen=0;
33
34        // Sound
35        beep=new Sound();
36        beep.loadSound("/potlatch/beep.mp3",false);
37
38        // Co-ordinates
39        // London 51.5,0; Weybridge 51.4,-0.5; Worcester 52.2,-2.25; Woodstock 51.85,-1.35
40        var minscale=13;                                // don't zoom out past this
41        var maxscale=19;                                // don't zoom in past this
42        if (scale) {} else {scale=14;}  // default scale if not provided (e.g. GPX)
43        var scale=Math.max(Math.min(Math.floor(scale),maxscale),minscale);
44        var masterscale=5825.4222222222;// master map scale - how many Flash pixels in 1 degree longitude
45                                                                        // (for Landsat, 5120)
46        updateCoords();                                 // get radius, scale
47       
48        // Preselected way/node (from query string)
49        var preway=Number(way);
50        var prenode=Number(node);
51
52        // Preferences
53        preferences=SharedObject.getLocal("preferences");
54        var usertoken=token;
55        if (winie=='true' || winie==true) { winie=true; } else { winie=false; }
56
57        // Key listener - needs to be initialised before Yahoo
58        keyListener=new Object();
59        keyListener.onKeyDown=function() { keyPressed(); };
60        Key.addListener(keyListener);
61
62        // Initialise Yahoo
63        var ywidth=0;           var yheight=0;                  // current Yahoo state
64        var yzoom=8;            var lastyzoom=yzoom;    //  |
65        var bgxoffset=0;        var bgyoffset=0;                // manually correct Yahoo imagery
66        var yahooloaded=false;                                          // is Yahoo component loaded?
67        var yahooinited=false;                                          // is Yahoo component inited?
68        var yahoorightsize=true;                                        // do we need to resize Yahoo?
69        _root.createEmptyMovieClip("yahoo",7);
70
71//      var layernames=new Array("None","Aerial - OpenAerialMap","Aerial - Yahoo!","OSM - Mapnik","OSM - Osmarender","OSM - Maplint (errors)","OSM - cycle map");
72//      var layernums=new Array();
73//      var j=layernames.length; for (i in layernames) { j--; layernums[layernames[i]]=j; }
74
75        // Main initialisation
76        _root.map.createEmptyMovieClip("areas"    ,8);  var areadepth=1;
77        _root.map.createEmptyMovieClip("gpx"      ,9);
78        _root.map.createEmptyMovieClip("relations",10); var reldepth=1;
79        _root.map.createEmptyMovieClip("ways"     ,11); var waydepth=1;
80        _root.map.createEmptyMovieClip("pois"     ,12); var poidepth=1;
81        _root.map.createEmptyMovieClip("elastic"  ,5003); // elastic line
82        initTiles();                                    // create tile clips on layer 7
83
84        _root.masksquare.useHandCursor=false;
85        _root.masksquare.onPress   =function() { mapClick(); };
86        _root.masksquare.onRollOver=function() { mapRollOver(); };
87        _root.masksquare.onRollOut =function() { mapRollOut(); };
88        _root.masksquare.onRelease =function() { mapClickEnd(); };
89        _root.onMouseDown=function() { _root.lastkeypressed=-1; };
90
91        selectWay(0);                                   // way selected?    0 no, otherwise way id
92        var poiselected=0;                              // POI selected?    0 no, otherwise way id
93        var pointselected=-2;                   // point selected? -2 no, otherwise point order
94        var waycount=0;                                 // number of ways currently loaded
95        var waysrequested=0;                    // total number of ways requested
96        var waysreceived=0;                             // total number of ways received
97        var writesrequested=0;                  // number of outstanding write operations
98        var relcount=0;                                 // number of relations currently loaded
99        var relsrequested=0;                    // total number of relations requested
100        var relsreceived=0;                             // total number of relations received
101        var poicount=0;                                 // number of POIs currently loaded
102        var whichrequested=0;                   // total number of whichways requested
103        var whichreceived=0;                    // total number of whichways received
104        var redrawlist=new Array();             // list of ways to redraw (after zooming)
105        var redrawskip=true;                    // skip redrawing ways, just do POIs?
106        var lastresize=new Date();              // last time window was resized
107        var lastwhichways=new Date();   // last time whichways was requested
108        var mapdragged=false;                   // map being dragged?
109        var drawpoint=-1;                               // point being drawn? -1 no, 0+ yes (point order)
110        var lastpoint=0;                                // last value of drawpoint (triple-click detection)
111        var lastpointtime=null;                 // time of last double-click (triple-click detection)
112        var newrelid=-1;                                // new relation ID  (for those not yet saved)
113        var newwayid=-1;                                // new way ID           (for those not yet saved)
114        var newnodeid=-2;                               // new node ID          (for those not yet saved)
115        var newpoiid=-1;                                // new POI ID           (for those not yet saved)
116        var nodes=new Object();                 // hash of nodes
117        var currentproptype='';                 // type of property currently being edited
118        var pointertype='';                             // current mouse pointer
119        var redopropertywindow=null;    // need to redraw property window after deletion?
120        var lastkeypressed=null;                // code of last key pressed
121        var keytarget='';                               // send keys where? ('','key','value')
122        var tilesetloaded='';                   // which tileset is loaded?
123        var tolerance=4/Math.pow(2,_root.scale-13);
124        var bigedge_l=999999; var bigedge_r=-999999; // area of largest whichways
125        var bigedge_b=999999; var bigedge_t=-999999; //  |
126        var saved=new Array();                  // no saved presets yet
127        var sandbox=false;                              // we're doing proper editing
128        var lang=System.capabilities.language; // language (e.g. 'en', 'fr')
129        var signature="Potlatch 0.11b"; // current version
130        var maximised=false;                    // minimised/maximised?
131        var sourcetags=new Array("","","","","NPE","OpenTopoMap");
132        var lastgroup='road';                   // last preset group used
133        var wayrels=new Object();               // which relations are in ways?
134        var noderels=new Object();              // which relations are in nodes?
135
136        var waynames=new Array("highway","barrier","waterway","railway","man_made","leisure","amenity","military","shop","tourism","historic","landuse","natural","sport","cycleway","aeroway","boundary");
137        var nodenames=new Array("highway","barrier","waterway","railway","man_made","leisure","amenity","military","shop","tourism","historic","landuse","natural","sport");
138
139        var tileurls=new Array("http://tile.openstreetmap.org/!/!/!.png",
140                                                   "http://tah.openstreetmap.org/Tiles/tile/!/!/!.png",
141                                                   "http://tah.openstreetmap.org/Tiles/maplint/!/!/!.png",
142                                                   "http://andy.sandbox.cloudmade.com/tiles/cycle/!/!/!.png",
143                                                   "http://npe.openstreetmap.org/!/!/!.png",
144                                                   "http://tile.openaerialmap.org/tiles/1.0.0/opentopomap-900913/!/!/!.jpg");
145
146//      if (layernums[preferences.data.baselayer]==undefined) { preferences.data.baselayer="Aerial - Yahoo!"; }
147        if (custombg) { preferences.data.bgtype=3; preferences.data.tilecustom=custombg; }              // custom background layer from JavaScript
148        if (preferences.data.bgtype       ==undefined) { preferences.data.bgtype       =2; }    // 1=tiles, 2=Yahoo, 3=custom, 4=none
149        if (preferences.data.tileset      ==undefined) { preferences.data.tileset      =3; }    // background layer
150        if (preferences.data.tilecustom   ==undefined) { preferences.data.tilecustom   =''; }   // custom background URL
151        if (preferences.data.launcher     ==undefined) { preferences.data.launcher     =''; }   // external launch URL
152        if (preferences.data.dimbackground==undefined) { preferences.data.dimbackground=true; } // dim background?
153        if (preferences.data.custompointer==undefined) { preferences.data.custompointer=true; } // use custom pointers?
154        if (preferences.data.thinlines    ==undefined) { preferences.data.thinlines    =false;} // always use thin lines?
155        if (preferences.data.advice       ==undefined) { preferences.data.advice       =true; } // show floating advice?
156        if (preferences.data.nosplash     ==undefined) { preferences.data.nosplash     =false; }// hide splash screen?
157        if (preferences.data.noname       ==undefined) { preferences.data.noname       =false; }// highlight unnamed ways?
158
159        // =====================================================================================
160        // Icons
161
162        _root.attachMovie("zoomin","i_zoomin",30);
163        with (_root.i_zoomin) { _x=5; _y=5; };
164        _root.i_zoomin.onPress=function() { zoomIn(); };
165
166        _root.attachMovie("zoomout","i_zoomout",31);
167        with (_root.i_zoomout) { _x=5; _y=27; };
168        _root.i_zoomout.onPress=function() { zoomOut(); };
169        changeScaleTo(_root.scale);
170
171        // Way-specific
172
173        _root.panel.attachMovie("scissors","i_scissors",32);
174        with (_root.panel.i_scissors) { _x=15; _y=63; };
175        _root.panel.i_scissors.onPress   =function() { _root.ws.splitWay(_root.pointselected); };
176        _root.panel.i_scissors.onRollOver=function() { setFloater(iText("Split way at selected point (X)",'tip_splitway')); };
177        _root.panel.i_scissors.onRollOut =function() { clearFloater(); };
178
179        _root.panel.attachMovie("rotation","i_direction",39);
180        with (_root.panel.i_direction) { _x=40; _y=63; _rotation=-45; _visible=true; _alpha=50; };
181        _root.panel.i_direction.onPress=function() { _root.ws.reverseWay(); };
182        _root.panel.i_direction.onRollOver=function() { setFloater(iText("Direction of way - click to reverse",'tip_direction')); };
183        _root.panel.i_direction.onRollOut =function() { clearFloater(); };
184
185        _root.panel.attachMovie("clockwise","i_clockwise",40);
186        with (_root.panel.i_clockwise) { _x=40; _y=63; _visible=false; };
187        _root.panel.i_clockwise.onPress=function() { _root.ws.reverseWay(); };
188        _root.panel.i_clockwise.onRollOver=function() { setFloater(iText("Clockwise circular way - click to reverse",'tip_clockwise')); };
189        _root.panel.i_clockwise.onRollOut =function() { clearFloater(); };
190
191        _root.panel.attachMovie("anticlockwise","i_anticlockwise",42);
192        with (_root.panel.i_anticlockwise) { _x=40; _y=63; _visible=false; };
193        _root.panel.i_anticlockwise.onPress=function() { _root.ws.reverseWay(); };
194        _root.panel.i_anticlockwise.onRollOver=function() { setFloater(iText("Anti-clockwise circular way - click to reverse",'tip_anticlockwise')); };
195        _root.panel.i_anticlockwise.onRollOut =function() { clearFloater(); };
196
197        // General tools
198
199        _root.panel.lineStyle(1,0xCCCCCC,100);
200        _root.panel.moveTo(5,78); _root.panel.lineTo(75,78);
201
202        _root.panel.attachMovie("undo","i_undo",38);
203        with (_root.panel.i_undo) { _x=15; _y=93; _alpha=50; };
204        _root.panel.i_undo.onPress   =function() { _root.undo.rollback(); };
205        _root.panel.i_undo.onRollOver=function() { setFloater(iText("Nothing to undo",'tip_noundo')); };
206        _root.panel.i_undo.onRollOut =function() { clearFloater(); };
207
208        _root.panel.attachMovie("gps","i_gps",36);
209        with (_root.panel.i_gps) { _x=40; _y=93; };
210        _root.panel.i_gps.onPress   =function() { loadGPS(); };
211        _root.panel.i_gps.onRollOver=function() { setFloater(iText("Show GPS tracks (G)",'tip_gps')); };
212        _root.panel.i_gps.onRollOut =function() { clearFloater(); };
213
214        _root.panel.attachMovie("prefs","i_prefs",37);
215        with (_root.panel.i_prefs) { _x=65; _y=93; };
216        _root.panel.i_prefs.onPress   =function() { openOptionsWindow(); };
217        _root.panel.i_prefs.onRollOver=function() { setFloater(iText("Set options (choose the map background)",'tip_options')); };
218        _root.panel.i_prefs.onRollOut =function() { clearFloater(); };
219
220        _root.panel.attachMovie("newattr","i_newattr",33);
221        with (_root.panel.i_newattr) { _x=690; _y=95; };
222        _root.panel.i_newattr.onRelease =function() { _root.panel.properties.enterNewAttribute(); };
223        _root.panel.i_newattr.onRollOver=function() { setFloater(iText("Add a new tag",'tip_addtag')); };
224        _root.panel.i_newattr.onRollOut =function() { clearFloater(); };
225
226        _root.panel.attachMovie("newrel","i_newrel",44);
227        with (_root.panel.i_newrel) { _x=690; _y=75; backgroundColor=0xDDBBBB; background=true;};
228        _root.panel.i_newrel.onRelease =function() { if (Key.isDown(Key.SHIFT)) { _root.panel.properties.repeatAttributes(false);
229                                                                                                } else { addToRelation(); } };
230        _root.panel.i_newrel.onRollOver=function() { setFloater(iText("Add to a relation",'tip_addrelation')); };
231        _root.panel.i_newrel.onRollOut =function() { clearFloater(); };
232
233        _root.panel.attachMovie("repeatattr","i_repeatattr",34);
234        with (_root.panel.i_repeatattr) { _x=690; _y=55; };
235        _root.panel.i_repeatattr.onPress   =function() { _root.panel.properties.repeatAttributes(true); };
236        _root.panel.i_repeatattr.onRollOver=function() { setFloater(iText("Repeat tags from the previously selected way (R)",'tip_repeattag')); };
237        _root.panel.i_repeatattr.onRollOut =function() { clearFloater(); };
238
239        _root.panel.attachMovie("exclamation","i_warning",35);
240        with (_root.panel.i_warning) { _x=58; _y=50; _visible=false; };
241        _root.panel.i_warning.onPress=function() { handleWarning(); };
242        _root.panel.i_warning.onRollOver=function() { setFloater(iText("An error occurred - click for details",'tip_alert')); };
243        _root.panel.i_warning.onRollOut =function() { clearFloater(); };
244        wflashid=setInterval(function() { _root.panel.i_warning._alpha=150-_root.panel.i_warning._alpha; }, 750);
245
246        _root.panel.attachMovie("padlock","padlock",41);
247        with (_root.panel.padlock) { _y=32; _visible=false; };
248        _root.panel.padlock.onPress=function() { keyLock(); };
249
250        _root.createEmptyMovieClip("pointer",0xFFFFFF);
251
252        // =====================================================================================
253        // Initialise text areas
254
255        // Debug text fields
256
257        _root.createTextField('chat',20,130,315,400,80); // 515
258        with (_root.chat) {
259                multiline=true; wordWrap=true;  border=true; selectable = true; type = 'input';
260                _visible=false;//#debug
261        };
262
263        _root.createTextField('coordmonitor',21,130,400,400,60); // 515
264        with (_root.coordmonitor) {
265                multiline=true; wordWrap=true; border=true; selectable = true; type = 'input';
266                _visible=false;//#debug
267        };
268
269        _root.createTextField('floater',0xFFFFFE,15,30,200,18);
270        with (floater) {
271                background=true; backgroundColor=0xFFEEEE;
272                border=true; borderColor=0xAAAAAA;
273                selectable=false; _visible=false;
274        }
275        var floaterID=null;
276
277        // Centre cross-hair
278       
279        if (_root.chat._visible) {
280                _root.createEmptyMovieClip("crosshair",0xFFFFF0);
281                with (_root.crosshair) {
282                        _x=Stage.width/2;
283                        _y=(Stage.height-panelheight)/2;
284                        lineStyle(1,0xFFFFFF,100);
285                        moveTo(-2,0); lineTo(-10,0);
286                        moveTo( 2,0); lineTo( 10,0);
287                        moveTo(0,-2); lineTo(0,-10);
288                        moveTo(0, 2); lineTo(0, 10);
289                }
290        }
291
292        // Text formats
293       
294        plainText =new TextFormat(); plainText.color =0x000000; plainText.size =14; plainText.font ="_sans";
295        plainSmall=new TextFormat(); plainSmall.color=0x000000; plainSmall.size=12; plainSmall.font="_sans";
296        plainDim  =new TextFormat(); plainDim.color  =0x777777; plainDim.size  =12; plainDim.font  ="_sans";
297        plainRight=new TextFormat(); plainRight.color=0x000000; plainRight.size=12; plainRight.font="_sans"; plainRight.align="right";
298        plainTiny =new TextFormat(); plainTiny.color =0x000000; plainTiny.size =11; plainTiny.font ="_sans";
299        plainWhite=new TextFormat(); plainWhite.color=0xFFFFFF; plainWhite.size=12; plainWhite.font="_sans";
300        greySmall =new TextFormat(); greySmall.color =0x888888; greySmall.size =12; greySmall.font ="_sans";
301        boldText  =new TextFormat(); boldText.color  =0x000000; boldText.size  =14; boldText.font  ="_sans"; boldText.bold =true;
302        boldSmall =new TextFormat(); boldSmall.color =0x000000; boldSmall.size =12; boldSmall.font ="_sans"; boldSmall.bold=true;
303        boldWhite =new TextFormat(); boldWhite.color =0xFFFFFF; boldWhite.size =12; boldWhite.font ="_sans"; boldWhite.bold=true;
304        menu_on   =new TextFormat(); menu_on.color   =0x000000; menu_on.size   =12; menu_on.font   ="_sans"; menu_on.bold  =true;
305        menu_off  =new TextFormat(); menu_off.color  =0xFFFFFF; menu_off.size  =12; menu_off.font  ="_sans"; menu_off.bold =true;
306        auto_on   =new TextFormat(); auto_on.color   =0x0000FF; auto_on.size   =12; auto_on.font   ="_sans"; auto_on.bold  =true;
307        auto_off  =new TextFormat(); auto_off.color  =0xFFFFFF; auto_off.size  =12; auto_off.font  ="_sans"; auto_off.bold =true;
308
309        // Colour transform
310       
311        to_black  =new Object(); to_black.ra=to_black.ga=to_black.ba=-100;
312        to_red    =new Object(); to_red.rb=255; to_red.gb=0;
313        to_normal =new Object(); to_normal.ra=to_normal.ga=to_normal.ba=100;
314                                                         to_normal.rb=to_normal.gb=to_normal.bb=0;
315
316        // Text fields
317
318        _root.createEmptyMovieClip('waysloading',22);
319        _root.waysloading._visible=false;
320
321        _root.createTextField('tooltip',46,480,30,215,100);
322        with (_root.tooltip  ) { text=""; setTextFormat(plainRight); selectable=false; type='dynamic'; };
323
324        _root.panel.createTextField('t_type',23,5,5,220,20);
325        with (_root.panel.t_type         ) { text=signature; setTextFormat(boldText); selectable=false; };
326       
327        _root.panel.createTextField('t_details',24,5,23,220,20);
328        with (_root.panel.t_details) { text=""; setTextFormat(plainText); selectable=false; };
329
330       
331        // MovieClip loader
332        var tileLoader=new MovieClipLoader();
333        tileListener=new Object();
334        tileLoader.addListener(tileListener);
335
336        // Interaction with responder script
337        var loaderWaiting=false;
338        var readError=false;
339        var writeError=false;
340
341        remote_read=new NetConnection();
342        remote_read.connect(apiurl+'/read');
343        remote_read.onStatus=function(info) { _root.panel.i_warning._visible=true; readError=true; };
344
345        remote_write=new NetConnection();
346        remote_write.connect(apiurl+'/write');
347        remote_write.onStatus=function(info) { _root.panel.i_warning._visible=true; writeError=true; };
348
349        #include 'node.as'
350        #include 'anchorpoint.as'
351        #include 'poi.as'
352        #include 'relation.as'
353        #include 'way.as'
354        #include 'history.as'
355        #include 'ui.as'
356        #include 'properties.as'
357        #include 'world.as'
358        #include 'tiles.as'
359        #include 'gps.as'
360        #include 'undo.as'
361        #include 'advice.as'
362        #include 'changeset.as'
363        #include 'start.as'
364
365        // =====================================================================================
366        // Start
367
368        var undo=new UndoStack();
369
370        _root.panel.attachMovie("propwindow","properties",50);
371        with (_root.panel.properties) { _x=110; _y=25; _visible=false; };
372
373        _root.panel.attachMovie("presetmenu","presets",60);
374        with (_root.panel.presets) { _x=110; _y=1; _visible=false; };
375
376        updateButtons();
377        updateScissors();
378        setSizes();
379        startChangeset('');
380        loadPresets();
381
382
383
384        // =====================================================================
385        // Map support functions
386        // mapRollOver/Out - user has rolled over/out the main map area
387       
388        function mapRollOver() {
389                removeMovieClip(_root.map.anchorhints);
390                if (_root.tooltip.text.substring(0,4)=='over') { clearTooltip(); }
391                if (_root.drawpoint>-1)     { setPointer('pen'); }
392                else if (_root.wayselected) { setPointer(''   ); }
393                                                       else { setPointer('pen'); }
394        }
395
396        function mapRollOut() {
397                if (_root.pointertype!='')  { setPointer(''   ); }
398        }
399       
400        // processMapDrag, moveMap - process map dragging
401
402        function processMapDrag() {
403                if (mapDragging() || Key.isDown(Key.SPACE)) {
404                        if (_root.pointertype!='hand') { setPointer('hand'); }
405
406                        if (preferences.data.bgtype==2) {
407                                var t=new Date();
408                                if ((t.getTime()-yahootime.getTime())<500) {
409                                        _root.yahoo._x+=Math.floor(_xmouse-lastxmouse); // less than 0.5s, so
410                                        _root.yahoo._y+=Math.floor(_ymouse-lastymouse); // just move offset
411                                } else {
412                                        redrawBackground();                                                             // 0.5s elapsed, so
413                                        _root.yahootime=new Date();                                             // request new tiles
414                                }
415                        } else if (preferences.data.bgtype!=4) {
416                                redrawBackground();
417                        }
418                        moveMap(Math.floor(_xmouse-lastxmouse),Math.floor(_ymouse-lastymouse));
419                }
420        }
421
422        function endMapDrag() {
423                delete _root.onMouseMove;
424                delete _root.onMouseUp;
425                if (mapDragging()) {
426                        redrawBackground();
427                        updateLinks();
428                        whichWays();
429                }
430                restartElastic();
431                if (_root.wayselected) { setPointer(''); }
432                                                  else { setPointer('pen'); }
433        }
434       
435        function moveMap(xdiff,ydiff) {
436                _root.lastxmouse=_root._xmouse;
437                _root.lastymouse=_root._ymouse;
438                if (Key.isDown(Key.SPACE)) {
439                        _root.bgxoffset+=xdiff; _root.map.tiles._x+=xdiff;
440                        _root.bgyoffset+=ydiff; _root.map.tiles._y+=ydiff;
441                        updateCoords(_root.map._x,_root.map._y);
442                } else {
443                        _root.map._x+=xdiff;
444                        _root.map._y+=ydiff;
445                        updateCoords(_root.map._x,_root.map._y);
446                }
447        }
448
449        // mapClick - user has clicked within map area, so start drag
450       
451        function mapClick() {
452                setPointer('pen');
453                clearTooltip();
454                _root.onMouseMove=function() { processMapDrag(); };
455                _root.onMouseUp  =function() { endMapDrag(); };
456                _root.mapdragged=false;
457                _root.lastxmouse=_root._xmouse;
458                _root.lastymouse=_root._ymouse;
459                _root.firstxmouse=_root._xmouse;
460                _root.firstymouse=_root._ymouse;
461                _root.clicktime=new Date();
462                _root.yahootime=new Date();
463        }
464
465        // mapDragging - test whether map was dragged or just clicked
466       
467        function mapDragging() {
468                var t=new Date();
469                var tol=Math.max(_root.tolerance,2);
470                var longclick=(t.getTime()-_root.clicktime)>300;
471                var xdist=Math.abs(_root.firstxmouse-_root._xmouse);
472                var ydist=Math.abs(_root.firstymouse-_root._ymouse);
473                if ((xdist<tol*4  && ydist<tol*4 ) ||
474                   ((xdist<tol*10 && ydist<tol*10) && !longclick)) {
475                } else {
476                        _root.mapdragged=true;
477                }
478                return _root.mapdragged;
479        }
480
481        // mapClickEnd - end of click within map area
482
483        function mapClickEnd() {
484                removeWelcome(true);
485                var t=new Date();
486                if (!mapdragged) {
487                // Clicked on map without dragging
488                        // Adding a point to the way being drawn
489                        if (_root.drawpoint>-1) {
490                                _root.newnodeid--;
491                                _root.nodes[newnodeid]=new Node(newnodeid,_root.map._xmouse,_root.map._ymouse,new Array(),0);
492                                if (_root.pointselected>-2) {
493                                        setTypeText(iText("Way",'way'),_root.wayselected);
494                                        _root.panel.properties.tidy();
495                                        _root.panel.properties.init('way',getPanelColumns(),4);
496                                        updateButtons();
497                                        updateScissors(false);
498                                }
499                                addEndPoint(_root.nodes[newnodeid]);
500                                restartElastic();
501
502                        // Deselecting a way
503                        } else if (_root.wayselected) {
504                                uploadSelected(); deselectAll();
505                                _root.lastpoint=-1;                             // Trap double-click to deselect
506                                _root.lastpointtime=new Date(); //  |
507
508                        // Deselecting a POI
509                        } else if (_root.poiselected) {
510                                uploadSelected(); deselectAll();
511
512                        // Starting a new way
513                        // ** double-click trap should probably also check distance moved
514                        } else if (_root.lastpoint!=-1 || (t.getTime()-_root.lastpointtime)>300) {
515                                _root.newnodeid--; 
516                                _root.nodes[newnodeid]=new Node(newnodeid,_root.map._xmouse,_root.map._ymouse,new Array(),0);
517                                startNewWay(newnodeid);
518                        }
519                }
520                _root.mapdragged=false;
521        }
522
523
524
525        // =====================================================================
526        // Tooltip and pointer functions
527
528        function setTooltip(txt,delay) {
529                _root.tooltip.text=txt;
530                _root.tooltip.setTextFormat(plainRight);
531                _root.createEmptyMovieClip('ttbackground',45);
532                with (_root.ttbackground) {
533                        _x=Stage.width-5; _y=30;
534                        beginFill(0xFFFFFF,75);
535                        moveTo(0,0); lineTo(-_root.tooltip.textWidth-10,0);
536                        lineTo(-_root.tooltip.textWidth-10,_root.tooltip.textHeight+5);
537                        lineTo(0,_root.tooltip.textHeight+5); lineTo(0,0);
538                        endFill();
539                }
540        }
541
542        function clearTooltip() {
543                _root.tooltip.text='';
544                removeMovieClip(_root.ttbackground);
545        }
546       
547        function setFloater(txt) {
548                with (_root.floater) {
549                        text=txt;
550                        setTextFormat(plainSmall); 
551                        _width=textWidth+4;
552
553                        if (_root._ymouse+25<Stage.height      ) { _y=_root._ymouse+4;                   }
554                                                                                                else { _y=_root._ymouse-16;          }
555                        if (_root._xmouse+textWidth<Stage.width) { _x=_root._xmouse+4;                   }
556                                                                                                else { _x=_root._xmouse-textWidth-8; }
557                        _visible=false;
558                }
559                clearInterval(floaterID);
560                floaterID=setInterval(unveilFloater,1000);
561        }
562
563        function unveilFloater(txt) {
564                _root.floater._visible=true;
565                clearInterval(floaterID);
566        }
567       
568        function clearFloater(txt) {
569                clearInterval(floaterID);
570                _root.floater._visible=false;
571        }
572
573        function setPointer(ptype) {
574                if (_root.pointertype==ptype) { return; }
575                if ((ptype) && preferences.data.custompointer) {
576                        _root.attachMovie(ptype,"pointer",0xFFFFFF);
577                        _root.pointer.cacheAsBitmap=true;
578                        _root.pointer._x=_root._xmouse;
579                        _root.pointer._y=_root._ymouse;
580                        _root.pointer.startDrag(true);
581                        Mouse.hide();
582                } else {
583                        _root.pointer._visible=false;
584                        _root.pointer.stopDrag();
585                        Mouse.show();
586                        removeMovieClip(_root.pointer);
587                }
588                _root.pointertype=ptype;
589        }
590
591       
592
593
594
595        // =====================================================================================
596        // Keypress functions
597
598        // keyPressed                           - key listener
599
600        function keyPressed() {
601                clearAdvice();
602                var k=Key.getCode();
603                var c=Key.getAscii(); if (c>=97 && c<=122) { c=c-32; }
604                var s=String.fromCharCode(c);
605                _root.lastkeypressed=k;
606
607                if (keytarget=='keyname' || keytarget=='value') {
608                        if (_root.auto!=undefined) { _root.auto.keyRespond(k); }
609                                           else if (k==13) { autoEnter(); }
610                        return;
611                } else if (_root.windowsopen) {
612                        if (k==187 && _root.windows.relation.box.properties!=undefined) {
613                                _root.windows.relation.box.properties.enterNewAttribute();
614                        };
615                        return;
616                } else if (keytarget!='') { return; }
617
618                if (c>48 && c<58 && (wayselected!=0 || poiselected!=0)) {
619                        if (presetnames[_root.panel.properties.proptype][_root.panel.presets.group][c-48]!=null) {
620                                _root.panel.presets.setAttributes(c-48);
621                                _root.panel.presets.reflect();
622                                if (_root.panel.properties.proptype=='way') { _root.ws.redraw(); }
623                        }
624                        return;
625                } else if (k>=112 && k<=120) {
626                        preferences.data.dimbackground=Key.isDown(Key.SHIFT); 
627                        switch (k) {
628                                case 112:       preferences.data.bgtype=4; break;
629                                case 113:       preferences.data.bgtype=2; break;
630                                default:        preferences.data.bgtype=1; preferences.data.tileset=k-114; break;
631                        }
632                        initBackground(); return;
633                }
634
635                switch (k) {
636                        case 46:                ;                                                                                                       // DELETE/backspace - delete way/node
637                        case 8:                 if (Key.isDown(Key.SHIFT)) {                                            //  |
638                                                                if (_root.wayselected!=0) { _root.ws.removeWithConfirm(); }
639                                                        } else { keyDelete(1); }; break;                                        //  |
640                        case 13:                _root.junction=false; stopDrawing(); break;                     // ENTER - stop drawing line
641                        case 27:                keyRevert(); break;                                                                     // ESCAPE - revert current way
642                        case Key.PGUP:  zoomIn(); break;                                                                        // Page Up - zoom in
643                        case Key.PGDN:  zoomOut(); break;                                                                       // Page Down - zoom out
644                        case Key.LEFT:  moveMap( 140,0); updateLinks(); redrawBackground(); whichWays(); break; // cursor keys
645                        case Key.RIGHT: moveMap(-140,0); updateLinks(); redrawBackground(); whichWays(); break; //  |
646                        case Key.DOWN:  moveMap(0,-100); updateLinks(); redrawBackground(); whichWays(); break; //  |
647                        case Key.UP:    moveMap(0, 100); updateLinks(); redrawBackground(); whichWays(); break; //  |
648                        case Key.CAPSLOCK: dimMap(); break;                                                                     // CAPS LOCK - dim map
649                        case 167:               _root.panel.presets.cycleIcon(); break;                         // cycle presets
650                }
651               
652                switch (s) {
653                        case 'C':               closeChangeset(); break;                                                        // C - close current changeset
654                        case 'G':               loadGPS(); break;                                                                       // G - load GPS
655                        case 'H':               getHistory(); break;                                                            // H - history
656                        case 'L':               showPosition(); break;                                                          // L - show latitude/longitude
657                        case 'P':               askOffset(); break;                                                                     // O - parallel path
658                        case 'R':               _root.panel.properties.repeatAttributes(true);break;// R - repeat attributes
659                        case 'U':               getDeleted(); break;                                                            // U - undelete
660                        case 'X':               _root.ws.splitWay(_root.pointselected); break;          // X - split way
661                        case 'Z':               _root.undo.rollback(); break;                                           // Z - undo
662                        case '`':               _root.panel.presets.cycleIcon(); break;                         // '`' - cycle presets
663                        case '+':               _root.panel.properties.enterNewAttribute(); break;      // '+' - add new attribute (107/187)
664                        case '-':               keyDelete(0); break;                                                            // '-' - delete node from this way only (189)
665                        case '/':               cycleStacked(); break;                                                          // '/' - cycle between stacked ways (191)
666                        case 'M':               maximiseSWF(); break;                                                           // 'M' - maximise/minimise Potlatch
667                        case 'K':               keyLock(); break;                                                                       // 'K' - lock item
668                        case 'S':               var s=''; switch (preferences.data.bgtype) {            // 'S' - set source tag
669                                                                case 1: s=sourcetags[preferences.data.tileset]; break;
670                                                                case 2: s='Yahoo'; break;
671                                                                case 3: s=preferences.data.tilecustom; break;
672                                                        }
673                                                        _root.panel.properties.setTag("source",s); break;
674//                      default:                _root.chat.text=Key.getCode()+" pressed";
675                };
676        }
677
678        function showPosition() { setTooltip("lat "+Math.floor(coord2lat (_root.map._ymouse)*10000)/10000
679                                                                          +"\nlon "+Math.floor(coord2long(_root.map._xmouse)*10000)/10000,0); }
680        function startCount()   { z=new Date(); _root.startTime=z.getTime(); }
681        function endCount(id)   { z=new Date(); zz=Math.floor((z.getTime()-_root.startTime)*100);
682                                                        if (zz>100) { _root.chat.text+=id+":"+zz+";"; } }
683
684        function showObjects(z,indnt) {
685                for (var i in z) {
686                        _root.chat.text+=indnt+i+" ("+typeof(z[i])+")\n";
687                        if (typeof(z[i])=='movieclip' || typeof(z[i])=='object') {
688                                showObjects(z[i],indnt+" ");
689                        }
690                }
691        }
692       
693        function showWaysForNode() {
694                var z=_root.ws.path[pointselected].ways;
695                _root.coordmonitor.text="";
696                for (i in z) { _root.coordmonitor.text+=i+","; }
697        }
698
699        function keyLock() {
700                _root.panel.padlock._x=_root.panel.t_details.textWidth+15;
701                if (_root.wayselected && _root.ws.locked && _root.ws.path.length>200 && !_root.ws.historic) {
702                        setAdvice(true,iText("Too long to unlock - please split into shorter ways",'advice_toolong'));
703                } else if (_root.wayselected) {
704                        _root.ws.locked=!_root.ws.locked;
705                        _root.ws.redraw();
706                        _root.panel.padlock._visible=_root.ws.locked;
707                        if (!_root.ws.locked) { markWayRelationsDirty(_root.wayselected); }
708                } else if (_root.poiselected) {
709                        _root.map.pois[poiselected].locked=!_root.map.pois[poiselected].locked;
710                        _root.map.pois[poiselected].recolour();
711                        _root.panel.padlock._visible=_root.map.pois[poiselected].locked;
712                        if (!_root.map.pois[poiselected].locked) { markNodeRelationsDirty(poiselected); }
713                }
714        }
715
716        function keyDelete(doall) {
717                var rnode;
718                if (_root.poiselected) {
719                        // delete POI
720                        _root.map.pois[poiselected].saveUndo(iText("deleting",'deleting'));
721                        _root.map.pois[poiselected].remove();
722                } else if (_root.drawpoint>-1) {
723                        // 'backspace' most recently drawn point
724                        _root.undo.append(UndoStack.prototype.undo_deletepoint,
725                                                          new Array(deepCopy(_root.ws.path[drawpoint]),
726                                                                                [wayselected],[drawpoint]),
727                                                          iText("deleting a point",'action_deletepoint'));
728//                      _root.ws.path[drawpoint].removeWay(_root.wayselected);
729                        if (_root.drawpoint==0) { rnode=_root.ws.path.shift(); }
730                                                           else { rnode=_root.ws.path.pop(); _root.drawpoint-=1; }
731                        _root.ws.markAsDeleted(rnode);
732                        if (_root.ws.path.length) {
733                                _root.ws.clean=false;
734                                markClean(false);
735                                _root.ws.redraw();
736                                _root.ws.highlightPoints(5000,"anchor");
737                                _root.ws.highlight();
738                                restartElastic();
739                        } else {
740                                _root.map.anchors[_root.drawpoint].endElastic();
741                                _root.ws.remove();
742                                _root.drawpoint=-1;
743                                deselectAll();
744                        }
745                } else if (_root.pointselected>-2) {
746                        // delete selected point
747                        if (doall==1) { _root.ws.path[_root.pointselected].removeFromAllWays(); }
748                                         else { _root.ws.removeAnchorPoint(pointselected); }
749                        _root.pointselected=-2;
750                        _root.drawpoint=-1;
751                        _root.map.elastic.clear();
752                        clearTooltip();
753                        markClean(false);
754                        if (_root.wayselected) { _root.ws.select(); }
755                }
756        };
757
758        function keyRevert() {
759                if              (_root.wayselected<0) { _root.ws.saveUndo(iText("deleting",'deleting'));
760                                                                                stopDrawing();
761                                                                                removeMovieClip(_root.map.areas[wayselected]);
762                                                                                removeMovieClip(_root.ws); }
763                else if (_root.wayselected>0) { _root.ws.saveUndo(iText("cancelling changes to",'action_cancelchanges'));
764                                                                                stopDrawing();
765                                                                                _root.ws.reload(); }
766                else if (_root.poiselected>0) { _root.map.pois[poiselected].saveUndo(iText("cancelling changes to",'action_cancelchanges'));
767                                                                                _root.map.pois[poiselected].reload(); }
768                else if (_root.poiselected<0) { _root.map.pois[poiselected].saveUndo(iText("deleting",'deleting'));
769                                                                                removeMovieClip(_root.map.pois[poiselected]); }
770                revertDirtyRelations();
771                deselectAll();
772        };
773
774
775
776        // =====================================================================
777        // Potlatch-specific UI functions
778       
779        function writeText(obj,t) {
780                with (obj) {
781                        text=t; wordWrap=true;
782                        setTextFormat(plainSmall);
783                        selectable=false; type='dynamic';
784                }
785        }
786
787        function handleError(code,result) {
788                var h=150;
789                if (code==-2 && result[0].indexOf('allocate memory')==-1) {
790                        error=result[0]+iText("\n\nPlease e-mail richard\@systemeD.net with a bug report, saying what you were doing at the time.",'emailauthor'); h+=50;
791                } else { error=result[0]; }
792                _root.windows.attachMovie("modal","error",++windowdepth);
793                _root.windows.error.init(350,h,new Array('Ok'),null);
794                _root.windows.error.box.createTextField("prompt",2,7,9,325,h-30);
795                writeText(_root.windows.error.box.prompt,error);
796        }
797
798        function handleWarning() {
799                _root.windows.attachMovie("modal","error",++windowdepth);
800                _root.windows.error.init(275,130,new Array('Retry','Cancel'),handleWarningAction);
801                _root.windows.error.box.createTextField("prompt",2,7,9,250,100);
802                if (writeError) {
803                        writeText(_root.windows.error.box.prompt,iText("Sorry - the connection to the OpenStreetMap server failed. Any recent changes have not been saved.\n\nWould you like to try again?",'error_connectionfailed'));
804                } else {
805                        writeText(_root.windows.error.box.prompt,iText("Sorry - the OpenStreetMap server didn't respond when asked for data.\n\nWould you like to try again?",'error_readfailed'));
806                }
807        };
808
809        function handleWarningAction(choice) {
810                _root.panel.i_warning._visible=false;
811                _root.writesrequested=0;
812                _root.waysrequested=_root.waysreceived=_root.whichrequested=_root.whichreceived=0;
813                if (choice=='Retry') {
814                        if (writeError) {
815                                // loop through all ways which are uploading, and reupload
816                                for (var qway in _root.map.ways) {
817                                        if (_root.map.ways[qway].uploading) {
818                                                _root.map.ways[qway].uploading=false;
819                                                var z=_root.map.ways[qway].path; for (var i in z) {
820                                                        _root.map.ways[qway].path[i].uploading=false;
821                                                }
822                                                _root.map.ways[qway].upload();
823                                        }
824                                }
825                                for (var qrel in _root.map.relations) {
826                                        if (_root.map.relations[qrel].uploading) {
827                                                _root.map.relations[qrel].uploading=false;
828                                                _root.map.relations[qrel].upload();
829                                        }
830                                }
831                        }
832                        if (readError) { 
833                                bigedge_l=bigedge_b= 999999;
834                                bigedge_r=bigedge_t=-999999;
835                                whichWays();
836                        }
837                }
838                writeError=false; readError=false;
839        };
840
841
842        // =====================================================================
843        // Internationalisation functions
844       
845        function iText(en,id,key1,key2) {
846                var t=en;
847                if (l!='en' && _root.i18n[id][_root.lang]) {
848                        t=_root.i18n[id][_root.lang];
849                }
850                t=replaceStr(t,'$1',key1);
851                t=replaceStr(t,'$2',key2);
852                t=replaceStr(t,'\\n',"\n");
853                return t;
854        }
855
856        function replaceStr(s,a,b) {
857                while (s.indexOf(a)>-1) {
858                        var n=s.indexOf(a);
859                        s=s.substr(0,n)+b+s.substr(n+a.length);
860                }
861                return s;
862        }
863
864
865        // =====================================================================
866        // General support functions
867
868        // everyFrame() - called onEnterFrame
869
870        function everyFrame() {
871
872                // ---- Fix Yahoo! peculiarities
873                _root.yahoo.myMap.enableKeyboardShortcuts(false);
874
875                if (preferences.data.bgtype==2) {
876                        var t=0;
877                        for (i in _root.yahoo.myMap.map["map_"+(18-_root.scale)].mc) {
878                                t+=_root.yahoo.myMap.map["map_"+(18-_root.scale)].mc[i][i].getBytesTotal();
879                        }
880                        _root.yahoo._visible=(t>124000);        // 122850=all blank
881                }
882
883                if (_root.yahoo.myMap.config.isLoaded) {
884                        if (!_root.yahooinited) {
885                                _root.yahooinited=true;
886                                _root.yahooresizer=setInterval(resizeWindow,1000);
887                                setYahooSize();
888                                enableYahooZoom();
889                                _root.yahoo.myMap.map.updateCopyright();
890                        } else if (!_root.yahoorightsize) {
891                                _root.yahoorightsize=true;
892                                _root.yahooresizer=setInterval(resizeWindow,1000);
893                        }
894                }
895
896                // ---- Do we need to redraw the property window?
897                if (_root.redopropertywindow) {
898                        _root.redopropertywindow.tidy();
899                        _root.redopropertywindow.reinit();
900                        _root.redopropertywindow=null;
901                }
902
903                // ---- If resizing has stopped, issue new whichways
904                //              and resize panel
905                var t=new Date();
906                if ((t.getTime()-lastresize.getTime())>500) {
907                        if (lastresize.getTime()>lastwhichways.getTime()) {
908                                whichWays();
909                                redrawBackground();
910                        }
911                }
912
913                // ---- Control "loading ways" display
914                var loading=(_root.waysrequested!=_root.waysreceived) || (_root.whichrequested!=_root.whichreceived);
915                if (loading && _root.writesrequested) { setIOStatus(3); }
916                          else if (_root.writesrequested) { setIOStatus(2); }
917                                                        else if (loading) { setIOStatus(1); }
918                                                                                 else { _root.io=0; _root.waysloading._visible=false; }
919
920                // ---- Redraw lines if necessary (5 per frame)
921                if (_root.redrawlist.length) {
922                        for (var i=0; i<5; i++) {
923                                var w=_root.redrawlist.pop();
924                                _root.map.ways[w].redraw(_root.redrawskip);
925                        }
926                } else { _root.redrawskip=true; }
927
928                // ---- Service tile queue
929                if (preferences.data.bgtype==1 || preferences.data.bgtype==3) { serviceTileQueue(); }
930                if (_root.map.ways._alpha<40) { if (!Key.isToggled(Key.CAPSLOCK)) { dimMap(); } }
931                       
932                // ---- Reinstate focus if lost after click event
933                if (_root.reinstatefocus) {
934                        Selection.setFocus(_root.reinstatefocus); 
935                        _root.reinstatefocus=null;
936                }
937        }
938       
939        // Dim map on CAPS LOCK
940
941        function dimMap() {
942                _root.map.areas._alpha=
943                _root.map.highlight._alpha=
944                _root.map.relations._alpha=
945                _root.map.ways._alpha=
946                _root.map.pois._alpha=Key.isToggled(Key.CAPSLOCK)?30:100;
947        }
948
949        // Options window
950       
951        function openOptionsWindow() {
952                _root.launcher=preferences.data.launcher;       // .variable doesn't work well with preferences.data...
953                _root.windows.attachMovie("modal","options",++windowdepth);
954                _root.windows.options.init(390,175,new Array('Ok'),function() { preferences.data.launcher=_root.launcher; preferences.flush(); } );
955                var box=_root.windows.options.box;
956
957                // Background selector
958
959                box.attachMovie("radio","bgoption",40);
960                box.bgoption.addButton(10,15,'');
961                box.bgoption.addButton(10,35,'Yahoo!');
962                box.bgoption.addButton(10,55,iText("Custom: ",'custom'));
963                box.bgoption.addButton(10,75,iText("No background",'nobackground'));
964                box.bgoption.doOnChange=function(n) { preferences.data.bgtype=n; initBackground(); };
965
966                box.attachMovie("menu","background",60);
967                box.background.init(24,12,preferences.data.tileset,
968                        new Array("OSM - Mapnik","OSM - Osmarender","OSM - Maplint (errors)","OSM - cycle map","Out-of-copyright map","OpenTopoMap"),
969                        'Choose the background to display',function(n) { preferences.data.tileset=n; _root.windows.options.box.bgoption.select(1); },null,0);
970
971                var w=box.bgoption[3].prompt._width+25;
972                box.createTextField("custom",50,w,52,190-w,17);
973                box.custom.setNewTextFormat(plainSmall); box.custom.type='input';
974                box.custom.variable="preferences.data.tilecustom";
975                box.custom.background=true; box.custom.backgroundColor=0xDDDDDD;
976                box.custom.border=true; box.custom.borderColor=0xFFFFFF;
977                box.custom.onSetFocus=function() { this._parent.bgoption.select(3); };
978                box.custom.onKillFocus=function() { initBackground(); };
979
980                box.bgoption.select(preferences.data.bgtype);
981
982                // Checkboxes
983
984                box.attachMovie("checkbox","fadepref",5);
985                box.fadepref.init(10,100,iText("Fade background",'option_fadebackground'),preferences.data.dimbackground,function(n) { preferences.data.dimbackground=n; redrawBackground(); });
986
987                box.attachMovie("checkbox","linepref",8);
988                box.linepref.init(220,15,iText("Use thin lines at all scales",'option_thinlines'),preferences.data.thinlines,function(n) { preferences.data.thinlines=n; changeScaleTo(_root.scale); redrawWays(); });
989
990                box.attachMovie("checkbox","noname",10);
991                box.noname.init(220,35,iText("Highlight unnamed roads",'option_noname'),preferences.data.noname,function(n) { preferences.data.noname=n; redrawWays(); });
992
993                box.attachMovie("checkbox","pointer",4);
994                box.pointer.init(220,55,iText("Use pen and hand pointers",'option_custompointers'),preferences.data.custompointer,function(n) { preferences.data.custompointer=n; });
995
996                box.attachMovie("checkbox","warnings",3);
997                box.warnings.init(220,75,iText("Show floating warnings",'option_warnings'),preferences.data.advice,function(n) { preferences.data.advice=n; });
998
999                // External link
1000               
1001                box.createTextField('externalt',70,217,95,160,20);
1002                with (box.externalt) { text=iText("External launch URL:",'option_external'); setTextFormat(plainSmall); selectable=false; }
1003                box.createTextField('externali',71,219,115,160,17);
1004                box.externali.setNewTextFormat(plainSmall); box.externali.type='input';
1005                box.externali.text=_root.launcher; box.externali.variable="_root.launcher";
1006                box.externali.background=true; box.externali.backgroundColor=0xDDDDDD;
1007                box.externali.border=true; box.externali.borderColor=0xFFFFFF;
1008
1009        }
1010       
1011        // markClean - set JavaScript variable for alert when leaving page
1012
1013        function markClean(a) {
1014                if (!_root.sandbox) {
1015                        if (winie) { flash.external.ExternalInterface.call("markChanged",a); }
1016                                  else { getURL("javascript:var changesaved="+a); }
1017                }
1018        }
1019       
1020        // deselectAll
1021
1022        function deselectAll() {
1023                _root.map.createEmptyMovieClip("anchors",5000); 
1024                _root.map.elastic.clear();
1025                removeMovieClip(_root.map.highlight);
1026                _root.panel.i_clockwise._visible=false;
1027                _root.panel.i_anticlockwise._visible=false;
1028                _root.panel.i_direction._visible=true;
1029                _root.panel.i_direction._alpha=50;
1030                clearTooltip();
1031                setTypeText("","");
1032                _root.panel.padlock._visible=false;
1033
1034                _root.panel.properties.saveAttributes();
1035                _root.panel.properties.tidy();
1036                _root.panel.properties.init('');
1037                _root.panel.presets.init();
1038                updateButtons();
1039                updateScissors(false);
1040                poiselected=0;
1041                pointselected=-2;
1042                lastpoint=0;
1043                selectWay(0);
1044                markClean(true);
1045        };
1046       
1047        // uploadSelected
1048       
1049        function uploadSelected() {
1050                _root.panel.properties.tidy();
1051                if (_root.wayselected!=0 && !_root.ws.clean) {
1052                        uploadDirtyWays(true);
1053                }
1054                if (_root.poiselected!=0 && !_root.map.pois[poiselected].clean) {
1055                        _root.map.pois[poiselected].upload();
1056                }
1057                uploadDirtyRelations();
1058        };
1059       
1060        function uploadDirtyWays(allow_ws) {
1061                var z=_root.map.ways;
1062                for (i in z) {
1063                        if (!_root.map.ways[i].clean && (i!=wayselected || allow_ws) && !_root.map.ways[i].hasDependentNodes()) { 
1064                                _root.map.ways[i].upload();
1065                        }
1066                }
1067        };
1068
1069        // highlightSquare
1070       
1071        function highlightSquare(sx,sy,ss) {
1072                _root.map.createEmptyMovieClip("highlight",5);
1073                _root.map.highlight._x=sx;
1074                _root.map.highlight._y=sy;
1075                _root.map.highlight.beginFill(0xFFFF00,80);
1076                _root.map.highlight.moveTo(-ss, ss);
1077                _root.map.highlight.lineTo( ss, ss);
1078                _root.map.highlight.lineTo( ss,-ss);
1079                _root.map.highlight.lineTo(-ss,-ss);
1080                _root.map.highlight.lineTo(-ss, ss);
1081                _root.map.highlight.endFill();
1082        };
1083
1084        // setIOStatus - update top-right message
1085
1086        function setIOStatus(msg) {
1087                if (_root.io==msg) { return; }
1088                _root.io=msg; var t;
1089                switch (msg) {
1090                        case 3: t=iText("loading/saving data",'hint_saving_loading'); break;
1091                        case 2: t=iText("saving data",'hint_saving'); break;
1092                        case 1: t=iText("loading data",'hint_loading'); break;
1093                }
1094                _root.waysloading.createTextField('prompt',2,0,0,195,20);
1095                with (_root.waysloading.prompt) { text=t; setTextFormat(plainRight); selectable=false; }
1096                _root.waysloading.createEmptyMovieClip('bg',1);
1097                with (_root.waysloading.bg) {
1098                        beginFill(0xFFFFFF,75);
1099                        moveTo(215,0); lineTo(210-_root.waysloading.prompt.textWidth-22,0);
1100                        lineTo(210-_root.waysloading.prompt.textWidth-22,_root.waysloading.prompt.textHeight+5);
1101                        lineTo(215,_root.waysloading.prompt.textHeight+5); lineTo(215,0);
1102                        endFill();
1103                }
1104                _root.waysloading._visible=true;
1105        }
1106
1107        // deepCopy (recursive) and shallowCopy (non-recursive)
1108
1109        function deepCopy(z) {
1110                var a;
1111                if (z.length==null) { a=new Object(); }
1112                                           else { a=new Array(); }
1113                for (var i in z) {
1114                        if (typeof(z[i])=='object') { a[i]=deepCopy(z[i]); }
1115                                                                   else { a[i]=z[i]; }
1116                }
1117                return a;
1118        };
1119
1120        function shallowCopy(z) {
1121                var a;
1122                if (z.length==null) { a=new Object(); }
1123                                           else { a=new Array(); }
1124                for (var i in z) { a[i]=z[i]; }
1125                return a;
1126        }
Note: See TracBrowser for help on using the repository browser.