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

Last change on this file since 16526 was 16525, checked in by richard, 10 years ago

Potlatch 1.1a

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