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

Last change on this file since 19967 was 19965, checked in by richard, 10 years ago

bunch of join/unjoin fixes

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