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