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

Last change on this file since 7133 was 7115, checked in by richard, 12 years ago

Potlatch 0.8 - be afraid, be very, very afraid

  • Property svn:executable set to *
File size: 33.9 KB
Line 
1
2        // =====================================================================================
3        // Initialise
4
5        // Site-specific URLs
6//      var apiurl='rubyamf.cgi';
7//      var gpsurl='/potlatch/getgps.cgi';
8//      var gpxurl='http://localhost:3000/trace/';
9//      var yahoourl='/~richard/potlatch/ymap.swf';
10//      var tileprefix='http://127.0.0.1/~richard/cgi-bin/proxy.cgi?url=';
11        var apiurl='../api/0.5/amf';
12        var gpsurl='../api/0.5/swf/trackpoints';
13        var gpxurl='http://www.openstreetmap.org/trace/';
14        var yahoourl='/potlatch/ymap2.swf';
15        var tileprefix='';
16
17        // Resizable window, disable right-click
18        Stage.showMenu = false;
19        Stage.align="TL";
20        Stage.scaleMode="noScale";
21        resizeListener=new Object();
22        resizeListener.onResize=function() { resizeWindow(); };
23        Stage.addListener(resizeListener);
24        var panelheight=110;
25       
26        // Master movieclip for map
27        _root.createEmptyMovieClip("map",10);
28        _root.map.setMask(_root.masksquare);
29
30        // Master movieclip for panel
31        _root.createEmptyMovieClip("panel",15);
32        _root.panel._x=0; _root.panel._y=500;
33        _root.panel.beginFill(0xF3F3F3,100);
34        _root.panel.moveTo(0,0); _root.panel.lineTo(3000,0);
35        _root.panel.lineTo(3000,panelheight); _root.panel.lineTo(0,panelheight);
36        _root.panel.lineTo(0,0);
37        _root.panel.endFill();
38
39        // Co-ordinates
40        // London 51.5,0; Weybridge 51.4,-0.5; Worcester 52.2,-2.25; Woodstock 51.85,-1.35
41        var minscale=12;                                // don't zoom out past this
42        var maxscale=19;                                // don't zoom in past this
43        var scale=Math.max(Math.min(Math.floor(scale),maxscale),minscale);
44        var masterscale=5825.4222222222;// master map scale - how many Flash pixels in 1 degree longitude
45                                                                        // (for Landsat, 5120)
46        updateCoords();                                 // get radius, scale
47       
48        var urllat  =Math.pow(lat ,1);  // LL from query string
49        var urllong =Math.pow(long,1);  //  |
50        var baselong=urllong-xradius/masterscale/bscale;                // this works!
51        var basey   =lat2y(urllat)+yradius/masterscale/bscale;  //  |
52        var baselat =y2lat(basey);                                                              //  |
53
54        // Preferences
55        preferences=SharedObject.getLocal("preferences");
56        var usertoken=token;
57        if (winie=='true' || winie==true) { winie=true; } else { winie=false; }
58
59        // Key listener - needs to be initialised before Yahoo
60        keyListener=new Object();
61        keyListener.onKeyDown=function() { keyPressed(); };
62        Key.addListener(keyListener);
63
64        // Initialise Yahoo
65        var ylat=baselat;       var lastylat=ylat;              // current Yahoo state
66        var ylon=baselong;      var lastylon=ylon;              //  |
67        var ywidth=0;           var yheight=0;                  //  |
68        var yzoom=8;            var lastyzoom=yzoom;    //  |
69        var bgxoffset=0;        var bgyoffset=0;                // manually correct Yahoo imagery
70        var yahooloaded=false;                                          // is Yahoo component loaded?
71        var yahooinited=false;                                          // is Yahoo component inited?
72        var yahoorightsize=true;                                        // do we need to resize Yahoo?
73        _root.createEmptyMovieClip("yahoo",7);
74
75//      var layernames=new Array("None","Aerial - OpenAerialMap","Aerial - Yahoo!","OSM - Mapnik","OSM - Osmarender","OSM - Maplint (errors)","OSM - cycle map");
76//      var layernums=new Array();
77//      var j=layernames.length; for (i in layernames) { j--; layernums[layernames[i]]=j; }
78
79        // Main initialisation
80        _root.map.createEmptyMovieClip("areas"    ,8);  var areadepth=1;
81        _root.map.createEmptyMovieClip("gpx"      ,9);
82        _root.map.createEmptyMovieClip("relations",10); var reldepth=1;
83        _root.map.createEmptyMovieClip("ways"     ,11); var waydepth=1;
84        _root.map.createEmptyMovieClip("pois"     ,12); var poidepth=1;
85        _root.map.createEmptyMovieClip("elastic"  ,5003); // elastic line
86        initTiles();                                    // create tile clips on layer 7
87
88        _root.masksquare.useHandCursor=false;
89        _root.masksquare.onPress   =function() { mapClick(); };
90        _root.masksquare.onRollOver=function() { mapRollOver(); };
91        _root.masksquare.onRollOut =function() { mapRollOut(); };
92        _root.masksquare.onRelease =function() { mapClickEnd(); };
93        _root.onMouseDown=function() { _root.lastkeypressed=-1; };
94
95        selectWay(0);                                   // way selected?    0 no, otherwise way id
96        var poiselected=0;                              // POI selected?    0 no, otherwise way id
97        var pointselected=-2;                   // point selected? -2 no, otherwise point order
98        var waycount=0;                                 // number of ways currently loaded
99        var waysrequested=0;                    // total number of ways requested
100        var waysreceived=0;                             // total number of ways received
101        var relcount=0;                                 // number of relations currently loaded
102        var relsrequested=0;                    // total number of relations requested
103        var relsreceived=0;                             // total number of relations received
104        var poicount=0;                                 // number of POIs currently loaded
105        var whichrequested=0;                   // total number of whichways requested
106        var whichreceived=0;                    // total number of whichways received
107        var lastwhichways=new Date();   // last time whichways was requested
108        var lastresize=new Date();              // last time window was resized
109        var dragmap=false;                              // map being dragged?
110        var drawpoint=-1;                               // point being drawn? -1 no, 0+ yes (point order)
111        var newrelid=-1;                                // new relation ID  (for those not yet saved)
112        var newwayid=-1;                                // new way ID           (for those not yet saved)
113        var newnodeid=-2;                               // new node ID          (for those not yet saved)
114        var newpoiid=-1;                                // new POI ID           (for those not yet saved)
115        var currentproptype='';                 // type of property currently being edited
116        var pointertype='';                             // current mouse pointer
117        var redopropertywindow=null;    // need to redraw property window after deletion?
118        var lastkeypressed=null;                // code of last key pressed
119        var keytarget='';                               // send keys where? ('','dialogue','key','value')
120        var basekeytarget='';                   // reset keytarget to what after editing key?
121        var tilesetloaded=-1;                   // which tileset is loaded?
122        var tolerance=4/Math.pow(2,_root.scale-13);
123        var bigedge_l=999999; var bigedge_r=-999999; // area of largest whichways
124        var bigedge_b=999999; var bigedge_t=-999999; //  |
125        var savedtype='';                               // no saved presets yet
126        var sandbox=false;                              // we're doing proper editing
127        var signature="Potlatch 0.8";   // current version
128
129//      if (layernums[preferences.data.baselayer]==undefined) { preferences.data.baselayer="Aerial - Yahoo!"; }
130        if (preferences.data.baselayer    ==undefined) { preferences.data.baselayer    =2; }    // show Yahoo?
131        if (preferences.data.dimbackground==undefined) { preferences.data.dimbackground=true; } // dim background?
132        if (preferences.data.custompointer==undefined) { preferences.data.custompointer=true; } // use custom pointers?
133
134        // =====================================================================================
135        // Icons
136
137        _root.attachMovie("zoomin","i_zoomin",30);
138        with (_root.i_zoomin) { _x=5; _y=5; };
139        _root.i_zoomin.onPress=function() { zoomIn(); };
140
141        _root.attachMovie("zoomout","i_zoomout",31);
142        with (_root.i_zoomout) { _x=5; _y=27; };
143        _root.i_zoomout.onPress=function() { zoomOut(); };
144        changeScaleTo(_root.scale);
145
146        _root.panel.attachMovie("scissors","i_scissors",32);
147        with (_root.panel.i_scissors) { _x=15; _y=93; };
148        _root.panel.i_scissors.onPress   =function() { _root.ws.splitWay(); };
149        _root.panel.i_scissors.onRollOver=function() { setFloater("Split way at selected point (X)"); };
150        _root.panel.i_scissors.onRollOut =function() { clearFloater(); };
151
152        _root.panel.attachMovie("gps","i_gps",36);
153        with (_root.panel.i_gps) { _x=65; _y=93; };
154        _root.panel.i_gps.onPress   =function() { loadGPS(); };
155        _root.panel.i_gps.onRollOver=function() { setFloater("Show GPS tracks (G)"); };
156        _root.panel.i_gps.onRollOut =function() { clearFloater(); };
157
158        _root.panel.attachMovie("prefs","i_prefs",37);
159        with (_root.panel.i_prefs) { _x=90; _y=93; };
160        _root.panel.i_prefs.onPress   =function() { openOptionsWindow(); };
161        _root.panel.i_prefs.onRollOver=function() { setFloater("Set options (choose the map background)"); };
162        _root.panel.i_prefs.onRollOut =function() { clearFloater(); };
163
164        _root.panel.attachMovie("newattr","i_newattr",33);
165        with (_root.panel.i_newattr) { _x=690; _y=95; };
166        _root.panel.i_newattr.onRelease =function() { _root.panel.properties.enterNewAttribute(); };
167        _root.panel.i_newattr.onRollOver=function() { setFloater("Add a new tag"); };
168        _root.panel.i_newattr.onRollOut =function() { clearFloater(); };
169
170        _root.panel.attachMovie("newrel","i_newrel",44);
171        with (_root.panel.i_newrel) { _x=690; _y=75; backgroundColor=0xDDBBBB; background=true;};
172        _root.panel.i_newrel.onRelease =function() { addToRelation(); };
173        _root.panel.i_newrel.onRollOver=function() { setFloater("Add to a relation"); };
174        _root.panel.i_newrel.onRollOut =function() { clearFloater(); };
175
176        _root.panel.attachMovie("repeatattr","i_repeatattr",34);
177        with (_root.panel.i_repeatattr) { _x=690; _y=55; };
178        _root.panel.i_repeatattr.onPress=function() { _root.panel.properties.repeatAttributes(); };
179        _root.panel.i_repeatattr.onRollOver=function() { setFloater("Repeat tags from the previously selected way (R)"); };
180        _root.panel.i_repeatattr.onRollOut =function() { clearFloater(); };
181
182//      _root.panel.attachMovie("nextattr","i_nextattr",42);
183//      with (_root.panel.i_nextattr) { _x=690; _y=25; };
184//      _root.panel.i_nextattr.onRelease =function() { advancePropertyWindow(); };
185//      _root.panel.i_nextattr.onRollOver=function() { setFloater("Next page of tags"); };
186//      _root.panel.i_nextattr.onRollOut =function() { clearFloater(); };
187
188        _root.panel.attachMovie("exclamation","i_warning",35);
189        with (_root.panel.i_warning) { _x=10; _y=45; _visible=false; };
190        _root.panel.i_warning.onPress=function() { handleWarning(); };
191        _root.panel.i_warning.onRollOver=function() { setFloater("An error occurred - click for details"); };
192        _root.panel.i_warning.onRollOut =function() { clearFloater(); };
193        wflashid=setInterval(function() { _root.panel.i_warning._alpha=150-_root.panel.i_warning._alpha; }, 750);
194
195        _root.panel.attachMovie("rotation","i_direction",39);
196        with (_root.panel.i_direction) { _x=40; _y=93; _rotation=-45; _visible=true; _alpha=50; };
197        _root.panel.i_direction.onPress=function() { _root.ws.reverseWay(); };
198        _root.panel.i_direction.onRollOver=function() { setFloater("Direction of way - click to reverse"); };
199        _root.panel.i_direction.onRollOut =function() { clearFloater(); };
200
201        _root.panel.attachMovie("roundabout","i_circular",40);
202        with (_root.panel.i_circular) { _x=40; _y=93; _rotation=-45; _visible=false; };
203        _root.panel.i_circular.onRollOver=function() { setFloater("Circular way"); };
204        _root.panel.i_circular.onRollOut =function() { clearFloater(); };
205
206        _root.panel.attachMovie("padlock","padlock",41);
207        with (_root.panel.padlock) { _y=32; _visible=false; };
208        _root.panel.padlock.onPress=function() {
209                if (_root.wayselected) {
210                        if (_root.ws.path.length>200) {
211                                setTooltip("too long to unlock:\nplease split into\nshorter ways");
212                        } else {
213                                _root.ws.locked=false;
214                                _root.ws.clean=false;
215                                _root.ws.redraw();
216                                _root.panel.padlock._visible=false;
217                                markClean(false);
218                        }
219                } else if (_root.poiselected) {
220                        _root.map.pois[poiselected].locked=false;
221                        _root.map.pois[poiselected].clean=false;
222//                      _root.map.pois[poiselected].recolour();
223                        _root.panel.padlock._visible=false;
224                        markClean(false);
225                }
226        };
227
228        _root.createEmptyMovieClip("pointers",90000);
229        _root.pointers.attachMovie("penso"  ,"penso"  ,1); _root.pointers.penso._visible=false;
230        _root.pointers.attachMovie("penx"   ,"penx"   ,2); _root.pointers.penx._visible=false;
231        _root.pointers.attachMovie("peno"   ,"peno"   ,3); _root.pointers.peno._visible=false;
232        _root.pointers.attachMovie("penplus","penplus",5); _root.pointers.penplus._visible=false;
233        _root.pointers.attachMovie("pen"    ,"pen"    ,6); _root.pointers.pen._visible=false;
234        _root.pointers.attachMovie("hand"   ,"hand"   ,7); _root.pointers.hand._visible=false;
235
236
237        // =====================================================================================
238        // Initialise text areas
239
240        // Debug text fields
241
242        _root.createTextField('chat',20,130,315,400,80); // 515
243        with (_root.chat) {
244                multiline=true; wordWrap=true;  border=true; selectable = true; type = 'input';
245                _visible=false;//#debug
246        };
247
248        _root.createTextField('coordmonitor',21,130,400,400,60); // 515
249        with (_root.coordmonitor) {
250                multiline=true; wordWrap=true; border=true; selectable = true; type = 'input';
251                _visible=false;//#debug
252        };
253
254        _root.createTextField('floater',0xFFFFFF,15,30,200,18);
255        with (floater) {
256                background=true; backgroundColor=0xFFEEEE;
257                border=true; borderColor=0xAAAAAA;
258                selectable=false; _visible=false;
259        }
260        var floaterID=null;
261
262        // Centre cross-hair
263       
264        if (_root.chat._visible) {
265                _root.createEmptyMovieClip("crosshair",0xFFFFF0);
266                with (_root.crosshair) {
267                        _x=Stage.width/2;
268                        _y=(Stage.height-panelheight)/2;
269                        lineStyle(1,0xFFFFFF,100);
270                        moveTo(-2,0); lineTo(-10,0);
271                        moveTo( 2,0); lineTo( 10,0);
272                        moveTo(0,-2); lineTo(0,-10);
273                        moveTo(0, 2); lineTo(0, 10);
274                }
275        }
276
277// for (i in layernames) { _root.chat.text+=i+"="+layernames[i]+","; }
278// for (i in layernums ) { _root.chat.text+=i+"="+layernums[i]+","; }
279
280        // Text formats
281       
282        plainText =new TextFormat(); plainText.color =0x000000; plainText.size =14; plainText.font ="_sans";
283        plainSmall=new TextFormat(); plainSmall.color=0x000000; plainSmall.size=12; plainSmall.font="_sans";
284        plainTiny =new TextFormat(); plainTiny.color =0x000000; plainTiny.size =11; plainTiny.font ="_sans";
285        plainWhite=new TextFormat(); plainWhite.color=0xFFFFFF; plainWhite.size=12; plainWhite.font="_sans";
286        greySmall =new TextFormat(); greySmall.color =0x888888; greySmall.size =12; greySmall.font ="_sans";
287        boldText  =new TextFormat(); boldText.color  =0x000000; boldText.size  =14; boldText.font  ="_sans"; boldText.bold =true;
288        boldSmall =new TextFormat(); boldSmall.color =0x000000; boldSmall.size =12; boldSmall.font ="_sans"; boldSmall.bold=true;
289        boldWhite =new TextFormat(); boldWhite.color =0xFFFFFF; boldWhite.size =12; boldWhite.font ="_sans"; boldWhite.bold=true;
290        menu_on   =new TextFormat(); menu_on.color   =0x000000; menu_on.size   =12; menu_on.font   ="_sans"; menu_on.bold  =true;
291        menu_off  =new TextFormat(); menu_off.color  =0xFFFFFF; menu_off.size  =12; menu_off.font  ="_sans"; menu_off.bold =true;
292        auto_on   =new TextFormat(); auto_on.color   =0x0000FF; auto_on.size   =12; auto_on.font   ="_sans"; auto_on.bold  =true;
293        auto_off  =new TextFormat(); auto_off.color  =0xFFFFFF; auto_off.size  =12; auto_off.font  ="_sans"; auto_off.bold =true;
294
295        // Text fields
296
297//      populatePropertyWindow('');     
298
299        _root.createTextField('waysloading',22,580,5,150,20);
300        with (_root.waysloading) { text="loading ways"; setTextFormat(plainSmall); type='dynamic'; _visible=false; };
301
302        _root.createTextField('tooltip',46,580,25,150,100);
303        with (_root.tooltip  ) { text=""; setTextFormat(plainSmall); selectable=false; type='dynamic'; };
304
305        _root.panel.createTextField('t_type',23,5,5,220,20);
306        with (_root.panel.t_type         ) { text="Welcome to OpenStreetMap"; setTextFormat(boldText); };
307       
308        _root.panel.createTextField('t_details',24,5,23,220,20);
309        with (_root.panel.t_details) { text=signature; setTextFormat(plainText); };
310       
311//      // TextField listener
312//      textfieldListener=new Object();
313//      textfieldListener.onChanged=function() { textChanged(); };
314
315        // MovieClip loader
316        var tileLoader=new MovieClipLoader();
317        tileListener=new Object();
318        tileLoader.addListener(tileListener);
319
320        // Interaction with responder script
321        var loaderWaiting=false;
322
323        remote=new NetConnection();
324        remote.connect(apiurl);
325        remote.onStatus=function(info) { 
326                _root.panel.i_warning._visible=true;
327        };
328
329        preresponder = function() { };
330        preresponder.onResult = function(result) {
331                _root.presets=result[0];
332                _root.presetmenus=result[1];
333                _root.presetnames=result[2];
334                _root.colours=result[3];
335                _root.casing=result[4];
336                _root.areas=result[5];
337                _root.autotags=result[6];
338                _root.relcolours=result[7];
339                _root.relalphas=result[8];
340                _root.relwidths=result[9];
341//              _root.presetselected='road'; setPresetIcon(presetselected);
342                _root.panel.i_preset._visible=false;
343        };
344        remote.call('getpresets',preresponder);
345
346        #include 'anchorpoint.as'
347        #include 'poi.as'
348        #include 'relation.as'
349        #include 'way.as'
350        #include 'history.as'
351        #include 'ui.as'
352        #include 'properties.as'
353        #include 'world.as'
354        #include 'tiles.as'
355        #include 'gps.as'
356
357        // =====================================================================================
358        // Start
359
360        if (gpx) { parseGPX(gpx); }                     // Parse GPX if supplied
361
362        _root.panel.attachMovie("propwindow","properties",50);
363        with (_root.panel.properties) { _x=110; _y=25; };
364
365        _root.panel.attachMovie("presetmenu","presets",60);
366        with (_root.panel.presets) { _x=110; _y=1; };
367
368//      _root.panel.attachMovie("menu","presetmenu",60);
369//      _root.panel.presetmenu.init(141,5,1,presetnames['way'][presetselected],'Choose from a menu of preset tags describing the way',setAttributesFromPreset,151);
370//      _root.panel.presetmenu._visible=false;
371
372        updateButtons();
373        updateScissors();
374        resizeWindow();
375        updateCoords(0,0);
376        setBackground(preferences.data.baselayer);
377        whichWays();
378        _root.onEnterFrame=function() { everyFrame(); };
379
380        // Welcome buttons
381
382        _root.panel.createEmptyMovieClip("welcome",61);
383
384        _root.panel.welcome.createEmptyMovieClip("start",1);
385        drawButton(_root.panel.welcome.start,250,7,"Start","Start mapping with OpenStreetMap.");
386        _root.panel.welcome.start.onPress=function() { removeMovieClip(_root.panel.welcome); };
387
388        _root.panel.welcome.createEmptyMovieClip("play",2);
389        drawButton(_root.panel.welcome.play,250,29,"Play","Practice mapping - your changes won't be saved.");
390        _root.panel.welcome.play.onPress=function() {
391                _root.sandbox=true; removeMovieClip(_root.panel.welcome);
392                _root.createEmptyMovieClip("practice",62);
393                with (_root.practice) {
394                        _x=Stage.width-97; _y=Stage.height-panelheight-22; beginFill(0xFF0000,100);
395                        moveTo(0,0); lineTo(90,0); lineTo(90,17);
396                        lineTo(0,17); lineTo(0,0); endFill();
397                };
398                _root.practice.createTextField("btext",1,0,0,90,20);
399                with (_root.practice.btext) {
400                        text="Practice mode";
401                        setTextFormat(boldWhite);
402                        selectable=false; type='dynamic';
403                };
404        };
405
406        _root.panel.welcome.createEmptyMovieClip("help",3);
407        drawButton(_root.panel.welcome.help,250,51,"Help","Find out how to use Potlatch, this map editor.");
408        _root.panel.welcome.help.onPress=function() { getUrl("http://wiki.openstreetmap.org/index.php/Potlatch","_blank"); };
409
410        if (gpx) {
411                _root.panel.welcome.createEmptyMovieClip("convert",4);
412                drawButton(_root.panel.welcome.convert,250,73,"Track","Convert your GPS track to (locked) ways for editing.");
413                _root.panel.welcome.convert.onPress=function() { removeMovieClip(_root.panel.welcome); gpxToWays(); };
414        }
415
416        // =====================================================================
417        // Map support functions
418        // mapRollOver/Out - user has rolled over/out the main map area
419       
420        function mapRollOver() {
421                removeMovieClip(_root.map.anchorhints);
422                if (_root.tooltip.text.substring(0,4)=='over') { clearTooltip(); }
423                if (_root.drawpoint>-1)     { setPointer('pen'); }
424                else if (_root.wayselected) { setPointer(''   ); }
425                                                       else { setPointer('pen'); }
426        }
427
428        function mapRollOut() {
429                if (_root.pointertype!='')  { setPointer(''   ); }
430        }
431       
432        // processMapDrag, moveMap - process map dragging
433
434        function processMapDrag() {
435                if (Math.abs(_root.firstxmouse-_root._xmouse)>(tolerance*4) ||
436                        Math.abs(_root.firstymouse-_root._ymouse)>(tolerance*4) ||
437                        Key.isDown(Key.SPACE)) {
438                        if (_root.pointertype!='hand') { setPointer('hand'); }
439
440                        if (_root.yahoo._visible) {
441                                var t=new Date();
442                                if ((t.getTime()-yahootime.getTime())<500) {
443                                        _root.yahoo._x+=Math.floor(_xmouse-lastxmouse); // less than 0.5s, so
444                                        _root.yahoo._y+=Math.floor(_ymouse-lastymouse); // just move offset
445                                } else {
446                                        redrawBackground();                                                             // 0.5s elapsed, so
447                                        _root.yahootime=new Date();                                             // request new tiles
448                                }
449                        } else if (preferences.data.baselayer) {
450                                redrawBackground();
451                        }
452                        moveMap(Math.floor(_xmouse-lastxmouse),Math.floor(_ymouse-lastymouse));
453                }
454        }
455
456        function endMapDrag() {
457//              _root.map.onMouseMove=function() {};
458//              _root.map.onMouseUp  =function() {};
459                _root.onMouseMove=function() {};
460                _root.onMouseUp  =function() {};
461                if (Math.abs(_root.firstxmouse-_root._xmouse)>tolerance*4 ||
462                        Math.abs(_root.firstymouse-_root._ymouse)>tolerance*4) {
463                        redrawBackground();
464                        updateLinks();
465                        whichWays();
466                }
467                restartElastic();
468                _root.dragmap=false;
469                if (_root.wayselected) { setPointer(''); }
470                                                  else { setPointer('pen'); }
471        }
472       
473        function moveMap(xdiff,ydiff) {
474                _root.lastxmouse=_root._xmouse;
475                _root.lastymouse=_root._ymouse;
476                if (Key.isDown(Key.SPACE)) {
477                        _root.bgxoffset+=xdiff; _root.map.tiles._x+=xdiff;
478                        _root.bgyoffset+=ydiff; _root.map.tiles._y+=ydiff;
479                        updateCoords(_root.map._x,_root.map._y);
480                } else {
481                        _root.map._x+=xdiff;
482                        _root.map._y+=ydiff;
483                        updateCoords(_root.map._x,_root.map._y);
484                }
485        }
486
487        // mapClick - user has clicked within map area, so start drag
488       
489        function mapClick() {
490                setPointer('pen');
491                clearTooltip();
492//              _root.map.onMouseMove=function() { processMapDrag(); };
493//              _root.map.onMouseUp  =function() { endMapDrag(); };
494                _root.onMouseMove=function() { processMapDrag(); };
495                _root.onMouseUp  =function() { endMapDrag(); };
496                _root.dragmap=true;
497                _root.lastxmouse=_root._xmouse;
498                _root.lastymouse=_root._ymouse;
499                _root.firstxmouse=_root._xmouse;
500                _root.firstymouse=_root._ymouse;
501                _root.clicktime=new Date();
502                _root.yahootime=new Date();
503        }
504
505        // mapClickEnd - end of click within map area
506
507        function mapClickEnd() {
508
509                // Clicked on map without dragging
510                if (Math.abs(_root.firstxmouse-_root._xmouse)<(tolerance*4) &&
511                        Math.abs(_root.firstymouse-_root._ymouse)<(tolerance*4)) {
512                        _root.dragmap=false;
513                        // Adding a point to the way being drawn
514                        if (_root.drawpoint>-1) {
515                                _root.newnodeid--;
516                                if (_root.pointselected>-2) {
517                                        setTypeText("Way",_root.wayselected);
518                                        _root.panel.properties.init('way',getPanelColumns(),4);
519                                        updateButtons();
520                                        updateScissors(false);
521                                }
522                                addEndPoint(_root.map._xmouse,_root.map._ymouse,newnodeid);
523                                restartElastic();
524
525                        // Deselecting a way
526                        } else if (_root.wayselected) {
527                                uploadSelected(); deselectAll();
528
529                        // Deselecting a POI
530                        } else if (_root.poiselected) {
531                                uploadSelected(); deselectAll();
532
533                        // Starting a new way
534                        } else {
535                                _root.newnodeid--; startNewWay(_root.map._xmouse,_root.map._ymouse,_root.newnodeid);
536                        }
537                }
538        }
539
540
541
542        // =====================================================================
543        // Tooltip and pointer functions
544
545        function setTooltip(txt,delay) {
546                _root.tooltip.text=txt;
547                _root.tooltip.setTextFormat(plainSmall);
548                _root.createEmptyMovieClip('ttbackground',45,580,25,150,100);
549                // draw a white box at the relevant size, _alpha=50
550                // _root.ttbackground.color=0xFFFFFF;
551                // _root.ttbackground._alpha=50;
552        }
553
554        function clearTooltip() {
555                _root.tooltip.text='';
556                removeMovieClip(_root.ttbackground);
557        }
558       
559        function setFloater(txt) {
560                with (_root.floater) {
561                        text=txt;
562                        setTextFormat(plainSmall); 
563                        _width=textWidth+4;
564
565                        if (_root._ymouse+25<Stage.height      ) { _y=_root._ymouse+4;                   }
566                                                                                                else { _y=_root._ymouse-16;          }
567                        if (_root._xmouse+textWidth<Stage.width) { _x=_root._xmouse+4;                   }
568                                                                                                else { _x=_root._xmouse-textWidth-8; }
569                        _visible=false;
570                }
571                clearInterval(floaterID);
572                floaterID=setInterval(unveilFloater,1000);
573        }
574
575        function unveilFloater(txt) {
576                _root.floater._visible=true;
577                clearInterval(floaterID);
578        }
579       
580        function clearFloater(txt) {
581                clearInterval(floaterID);
582                _root.floater._visible=false;
583        }
584
585        function setPointer(ptype) {
586                if (_root.pointertype==ptype) { return; }
587                _root.pointers[_root.pointertype]._visible=false;
588                if ((ptype) && preferences.data.custompointer) {
589                        _root.pointers[ptype]._x=_root._xmouse;
590                        _root.pointers[ptype]._y=_root._ymouse;
591                        _root.pointers[ptype].startDrag(true);
592                        _root.pointers[ptype]._visible=true;
593                        Mouse.hide();
594                } else {
595                        _root.pointers[_root.pointertype].stopDrag();
596                        Mouse.show();
597                }
598                _root.pointertype=ptype;
599        }
600
601       
602
603
604
605        // =====================================================================================
606        // Keypress functions
607
608        // keyPressed                           - key listener
609
610        function keyPressed() {
611                var k=Key.getCode();
612                _root.lastkeypressed=k;
613
614                switch (keytarget) {
615                        case 'keyname':  ;
616                        case 'value':    if (_root.auto!=undefined) { _root.auto.keyRespond(k); }
617                                                         else if (k==13) { autoEnter(); }
618                                                         return; break;
619                        case 'dialogue': if (k==187 && _root.modal.box.properties!=undefined) {
620                                                                _root.modal.box.properties.enterNewAttribute();
621                                                         };
622                                                         return; break;
623                        case '':                 break;
624                        default:                 return; break;
625                }
626
627                if (k>48 && k<58 && (wayselected!=0 || poiselected!=0)) {
628                        if (presetnames[_root.panel.properties.proptype][_root.panel.presets.group][k-48]!=null) {
629                                _root.panel.presets.setAttributes(k-48);
630                                _root.panel.presets.reflect();
631                                if (_root.panel.properties.proptype=='way') { _root.ws.redraw(); }
632                        }
633                        return;
634                } else if (k>=112 && k<=118) {
635                        preferences.data.dimbackground=Key.isDown(Key.SHIFT); 
636                        setBackground(k-112);
637                        return;
638                }
639
640                switch (k) {
641                        case 46:                ;                                                                                                       // DELETE/backspace - delete way -- ode
642                        case 8:                 if (Key.isDown(Key.SHIFT)) {                                            //  |
643                                                                if (_root.wayselected!=0) { _root.ws.remove(); }
644                                                        } else { keyDelete(1); }; break;                                        //  |
645                        case 13:                stopDrawing(); break;                                                           // ENTER - stop drawing line
646                        case 27:                keyRevert(); break;                                                                     // ESCAPE - revert current way
647                        case 71:                loadGPS(); break;                                                                       // G - load GPS
648                        case 72:                if (_root.wayselected>0) { wayHistory(); }; break;      // H - way history
649                        case 82:                _root.panel.properties.repeatAttributes(); break;                                                       // R - repeat attributes
650                        case 85:                getDeleted(); break;                                                            // U - undelete
651                        case 88:                _root.ws.splitWay(); break;                                                     // X - split way
652                        case Key.PGUP:  zoomIn(); break;                                                                        // Page Up - zoom in
653                        case Key.PGDN:  zoomOut(); break;                                                                       // Page Down - zoom out
654                        case Key.LEFT:  moveMap( 140,0); updateLinks(); redrawBackground(); whichWays(); break; // cursor keys
655                        case Key.RIGHT: moveMap(-140,0); updateLinks(); redrawBackground(); whichWays(); break; //  |
656                        case Key.DOWN:  moveMap(0,-100); updateLinks(); redrawBackground(); whichWays(); break; //  |
657                        case Key.UP:    moveMap(0, 100); updateLinks(); redrawBackground(); whichWays(); break; //  |
658                        case 167:               _root.panel.presets.cycleIcon(); break;                         // '¤' - cycle presets
659                        case 187:               _root.panel.properties.enterNewAttribute(); break;      // '+' - add new attribute
660                        case 189:               keyDelete(0); break;                                                            // '-' - delete node from this way only
661                        case 192:               cycleStacked(); break;                                                          // '`' - cycle between stacked ways
662                        case 76:                showPosition(); break;                                                          // L - show latitude/longitude
663                        // default:             _root.chat.text=Key.getCode()+" pressed";
664                };
665        }
666
667        function showPosition() { setTooltip("lat "+Math.floor(coord2lat (_root.map._ymouse)*10000)/10000
668                                                                          +"\nlon "+Math.floor(coord2long(_root.map._xmouse)*10000)/10000,0); }
669        function startCount()   { z=new Date(); _root.startTime=z.getTime(); }
670        function endCount(id)   { z=new Date(); zz=Math.floor((z.getTime()-_root.startTime)*100);
671                                                        if (zz>100) { _root.chat.text+=id+":"+zz+";"; } }
672
673        function keyDelete(doall) {
674                if (_root.poiselected) {
675                        // delete POI
676                        _root.map.pois[poiselected].remove();
677                } else if (_root.drawpoint>-1) {
678                        // delete most recently drawn point
679                        if (_root.drawpoint==0) { _root.ws.path.shift(); }
680                                                           else { _root.ws.path.pop(); _root.drawpoint-=1; }
681                        if (_root.ws.path.length) {
682                                _root.ws.clean=false;
683                                markClean(false);
684                                _root.ws.redraw();
685                                _root.ws.highlightPoints(5000,"anchor");
686                                _root.ws.highlight();
687                                restartElastic();
688                        } else {
689                                _root.map.anchors[_root.drawpoint].endElastic();
690                                _root.ws.remove();
691                                _root.drawpoint=-1;
692                        }
693                } else if (_root.pointselected>-2) {
694                        // delete selected point
695                        if (doall==1) {
696                                // remove node from all ways
697                                id=_root.ws.path[_root.pointselected][2];
698                                for (qway in _root.map.ways) {
699                                        qdirty=0;
700                                        for (qs=0; qs<_root.map.ways[qway]["path"].length; qs+=1) {
701                                                if (_root.map.ways[qway].path[qs][2]==id) {
702                                                        _root.map.ways[qway].path.splice(qs,1);
703                                                        qdirty=1;
704                                                }
705                                        }
706                                        if (qdirty && _root.map.ways[qway]["path"].length<2) {
707                                                _root.map.ways[qway].remove();
708                                        } else if (qdirty) {
709                                                _root.map.ways[qway].redraw();
710                                                _root.map.ways[qway].clean=false;
711                                        }
712                                }
713                        } else {
714                                // remove node from this way only
715                                _root.ws.path.splice(pointselected,1);
716                                if (_root.ws.path.length<2) {
717                                        _root.ws.remove();
718                                } else {
719                                        _root.ws.redraw();
720                                        _root.ws.clean=false;
721                                }
722                        }
723                        _root.pointselected=-2;
724                        _root.drawpoint=-1;
725                        _root.map.elastic.clear();
726                        clearTooltip();
727                        markClean(false);
728                        if (_root.wayselected) {
729                                _root.ws.select();
730                        }
731                }
732        };
733
734        function keyRevert() {
735                if              (_root.wayselected<0) { stopDrawing();
736                                                                                removeMovieClip(_root.map.areas[wayselected]);
737                                                                                removeMovieClip(_root.ws); }
738                else if (_root.wayselected>0) { stopDrawing();
739                                                                                _root.ws.reload(); }
740                else if (_root.poiselected>0) { _root.map.pois[poiselected].reload(); }
741                else if (_root.poiselected<0) { removeMovieClip(_root.map.pois[poiselected]); }
742                revertDirtyRelations();
743                deselectAll();
744        };
745
746
747
748        // =====================================================================
749        // Potlatch-specific UI functions
750       
751        function writeText(obj,t) {
752                with (obj) {
753                        text=t; wordWrap=true;
754                        setTextFormat(plainSmall);
755                        selectable=false; type='dynamic';
756                }
757        }
758
759        function handleError(code,result) {
760                var h=100;
761                if (code==-1) { error=result[0]; }
762                                 else { error=result[0]+"\n\nPlease e-mail richard\@systemeD.net with a bug report, saying what you were doing at the time."; h+=50; }
763                createModalDialogue(275,h,new Array('Ok'),null);
764                _root.modal.box.createTextField("prompt",2,7,9,250,h-30);
765                writeText(_root.modal.box.prompt,error);
766        }
767
768        function handleWarning() {
769                createModalDialogue(275,130,new Array('Retry','Cancel'),handleWarningAction);
770                _root.modal.box.createTextField("prompt",2,7,9,250,100);
771                writeText(_root.modal.box.prompt,"Sorry - the connection to the OpenStreetMap server failed. Any recent changes have not been saved.\n\nWould you like to try again?");
772        };
773
774        function handleWarningAction(choice) {
775                if (choice=='Retry') {
776                        // loop through all ways which are uploading, and reupload
777                        _root.panel.i_warning._visible=false;
778                        for (qway in _root.map.ways) {
779                                if (_root.map.ways[qway].uploading) {
780                                        _root.map.ways[qway].uploading=false;
781                                        _root.map.ways[qway].upload();
782                                }
783                        }
784                }
785        };
786
787
788
789        // =====================================================================
790        // General support functions
791
792        // everyFrame() - called onEnterFrame
793
794        function everyFrame() {
795
796                // ---- Fix Yahoo! peculiarities
797                _root.yahoo.myMap.enableKeyboardShortcuts(false);
798                if (preferences.data.baselayer==2) {
799                        var t=0;
800                        for (i in _root.yahoo.myMap.map["map_"+(18-_root.scale)].mc) {
801                                t+=_root.yahoo.myMap.map["map_"+(18-_root.scale)].mc[i][i].getBytesTotal();
802                        }
803                        _root.yahoo._visible=(t>124000);        // 122850=all blank
804                }
805
806                if (_root.yahoo.myMap.config.isLoaded) {
807                        if (!_root.yahooinited) {
808                                _root.yahooinited=true;
809                                _root.yahooresizer=setInterval(resizeWindow,1000);
810                                setYahooSize();
811                        } else if (!_root.yahoorightsize) {
812                                _root.yahoorightsize=true;
813                                _root.yahooresizer=setInterval(resizeWindow,1000);
814                        }
815                }
816
817                // ---- Do we need to redraw the property window?
818                if (_root.redopropertywindow) {
819                        _root.redopropertywindow.reinit();
820                        _root.redopropertywindow=0;
821                }
822
823                // ---- If resizing has stopped, issue new whichways
824                //              and resize panel
825                var t=new Date();
826                if ((t.getTime()-lastresize.getTime())>500) {
827                        if (lastresize.getTime()>lastwhichways.getTime()) {
828                                whichWays();
829                        }
830                }
831
832                // ---- Control "loading ways" display
833                _root.waysloading._visible=(_root.waysrequested!=_root.waysreceived) || (_root.whichrequested!=_root.whichreceived);
834
835                // ---- Service tile queue
836                if (preferences.data.baselayer!=0 &&
837                        preferences.data.baselayer!=2 ) { serviceTileQueue(); }
838                       
839                // ---- Reinstate focus if lost after click event
840                if (_root.reinstatefocus) {
841_root.coordmonitor.text+="!";
842                        Selection.setFocus(_root.reinstatefocus); 
843                        _root.reinstatefocus=null;
844                }
845        }
846       
847
848        // Options window
849       
850        function openOptionsWindow() {
851                createModalDialogue(250,110,new Array('Ok'),function() { preferences.flush(); } );
852                _root.modal.box.createTextField("prompt1",2,7,9,80,20);
853                writeText(_root.modal.box.prompt1,"Background:");
854
855                _root.modal.box.attachMovie("menu","background",6);
856                _root.modal.box.background.init(87,10,preferences.data.baselayer,
857                        new Array("None","Aerial - OpenAerialMap","Aerial - Yahoo!","OSM - Mapnik","OSM - Osmarender","OSM - Maplint (errors)","OSM - cycle map","Out of copyright map"),
858                        'Choose the background to display',setBackground,null,0);
859
860                _root.modal.box.attachMovie("checkbox","pointer",5);
861                _root.modal.box.pointer.init(10,40,"Fade background",preferences.data.dimbackground,function(n) { preferences.data.dimbackground=n; redrawBackground(); });
862
863                _root.modal.box.attachMovie("checkbox","pointer",4);
864                _root.modal.box.pointer.init(10,60,"Use pen and hand pointers",preferences.data.custompointer,function(n) { preferences.data.custompointer=n; });
865        }
866       
867        // markClean - set JavaScript variable for alert when leaving page
868
869        function markClean(a) {
870                if (!_root.sandbox) {
871                        if (winie) { // _root.chat._visible=true; fscommand("changesaved",a);
872                                           }
873                                  else { getURL("javascript:var changesaved="+a); }
874                }
875        }
876       
877        // deselectAll
878
879        function deselectAll() {
880                _root.map.createEmptyMovieClip("anchors",5000); 
881                removeMovieClip(_root.map.highlight);
882                _root.panel.i_circular._visible=false;
883                _root.panel.i_direction._visible=true;
884                _root.panel.i_direction._alpha=50;
885                clearTooltip();
886                setTypeText("","");
887
888                _root.panel.properties.init('');
889                _root.panel.presets.hide();
890                updateButtons();
891                updateScissors(false);
892                poiselected=0;
893                pointselected=-2;
894                selectWay(0);
895                markClean(true);
896        };
897       
898        // uploadSelected
899       
900        function uploadSelected() {
901                if (_root.wayselected!=0 && !_root.ws.clean) {
902                        for (qway in _root.map.ways) {
903                                if (!_root.map.ways[qway].clean) {
904                                        _root.map.ways[qway].upload();
905                                }
906                        }
907                }
908                if (_root.poiselected!=0 && !_root.map.pois[poiselected].clean) {
909                        _root.map.pois[poiselected].upload();
910                }
911                uploadDirtyRelations();
912        };
913
914        // highlightSquare
915       
916        function highlightSquare(sx,sy,ss) {
917                _root.map.createEmptyMovieClip("highlight",5);
918                _root.map.highlight._x=sx;
919                _root.map.highlight._y=sy;
920                _root.map.highlight.beginFill(0xFFFF00,80);
921                _root.map.highlight.moveTo(-ss, ss);
922                _root.map.highlight.lineTo( ss, ss);
923                _root.map.highlight.lineTo( ss,-ss);
924                _root.map.highlight.lineTo(-ss,-ss);
925                _root.map.highlight.lineTo(-ss, ss);
926                _root.map.highlight.endFill();
927        };
Note: See TracBrowser for help on using the repository browser.