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

Last change on this file since 34571 was 23171, checked in by richard, 9 years ago

remove NearMap? at their request

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