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

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

Store version as "1.2f" not "Potlatch 1.2f" so I can send it to twitter

File size: 47.4 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="1.2f";   // 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                           "http://www.nearmap.com/maps/nml=Vert&zxy=!,!,!");
159
160//      if (layernums[preferences.data.baselayer]==undefined) { preferences.data.baselayer="Aerial - Yahoo!"; }
161        if (custombg) { preferences.data.bgtype=3; preferences.data.tilecustom=custombg; }              // custom background layer from JavaScript
162        if (preferences.data.bgtype       ==undefined) { preferences.data.bgtype       =2; }    // 1=tiles, 2=Yahoo, 3=custom, 4=none
163        if (preferences.data.tileset      ==undefined) { preferences.data.tileset      =3; }    // background layer
164        if (preferences.data.tilecustom   ==undefined) { preferences.data.tilecustom   =''; }   // custom background URL
165        if (preferences.data.launcher     ==undefined) { preferences.data.launcher     =''; }   // external launch URL
166        if (preferences.data.photokml     ==undefined) { preferences.data.photokml     ='http://www.openstreetphoto.org/openstreetphoto.kml'; } // photo KML
167        if (preferences.data.twitterid    ==undefined) { preferences.data.twitterid    =''; }   // Twitter ID, password, post?
168        if (preferences.data.twitterpwd   ==undefined) { preferences.data.twitterpwd   =''; }   //  |
169        if (preferences.data.twitter      ==undefined) { preferences.data.twitter          =false;}     //  |
170        if (preferences.data.dimbackground==undefined) { preferences.data.dimbackground=true; } // dim background?
171        if (preferences.data.custompointer==undefined) { preferences.data.custompointer=true; } // use custom pointers?
172        if (preferences.data.thinlines    ==undefined) { preferences.data.thinlines    =false;} // always use thin lines?
173        if (preferences.data.thinareas    ==undefined) { preferences.data.thinareas    =false;} // use extra-thin lines for areas
174        if (preferences.data.advice       ==undefined) { preferences.data.advice       =true; } // show floating advice?
175        if (preferences.data.noname       ==undefined) { preferences.data.noname       =false; }// highlight unnamed ways?
176        if (preferences.data.tiger        ==undefined) { preferences.data.tiger        =false; }// highlight unchanged TIGER ways?
177        if (preferences.data.memorise     ==undefined) { preferences.data.memorise     =new Array(); } // memorised tags
178
179
180        // =====================================================================================
181        // App icons
182
183        _root.attachMovie("zoomin","i_zoomin",30);
184        with (_root.i_zoomin) { _x=5; _y=5; };
185        _root.i_zoomin.onPress=function() { zoomIn(); };
186
187        _root.attachMovie("zoomout","i_zoomout",31);
188        with (_root.i_zoomout) { _x=5; _y=27; };
189        _root.i_zoomout.onPress=function() { zoomOut(); };
190        changeScaleTo(_root.scale);
191
192        // Way-specific
193
194        _root.panel.attachMovie("scissors","i_scissors",32);
195        with (_root.panel.i_scissors) { _x=10; _y=58; };
196        _root.panel.i_scissors.onPress   =function() { _root.ws.splitWay(_root.pointselected); };
197        _root.panel.i_scissors.onRollOver=function() { setFloater(iText('tip_splitway')); };
198        _root.panel.i_scissors.onRollOut =function() { clearFloater(); };
199
200        _root.panel.attachMovie("rotation","i_direction",39);
201        with (_root.panel.i_direction) { _x=40; _y=63; _rotation=-45; _visible=true; _alpha=50; };
202        _root.panel.i_direction.onPress=function() { _root.ws.reverseWay(); };
203        _root.panel.i_direction.onRollOver=function() { setFloater(iText('tip_direction')); };
204        _root.panel.i_direction.onRollOut =function() { clearFloater(); };
205
206        _root.panel.attachMovie("clockwise","i_clockwise",40);
207        with (_root.panel.i_clockwise) { _x=40; _y=63; _visible=false; };
208        _root.panel.i_clockwise.onPress=function() { _root.ws.reverseWay(); };
209        _root.panel.i_clockwise.onRollOver=function() { setFloater(iText('tip_clockwise')); };
210        _root.panel.i_clockwise.onRollOut =function() { clearFloater(); };
211
212        _root.panel.attachMovie("anticlockwise","i_anticlockwise",42);
213        with (_root.panel.i_anticlockwise) { _x=40; _y=63; _visible=false; };
214        _root.panel.i_anticlockwise.onPress=function() { _root.ws.reverseWay(); };
215        _root.panel.i_anticlockwise.onRollOver=function() { setFloater(iText('tip_anticlockwise')); };
216        _root.panel.i_anticlockwise.onRollOut =function() { clearFloater(); };
217
218        _root.panel.attachMovie("tidy","i_tidy",47);
219        with (_root.panel.i_tidy) { _x=65; _y=63; _visible=true; };
220        _root.panel.i_tidy.onPress=function() { _root.ws.tidy(); };
221        _root.panel.i_tidy.onRollOver=function() { setFloater(iText('tip_tidy')); };
222        _root.panel.i_tidy.onRollOut =function() { clearFloater(); };
223
224
225        // General tools
226
227        _root.panel.lineStyle(1,0xCCCCCC,100);
228        _root.panel.moveTo(5,78); _root.panel.lineTo(100,78);
229
230        _root.panel.attachMovie("undo","i_undo",38);
231        with (_root.panel.i_undo) { _x=10; _y=88; _alpha=50; };
232        _root.panel.i_undo.onPress   =function() { _root.undo.rollback(); };
233        _root.panel.i_undo.onRollOver=function() { setFloater(iText('tip_noundo')); };
234        _root.panel.i_undo.onRollOut =function() { clearFloater(); };
235
236        _root.panel.attachMovie("gps","i_gps",36);
237        with (_root.panel.i_gps) { _x=35; _y=88; };
238        _root.panel.i_gps.onPress   =function() { loadGPS(); };
239        _root.panel.i_gps.onRollOver=function() { setFloater(iText('tip_gps')); };
240        _root.panel.i_gps.onRollOut =function() { clearFloater(); };
241
242        _root.panel.attachMovie("prefs","i_prefs",37);
243        with (_root.panel.i_prefs) { _x=60; _y=88; };
244        _root.panel.i_prefs.onPress   =function() { openOptionsWindow(); };
245        _root.panel.i_prefs.onRollOver=function() { setFloater(iText('tip_options')); };
246        _root.panel.i_prefs.onRollOut =function() { clearFloater(); };
247
248        _root.panel.attachMovie("camera","i_photo",43);
249        with (_root.panel.i_photo) { _x=85; _y=88; };
250        _root.panel.i_photo.onPress   =function() { loadPhotos(); };
251        _root.panel.i_photo.onRollOver=function() { setFloater(iText('tip_photo')); };
252        _root.panel.i_photo.onRollOut =function() { clearFloater(); };
253
254        _root.panel.attachMovie("newattr","i_newattr",33);
255        with (_root.panel.i_newattr) { _x=690; _y=95; };
256        _root.panel.i_newattr.onRelease =function() { _root.panel.properties.enterNewAttribute(); };
257        _root.panel.i_newattr.onRollOver=function() { setFloater(iText('tip_addtag')); };
258        _root.panel.i_newattr.onRollOut =function() { clearFloater(); };
259
260        _root.panel.attachMovie("newrel","i_newrel",44);
261        with (_root.panel.i_newrel) { _x=690; _y=75; backgroundColor=0xDDBBBB; background=true;};
262        _root.panel.i_newrel.onRelease =function() { if (Key.isDown(Key.SHIFT)) { _root.panel.properties.repeatAttributes(false);
263                                                                                                } else { addToRelation(); } };
264        _root.panel.i_newrel.onRollOver=function() { setFloater(iText('tip_addrelation')); };
265        _root.panel.i_newrel.onRollOut =function() { clearFloater(); };
266
267        _root.panel.attachMovie("repeatattr","i_repeatattr",34);
268        with (_root.panel.i_repeatattr) { _x=690; _y=55; };
269        _root.panel.i_repeatattr.onPress   =function() { _root.panel.properties.repeatAttributes(true); };
270        _root.panel.i_repeatattr.onRollOver=function() { setFloater(iText('tip_repeattag')); };
271        _root.panel.i_repeatattr.onRollOut =function() { clearFloater(); };
272
273        _root.panel.attachMovie("exclamation","i_warning",35);
274        with (_root.panel.i_warning) { _x=80; _y=50; _visible=false; };
275        _root.panel.i_warning.onPress=function() { handleWarning(); };
276        _root.panel.i_warning.onRollOver=function() { setFloater(iText('tip_alert')); };
277        _root.panel.i_warning.onRollOut =function() { clearFloater(); };
278        wflashid=setInterval(function() { _root.panel.i_warning._alpha=150-_root.panel.i_warning._alpha; }, 750);
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="Potlatch "+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                        _quality="LOW";
469                        moveMap(Math.floor(_xmouse-lastxmouse),Math.floor(_ymouse-lastymouse));
470                }
471        }
472
473        function endMapDrag() {
474                delete _root.onMouseMove;
475                delete _root.onMouseUp;
476                _quality="HIGH";
477                if (mapDragging()) {
478                        redrawBackground();
479                        updateLinks();
480                        whichWays();
481                }
482                restartElastic();
483                if (_root.wayselected) { setPointer(''); }
484                                                  else { setPointer('pen'); }
485        }
486       
487        function moveMap(xdiff,ydiff) {
488                _root.lastxmouse=_root._xmouse;
489                _root.lastymouse=_root._ymouse;
490                if (Key.isDown(Key.SPACE)) {
491                        _root.bgxoffset+=xdiff; _root.map.tiles._x+=xdiff;
492                        _root.bgyoffset+=ydiff; _root.map.tiles._y+=ydiff;
493                        updateCoords(_root.map._x,_root.map._y);
494                        _root.mapdragged=true;
495                } else {
496                        _root.map._x+=xdiff;
497                        _root.map._y+=ydiff;
498                        updateCoords(_root.map._x,_root.map._y);
499                }
500        }
501
502        // mapClick - user has clicked within map area, so start drag
503       
504        function mapClick() {
505                setPointer('pen');
506                clearTooltip();
507                _root.onMouseMove=function() { processMapDrag(); };
508                _root.onMouseUp  =function() { endMapDrag(); };
509                _root.mapdragged=false;
510                _root.lastxmouse=_root._xmouse;
511                _root.lastymouse=_root._ymouse;
512                _root.firstxmouse=_root._xmouse;
513                _root.firstymouse=_root._ymouse;
514                _root.clicktime=new Date();
515                _root.yahootime=new Date();
516        }
517
518        // mapDragging - test whether map was dragged or just clicked
519       
520        function mapDragging() {
521                var t=new Date();
522                var tol=Math.max(_root.tolerance,2);
523                var longclick=(t.getTime()-_root.clicktime)>300;
524                var xdist=Math.abs(_root.firstxmouse-_root._xmouse);
525                var ydist=Math.abs(_root.firstymouse-_root._ymouse);
526                if ((xdist<tol*4  && ydist<tol*4 ) ||
527                   ((xdist<tol*10 && ydist<tol*10) && !longclick)) {
528                } else {
529                        _root.mapdragged=true;
530                }
531                return _root.mapdragged;
532        }
533
534        // mapClickEnd - end of click within map area
535
536        function mapClickEnd() {
537                removeWelcome(true);
538                var t=new Date();
539                if (!mapdragged) {
540                // Clicked on map without dragging
541                        // Adding a point to the way being drawn
542                        if (_root.drawpoint>-1) {
543                                _root.newnodeid--;
544                                _root.nodes[newnodeid]=new Node(newnodeid,_root.map._xmouse,_root.map._ymouse,new Array(),0);
545                                if (_root.pointselected>-2) {
546                                        setTypeText(iText('way'),_root.wayselected);
547                                        _root.panel.properties.tidy();
548                                        _root.panel.properties.init('way',getPanelColumns(),4);
549                                }
550                                updateButtons();
551                                updateScissors(false);
552                                addEndPoint(_root.nodes[newnodeid]);
553                                restartElastic();
554
555                        // Deselecting a way
556                        } else if (_root.wayselected) {
557                                uploadSelected(); deselectAll();
558                                _root.lastpoint=-1;                             // Trap double-click to deselect
559                                _root.lastpointtime=new Date(); //  |
560
561                        // Deselecting a POI
562                        } else if (_root.poiselected) {
563                                uploadSelected(); deselectAll();
564
565                        // Starting a new way
566                        // ** double-click trap should probably also check distance moved
567                        } else if (_root.lastpoint!=-1 || (t.getTime()-_root.lastpointtime)>300) {
568                                _root.newnodeid--; 
569                                _root.nodes[newnodeid]=new Node(newnodeid,_root.map._xmouse,_root.map._ymouse,new Array(),0);
570                                startNewWay(newnodeid);
571                        }
572                }
573                _root.mapdragged=false;
574        }
575
576
577
578        // =====================================================================
579        // Tooltip and pointer functions
580
581        function setTooltip(txt,delay) {
582                _root.tooltip.text=txt;
583                _root.tooltip.setTextFormat(plainRight);
584                _root.createEmptyMovieClip('ttbackground',45);
585                with (_root.ttbackground) {
586                        _x=Stage.width-5; _y=30;
587                        beginFill(0xFFFFFF,75);
588                        moveTo(0,0); lineTo(-_root.tooltip.textWidth-10,0);
589                        lineTo(-_root.tooltip.textWidth-10,_root.tooltip.textHeight+5);
590                        lineTo(0,_root.tooltip.textHeight+5); lineTo(0,0);
591                        endFill();
592                }
593        }
594
595        function clearTooltip() {
596                _root.tooltip.text='';
597                removeMovieClip(_root.ttbackground);
598        }
599       
600        function setFloater(txt) {
601                with (_root.floater) {
602                        text=txt;
603                        setTextFormat(plainSmall); 
604                        _width=textWidth+4;
605
606                        if (_root._ymouse+25<Stage.height      ) { _y=_root._ymouse+4;                   }
607                                                                                                else { _y=_root._ymouse-16;          }
608                        if (_root._xmouse+textWidth<Stage.width) { _x=_root._xmouse+4;                   }
609                                                                                                else { _x=_root._xmouse-textWidth-8; }
610                        _visible=false;
611                }
612                clearInterval(floaterID);
613                floaterID=setInterval(unveilFloater,1000);
614        }
615
616        function unveilFloater(txt) {
617                _root.floater._visible=true;
618                clearInterval(floaterID);
619        }
620       
621        function clearFloater(txt) {
622                clearInterval(floaterID);
623                _root.floater._visible=false;
624        }
625
626        function setPointer(ptype) {
627                if (_root.pointertype==ptype) { return; }
628                if ((ptype) && preferences.data.custompointer) {
629                        _root.attachMovie(ptype,"pointer",0xFFFFFF);
630                        _root.pointer.cacheAsBitmap=true;
631                        _root.pointer._x=_root._xmouse;
632                        _root.pointer._y=_root._ymouse;
633                        _root.pointer.startDrag(true);
634                        Mouse.hide();
635                } else {
636                        _root.pointer._visible=false;
637                        _root.pointer.stopDrag();
638                        Mouse.show();
639                        removeMovieClip(_root.pointer);
640                }
641                _root.pointertype=ptype;
642        }
643
644       
645
646
647        // =====================================================================================
648        // Advanced menu
649
650        function advancedAction(n) {
651                switch (n) {
652                        case 0: askOffset(); break;                                                     // parallel way
653                        case 1: getHistory(); break;                                            // history
654                        case 3: toggleInspector(); break;                                       // inspector
655                        case 4: getDeleted(); break;                                            // undelete
656                        case 5: closeChangeset(); break;                                        // close changeset
657                        case 6: maximiseSWF(); break;                                           // maximise window
658                }
659        }
660
661        // =====================================================================================
662        // Keypress functions
663
664        // keyPressed                           - key listener
665
666        function keyPressed() {
667                clearAdvice();
668                var k=Key.getCode();
669                var c=Key.getAscii(); if (c>=97 && c<=122) { c=c-32; }
670                var s=String.fromCharCode(c);
671                _root.lastkeypressed=k;
672
673                if (keytarget=='keyname' || keytarget=='value') {
674                        if (_root.auto!=undefined) { _root.auto.keyRespond(k); }
675                                           else if (k==13) { autoEnter(); }
676                        return;
677                } else if (hashLength(_root.windows)) {
678                        if (k==187 && _root.windows.relation.box.properties!=undefined) {
679                                _root.windows.relation.box.properties.enterNewAttribute();
680                        } else if (k==13 && _root.windows.cs) { completeClose(iText("ok")); _root.windows.cs.remove(); }
681                        return;
682                } else if (keytarget!='') { return; }
683
684                if (k>=48 && k<58) { c=k; }             // we don't want shifted numeric characters
685                if (c>48 && c<58 && (wayselected!=0 || poiselected!=0)) {
686                        if (Key.isDown(Key.SHIFT) && Key.isDown(Key.CONTROL)) {
687                                // memorise
688                                preferences.data.memorise[c-48]=shallowCopy(_root.panel.properties.proparr);
689                                preferences.flush();
690                                setAdvice(false,"Memorised tag combination "+(c-48));
691                        } else if (Key.isDown(Key.SHIFT)) {
692                                // apply memorised
693                                _root.panel.properties.setAttributes(preferences.data.memorise[c-48]);
694                                _root.panel.properties.reflect();
695                        } else {
696                                // apply presets
697                                if (presetnames[_root.panel.properties.proptype][_root.panel.presets.group][c-48]!=null) {
698                                        _root.panel.presets.setAttributesFromPreset(c-48);
699                                        _root.panel.presets.reflect();
700                                        if (_root.panel.properties.proptype=='way') { _root.ws.redraw(); }
701                                }
702                                return;
703                        }
704                } else if (k>=112 && k<=120) {
705                        preferences.data.dimbackground=Key.isDown(Key.SHIFT); 
706                        switch (k) {
707                                case 112:       preferences.data.bgtype=4; break;
708                                case 113:       preferences.data.bgtype=2; break;
709                                default:        preferences.data.bgtype=1; preferences.data.tileset=k-114; break;
710                        }
711                        initBackground(); return;
712                }
713
714                var xinc=140; var yinc=100;
715                if (Key.isDown(Key.SPACE)) { 
716                        if (_root.scale<17) { xinc=0.5; yinc=0.5; }
717                                       else { xinc=0.1; yinc=0.1; }
718                }
719               
720                switch (k) {
721                        case 46:                ;                                                                                                       // DELETE/backspace - delete way/node
722                        case 8:                 if (Key.isDown(Key.SHIFT)) {                                            //  |
723                                                                if (_root.wayselected!=0) { _root.ws.removeWithConfirm(); }
724                                                        } else { keyDelete(1); }; break;                                        //  |
725                        case 13:                _root.junction=false; stopDrawing(); break;                     // ENTER - stop drawing line
726                        case 27:                keyRevert(); break;                                                                     // ESCAPE - revert current way
727                        case 48:                _root.panel.properties.nukeAttributes(); break;         // 0 - remove all tags
728                        case Key.PGUP:  zoomIn(); break;                                                                        // Page Up - zoom in
729                        case Key.PGDN:  zoomOut(); break;                                                                       // Page Down - zoom out
730                        case Key.LEFT:  moveMap( xinc,0); updateLinks(); redrawBackground(); whichWays(); break;        // cursor keys
731                        case Key.RIGHT: moveMap(-xinc,0); updateLinks(); redrawBackground(); whichWays(); break;        //  |
732                        case Key.DOWN:  moveMap(0,-yinc); updateLinks(); redrawBackground(); whichWays(); break;        //  |
733                        case Key.UP:    moveMap(0, yinc); updateLinks(); redrawBackground(); whichWays(); break;        //  |
734                        case Key.CAPSLOCK: dimMap(); break;                                                                     // CAPS LOCK - dim map
735                        case 167:               _root.panel.presets.cycleIcon(); break;                         // cycle presets
736                }
737               
738                switch (s) {
739                        case 'C':               closeChangeset(); break;                                                        // C - close current changeset
740                        case 'S':               prepareUpload(); break;                                                         // S - save
741                        case 'G':               loadGPS(); break;                                                                       // G - load GPS
742                        case 'H':               getHistory(); break;                                                            // H - history
743                        case 'I':               toggleInspector(); break;                                                       // I - inspector
744                        case 'J':               if (pointselected>-2) {                                                         // J - join nodes
745                                                                _root.map.anchors[pointselected].joinNodes();   //   |
746                                                                break;                                                                                  //   |
747                                                        }                                                                                                       // I - inspector
748                        case 'L':               showPosition(); break;                                                          // L - show latitude/longitude
749                        case 'P':               askOffset(); break;                                                                     // P - parallel path
750                        case 'R':               _root.panel.properties.repeatAttributes(true);break;// R - repeat attributes
751                        case 'T':               if (!Key.isDown(Key.CONTROL)) { _root.ws.tidy(); }      // T - tidy
752                                                        break;                                                                                          //   |
753                        case 'U':               getDeleted(); break;                                                            // U - undelete
754                        case 'W':               if (_root.ws) { stopDrawing(); _root.ws.select();};     // W - select way
755                                                        break;                                                                                          //   |
756                        case 'X':               _root.ws.splitWay(_root.pointselected); break;          // X - split way
757                        case 'Z':               _root.undo.rollback(); break;                                           // Z - undo
758                        case '~':               var dummy=1;                                                                            // '`' - cycle presets
759                        case '`':               _root.panel.presets.cycleIcon(); break;                         //    |
760                        case '=':               var dummy=1;                                                                            // '+' - add new attribute (107/187)
761                        case '+':               _root.panel.properties.enterNewAttribute(); break;      //    |
762                        case '-':               keyDelete(0); break;                                                            // '-' - delete node from this way only (189)
763                        case '/':               cycleStacked(); break;                                                          // '/' - cycle between stacked ways (191)
764                        case 'M':               maximiseSWF(); break;                                                           // 'M' - maximise/minimise Potlatch
765                        case 'K':               keyLock(); break;                                                                       // 'K' - lock item
766                        case 'B':               var s=''; switch (preferences.data.bgtype) {            // 'S' - set source tag
767                                                                case 1: s=sourcetags[preferences.data.tileset]; break;
768                                                                case 2: s='Yahoo'; break;
769                                                                case 3: s=preferences.data.tilecustom; break;
770                                                        }
771                                                        _root.panel.properties.setTag("source",s); break;
772//                      default:                _root.chat.text=Key.getCode()+" -"+s+"- pressed";
773                };
774        }
775
776        function showPosition() { setTooltip(iText('hint_latlon',
777                                                 Math.floor(coord2lat (_root.map._ymouse)*10000)/10000,
778                                                                                     Math.floor(coord2long(_root.map._xmouse)*10000)/10000,0)); }
779        function startCount()   { z=new Date(); _root.startTime=z.getTime(); }
780        function endCount(id)   { z=new Date(); zz=Math.floor((z.getTime()-_root.startTime)*100);
781                                                        if (zz>100) { _root.chat.text+=id+":"+zz+";"; } }
782
783        function showObjects(z,indnt) {
784                ASSetPropFlags(z,null,6,true);
785                for (var i in z) {
786                        _root.chat.text+=indnt+i+" ("+typeof(z[i]);
787                        if (typeof(z[i])=='string' || typeof(z[i])=='boolean') { _root.chat.text+="="+z[i]; }
788                        _root.chat.text+=")\n";
789                        if (typeof(z[i])=='movieclip' || typeof(z[i])=='object') {
790                                showObjects(z[i],indnt+" ");
791                        }
792                }
793        }
794       
795        function showWaysForNode() {
796                var z=_root.ws.path[pointselected].ways;
797                _root.coordmonitor.text="";
798                for (i in z) { _root.coordmonitor.text+=i+","; }
799        }
800
801        function keyLock() {
802                if (_root.wayselected && _root.ws.locked && _root.ws.path.length>=2000 && !_root.ws.historic) {
803                        setAdvice(true,iText('advice_toolong'));
804                } else if (_root.wayselected) {
805                        _root.ws.locked=!_root.ws.locked;
806                        _root.ws.redraw();
807                        if (!_root.ws.locked) { markWayRelationsDirty(_root.wayselected); }
808                        updateInspector();
809                        _root.panel.properties.reinit();
810                } else if (_root.poiselected) {
811                        _root.map.pois[poiselected].locked=!_root.map.pois[poiselected].locked;
812                        _root.map.pois[poiselected].recolour();
813                        if (!_root.map.pois[poiselected].locked) { markNodeRelationsDirty(poiselected); }
814                        _root.panel.properties.reinit();
815                }
816        }
817
818        function keyDelete(doall) {
819        clearFloater(); 
820                var rnode;
821                if (_root.poiselected) {
822                        // delete POI
823                        _root.map.pois[poiselected].saveUndo(iText('deleting'));
824                        _root.map.pois[poiselected].remove();
825                } else if (_root.drawpoint>-1) {
826                        // 'backspace' most recently drawn point
827                        var undoarray=new Array(deepCopy(_root.ws.path[drawpoint]),[wayselected],[drawpoint]);
828//                      _root.ws.path[drawpoint].removeWay(_root.wayselected);
829                        if (_root.drawpoint==0) { rnode=_root.ws.path.shift(); }
830                                                           else { rnode=_root.ws.path.pop(); _root.drawpoint-=1; }
831                        if (!_root.ws.path[pointselected]) { pointselected--; }
832                        _root.ws.markAsDeleted(rnode);
833                        if (_root.ws.path.length) {
834                                _root.undo.append(UndoStack.prototype.undo_deletepoint,undoarray,
835                                                                  iText('action_deletepoint'));
836                                _root.ws.clean=false;
837                                markClean(false);
838                                _root.ws.redraw();
839                                _root.ws.highlightPoints(5000,"anchor");
840                                _root.ws.highlight();
841                                restartElastic();
842                        } else {
843                                _root.map.anchors[_root.drawpoint].endElastic();
844                                _root.ws.saveDeleteUndo(iText('deleting'));
845                                _root.ws.remove();
846                                deselectAll();
847                                markClean(true);
848                        }
849                } else if (_root.pointselected>-2) {
850                        // delete selected point
851                        if (doall==1) { _root.ws.path[_root.pointselected].removeFromAllWays(); }
852                                         else { _root.ws.removeAnchorPoint(pointselected); }
853                        _root.pointselected=-2;
854                        _root.drawpoint=-1;
855                        _root.map.elastic.clear();
856                        clearTooltip();
857                        markClean(false);
858                        if (_root.wayselected) { _root.ws.select(); }
859                }
860        };
861
862        function keyRevert() {
863                if              (_root.wayselected<0) { if (_root.ws.path.length>1) {
864                                                                                        setAdvice(false,iText('advice_deletingway'));
865                                                                                        _root.ws.saveDeleteUndo(iText('deleting'));
866                                                                                }
867                                                                                stopDrawing();
868                                                                                memberDeleted('Way',wayselected);
869                                                                                removeMovieClip(_root.map.areas[wayselected]);
870                                                                                removeMovieClip(_root.ws); }
871                else if (_root.wayselected>0) { setAdvice(false,iText('advice_revertingway'));
872                                                                                _root.ws.saveChangeUndo(iText('action_cancelchanges'));
873                                                                                stopDrawing();
874                                                                                _root.ws.reload(); }
875                else if (_root.poiselected>0) { setAdvice(false,iText('advice_revertingpoi'));
876                                                                                _root.map.pois[poiselected].saveUndo(iText('action_cancelchanges'));
877                                                                                _root.map.pois[poiselected].reload(); }
878                else if (_root.poiselected<0) { setAdvice(false,iText('advice_deletingpoi'));
879                                                                                _root.map.pois[poiselected].saveUndo(iText('deleting'));
880                                                                                memberDeleted('Node',poiselected);
881                                                                                removeMovieClip(_root.map.pois[poiselected]); }
882                deselectAll();
883        };
884
885
886
887        // =====================================================================
888        // Potlatch-specific UI functions
889       
890        function writeText(obj,t) {
891                with (obj) {
892                        text=t; wordWrap=true;
893                        setTextFormat(plainSmall);
894                        selectable=false; type='dynamic';
895                }
896        }
897
898
899
900        // =====================================================================
901        // Internationalisation functions
902       
903        function iText(id,key1,key2,key3,key4) {
904                var t;
905        if (_root.i18n[id]) {
906            t=_root.i18n[id];
907        } else {
908            t='I18N ERR';
909        }
910                t=replaceStr(t,'$1',key1);
911                t=replaceStr(t,'$2',key2);
912                t=replaceStr(t,'$3',key3);
913                t=replaceStr(t,'$4',key4);
914                t=replaceStr(t,'\\n',"\n");
915                return t;
916        }
917
918        function replaceStr(s,a,b) {
919                while (s.indexOf(a)>-1) {
920                        var n=s.indexOf(a);
921                        s=s.substr(0,n)+b+s.substr(n+a.length);
922                }
923                return s;
924        }
925       
926        function adjustTextField(obj) {
927                if (obj.textWidth>obj._width) { obj._width=obj.textWidth+5; }
928        }
929
930
931        // =====================================================================
932        // General support functions
933
934        // everyFrame() - called onEnterFrame
935
936        function everyFrame() {
937
938                // ---- Fix Yahoo! peculiarities
939                _root.yahoo.myMap.enableKeyboardShortcuts(false);
940
941                if (preferences.data.bgtype==2) {
942                        var t=0;
943                        for (i in _root.yahoo.myMap.map["map_"+(18-_root.scale)].mc) {
944                                t+=_root.yahoo.myMap.map["map_"+(18-_root.scale)].mc[i][i].getBytesTotal();
945                        }
946                        _root.yahoo._visible=(t>124000);        // 122850=all blank
947                }
948
949                if (_root.yahoo.myMap.config.isLoaded) {
950                        if (!_root.yahooinited) {
951                                _root.yahooinited=true;
952                                _root.yahooresizer=setInterval(resizeWindow,1000);
953                                setYahooSize();
954                                enableYahooZoom();
955                                _root.yahoo.myMap.map.updateCopyright();
956                        } else if (!_root.yahoorightsize) {
957                                _root.yahoorightsize=true;
958                                _root.yahooresizer=setInterval(resizeWindow,1000);
959                        }
960                }
961
962                // ---- Do we need to redraw the property window?
963                if (_root.redopropertywindow) {
964                        _root.redopropertywindow.tidy();
965                        _root.redopropertywindow.reinit();
966                        _root.redopropertywindow=null;
967                }
968
969                // ---- If resizing has stopped, issue new whichways
970                //              and resize panel
971                var t=new Date();
972                if ((t.getTime()-lastresize.getTime())>500) {
973                        if (lastresize.getTime()>lastwhichways.getTime()) {
974                                whichWays();
975                                redrawBackground();
976                        }
977                }
978
979                // ---- Control "loading ways" display
980                var loading=(_root.waysrequested!=_root.waysreceived) || (_root.whichrequested!=_root.whichreceived);
981                if (loading && _root.writesrequested) { setIOStatus(3); }
982                          else if (_root.writesrequested) { setIOStatus(2); }
983                                                        else if (loading) { setIOStatus(1); }
984                                                                                 else { _root.io=0; _root.waysloading._visible=false; }
985
986                // ---- Redraw lines if necessary
987                if (_root.redrawlist.length) {
988                        for (var i=0; i<20; i++) {
989                                var w=_root.redrawlist.pop();
990                                _root.map.ways[w].redraw(_root.redrawskip);
991                        }
992                } else { _root.redrawskip=true; }
993
994                // ---- Service tile queue
995                if (preferences.data.bgtype==1 || preferences.data.bgtype==3) { serviceTileQueue(); }
996                if (_root.map.ways._alpha<40) { if (!Key.isToggled(Key.CAPSLOCK)) { dimMap(); } }
997                       
998                // ---- Reinstate focus if lost after click event
999                if (_root.reinstatefocus) {
1000                        Selection.setFocus(_root.reinstatefocus); 
1001                        _root.reinstatefocus=null;
1002                }
1003        }
1004       
1005        // Dim map on CAPS LOCK
1006
1007        function dimMap() {
1008                _root.map.areas._alpha=
1009                _root.map.highlight._alpha=
1010                _root.map.relations._alpha=
1011                _root.map.ways._alpha=
1012                _root.map.pois._alpha=Key.isToggled(Key.CAPSLOCK)?30:100;
1013        }
1014
1015        // Options window
1016       
1017        function openOptionsWindow() {
1018                _root.launcher  =preferences.data.launcher;             // .variable doesn't work well with preferences.data...
1019                _root.photokml  =preferences.data.photokml;             //   |
1020                _root.twitterid =preferences.data.twitterid;    //   |
1021                _root.twitterpwd=preferences.data.twitterpwd;   //   |
1022                _root.windows.attachMovie("modal","options",++windowdepth);
1023                _root.windows.options.init(430,225,new Array('Ok'),function() {
1024                        preferences.data.launcher  =_root.launcher; 
1025                        preferences.data.photokml  =_root.photokml; 
1026                        preferences.data.twitterid =_root.twitterid;
1027                        preferences.data.twitterpwd=_root.twitterpwd;
1028                        preferences.flush();
1029                } );
1030                var box=_root.windows.options.box;
1031
1032                // Background selector
1033
1034                box.attachMovie("radio","bgoption",40);
1035                box.bgoption.addButton(10,15,'');
1036                box.bgoption.addButton(10,35,iText('option_layer_yahoo'));
1037                box.bgoption.addButton(10,55,iText('custom'));
1038                box.bgoption.addButton(10,75,iText('nobackground'));
1039                box.bgoption.doOnChange=function(n) { preferences.data.bgtype=n; initBackground(); };
1040
1041                box.attachMovie("menu","background",60);
1042                box.background.init(24,12,preferences.data.tileset,
1043                        new Array(iText('option_layer_mapnik'),
1044                      iText('option_layer_osmarender'),
1045                      iText('option_layer_maplint'),
1046                      iText('option_layer_cycle_map'),
1047                      iText('option_layer_ooc_npe'),
1048                      iText('option_layer_ooc_7th'),
1049                      iText('option_layer_ooc_25k'),
1050                      iText('option_layer_nearmap')),
1051                        iText('option_layer_tip'),function(n) { preferences.data.tileset=n; _root.windows.options.box.bgoption.select(1); },null,0);
1052
1053                var w=box.bgoption[3].prompt._width+25;
1054                box.createTextField("custom",50,w,52,190-w,17);
1055                box.custom.setNewTextFormat(plainSmall); box.custom.type='input';
1056                box.custom.variable="preferences.data.tilecustom";
1057                box.custom.background=true; box.custom.backgroundColor=0xDDDDDD;
1058                box.custom.border=true; box.custom.borderColor=0xFFFFFF;
1059                box.custom.onSetFocus=function() { this._parent.bgoption.select(3); };
1060                box.custom.onKillFocus=function() { initBackground(); };
1061
1062                box.bgoption.select(preferences.data.bgtype);
1063
1064                // Checkboxes
1065
1066                box.attachMovie("checkbox","fadepref",5);
1067                box.fadepref.init(10,100,iText('option_fadebackground'),preferences.data.dimbackground,function(n) { preferences.data.dimbackground=n; redrawBackground(); });
1068
1069                box.attachMovie("checkbox","linepref",8);
1070                box.linepref.init(220,15,iText('option_thinlines'),preferences.data.thinlines,function(n) { preferences.data.thinlines=n; changeScaleTo(_root.scale); redrawWays(); });
1071
1072                box.attachMovie("checkbox","tiger",12);
1073                box.tiger.init(220,35,iText('option_thinareas'),preferences.data.thinareas,function(n) { preferences.data.thinareas=n; changeScaleTo(_root.scale); redrawWays(); });
1074
1075                box.attachMovie("checkbox","noname",10);
1076                box.noname.init(220,55,iText('option_noname'),preferences.data.noname,function(n) { preferences.data.noname=n; redrawWays(); });
1077
1078                box.attachMovie("checkbox","tiger",11);
1079                box.tiger.init(220,75,iText('option_tiger'),preferences.data.tiger,function(n) { preferences.data.tiger=n; redrawWays(); });
1080
1081                box.attachMovie("checkbox","pointer",4);
1082                box.pointer.init(220,105,iText('option_custompointers'),preferences.data.custompointer,function(n) { preferences.data.custompointer=n; });
1083
1084                box.attachMovie("checkbox","warnings",3);
1085                box.warnings.init(220,125,iText('option_warnings'),preferences.data.advice,function(n) { preferences.data.advice=n; });
1086
1087                // External link and photo
1088               
1089                createInputPrompt(box,'external',70,'option_external',  '_root.launcher',145);
1090                createInputPrompt(box,'photo'   ,72,'option_photo',             '_root.photokml',125);
1091                createInputPrompt(box,'tw_id'   ,74,'option_twitterid', '_root.twitterid',175);
1092                createInputPrompt(box,'tw_pwd'  ,76,'option_twitterpwd','_root.twitterpwd',195);
1093                box.tw_pwdi.password=true;
1094        }
1095       
1096        function createInputPrompt(box,objname,objpos,tname,varset,py) {
1097                var objt=objname+'t';
1098                var obji=objname+'i';
1099               
1100                box.createTextField(objt,objpos,8,py,160,20);
1101                with (box[objt]) { text=iText(tname); setTextFormat(plainSmall); selectable=false; }
1102                adjustTextField(box[objt]);
1103               
1104                box.createTextField(obji,objpos+1,box[objt].textWidth+15,py,173-box[objt].textWidth,17);
1105                box[obji].setNewTextFormat(plainSmall); box[obji].type='input';
1106                box[obji].text=_root.photokml; box[obji].variable=varset;
1107                box[obji].background=true; box[obji].backgroundColor=0xDDDDDD;
1108                box[obji].border=true; box[obji].borderColor=0xFFFFFF;
1109        }
1110       
1111        // markClean -  set JavaScript variable for alert when leaving page
1112        //                              true: don't show alert          false: show alert
1113
1114        function markClean(state) {
1115                if (winie) { flash.external.ExternalInterface.call("markChanged",state); }
1116                          else { getURL("javascript:var changesaved="+state); }
1117                updateInspector();
1118        }
1119       
1120        // deselectAll
1121
1122        function deselectAll() {
1123                _root.map.createEmptyMovieClip("anchors",5000); 
1124                _root.map.createEmptyMovieClip("anchorhints",5001); drawpoint=-1;
1125                _root.map.elastic.clear();
1126                removeMovieClip(_root.map.highlight);
1127                _root.panel.i_clockwise._visible=false;
1128                _root.panel.i_anticlockwise._visible=false;
1129                _root.panel.i_direction._visible=true;
1130                _root.panel.i_direction._alpha=50;
1131                clearTooltip();
1132                setTypeText("","");
1133
1134                _root.panel.properties.saveAttributes();
1135                _root.panel.properties.tidy();
1136                _root.panel.properties.init('');
1137                _root.panel.presets.init();
1138                drawIconPanel();
1139                updateButtons();
1140                updateScissors(false);
1141                poiselected=0;
1142                pointselected=-2;
1143                lastpoint=0;
1144                selectWay(0);
1145                // markClean(true);
1146        };
1147       
1148        // uploadSelected
1149       
1150        function uploadSelected() {
1151                _root.panel.properties.tidy();
1152                if (_root.sandbox) { return; }
1153                if (_root.wayselected!=0 && !_root.ws.clean) {
1154                        uploadDirtyWays(true);
1155                }
1156                if (_root.poiselected!=0 && !_root.map.pois[poiselected].clean) {
1157                        _root.map.pois[poiselected].upload();
1158                }
1159                uploadDirtyRelations();
1160                markClean(true);
1161        };
1162       
1163        // highlightSquare
1164       
1165        function highlightSquare(sx,sy,ss) {
1166                _root.map.createEmptyMovieClip("highlight",5);
1167                _root.map.highlight._x=sx;
1168                _root.map.highlight._y=sy;
1169                _root.map.highlight.beginFill(0xFFFF00,80);
1170                _root.map.highlight.moveTo(-ss, ss);
1171                _root.map.highlight.lineTo( ss, ss);
1172                _root.map.highlight.lineTo( ss,-ss);
1173                _root.map.highlight.lineTo(-ss,-ss);
1174                _root.map.highlight.lineTo(-ss, ss);
1175                _root.map.highlight.endFill();
1176        };
1177
1178        // setIOStatus - update top-right message
1179
1180        function setIOStatus(msg) {
1181                if (_root.io==msg) { return; }
1182                _root.io=msg; var t;
1183                switch (msg) {
1184                        case 3: t=iText('hint_saving_loading'); break;
1185                        case 2: t=iText('hint_saving'); break;
1186                        case 1: t=iText('hint_loading'); break;
1187                }
1188                _root.waysloading.createTextField('prompt',2,0,0,195,20);
1189                with (_root.waysloading.prompt) { text=t; setTextFormat(plainRight); selectable=false; }
1190                if (_root.waysloading.prompt.textWidth>_root.waysloading.prompt._width) {
1191                        var d=_root.waysloading.prompt.textWidth-_root.waysloading.prompt._width;
1192                        _root.waysloading.prompt._width+=d;
1193                        _root.waysloading.prompt._x-=d;
1194                }
1195                _root.waysloading.createEmptyMovieClip('bg',1);
1196                with (_root.waysloading.bg) {
1197                        var d=_root.waysloading.prompt._width+20;
1198                        beginFill(0xFFFFFF,75);
1199                        moveTo(d,0); lineTo(d-_root.waysloading.prompt.textWidth-27,0);
1200                        lineTo(d-_root.waysloading.prompt.textWidth-27,_root.waysloading.prompt.textHeight+5);
1201                        lineTo(d,_root.waysloading.prompt.textHeight+5); lineTo(d,0);
1202                        endFill();
1203                }
1204                _root.waysloading._visible=true;
1205        }
1206
1207        // deepCopy (recursive) and shallowCopy (non-recursive)
1208
1209        function deepCopy(z) {
1210                var a;
1211                if (z.length==null) { a=new Object(); }
1212                                           else { a=new Array(); }
1213                for (var i in z) {
1214                        if (typeof(z[i])=='object') { a[i]=deepCopy(z[i]); }
1215                                                                   else { a[i]=z[i]; }
1216                }
1217                return a;
1218        };
1219
1220        function shallowCopy(z) {
1221                var a;
1222                if (z.length==null) { a=new Object(); }
1223                                           else { a=new Array(); }
1224                for (var i in z) { a[i]=z[i]; }
1225                return a;
1226        }
Note: See TracBrowser for help on using the repository browser.