source: subversion/applications/editors/potlatch/offline.as @ 16865

Last change on this file since 16865 was 16865, checked in by richard, 11 years ago

Potlatch 1.2

  • Property svn:executable set to *
File size: 7.2 KB
Line 
1
2        // =====================================================================================
3        // Offline upload
4
5        // uploadtasks is an array of: [function,hash of IDs]
6        // (each function returns a text comment)
7
8        // -------------------------------------------------------------------------------------
9        // prepareUpload
10        // creates upload task list
11
12        function prepareUpload() {
13                var todo;
14                if (!_root.sandbox) { return; }
15                if (_root.uploading) { return; }
16                deselectAll();
17
18                _root.uploadtasks=new Array();
19
20                // Assemble POIs
21                var poi=new Object(); todo=0;
22                for (var id in _root.map.pois) {
23                        if (!_root.map.pois[id].clean && !_root.map.pois[id].locked) {
24                                poi[id]=true; todo++;
25                                if (todo==5) { uploadtasks.push([uploadPOIs,poi]); poi=new Object(); todo=0; }
26                        }
27                }
28                if (todo>0) { uploadtasks.push([uploadPOIs,poi]); }
29               
30                // Assemble ways
31                var way=new Object(); todo=0;
32                for (var id in _root.map.ways) {
33                        if (!_root.map.ways[id].clean && !_root.map.ways[id].locked) {
34                                way[id]=true; todo++;
35                                if (todo==5) { uploadtasks.push([uploadWays,way]); way=new Object(); todo=0; }
36                        }
37                }
38                if (todo>0) { uploadtasks.push([uploadWays,way]); }
39               
40                // Assemble relations
41                var rel=new Object(); todo=0;
42                for (var id in _root.map.relations) {
43                        if (!_root.map.relations[id].clean && !_root.map.relations[id].locked) {
44                                rel[id]=true; todo++;
45                                if (todo==5) { uploadtasks.push([uploadRelations,rel]); rel=new Object(); todo=0; }
46                        }
47                }
48                if (todo>0) { uploadtasks.push([uploadRelations,rel]); }
49
50                // Assemble ways to delete
51                var z=_root.waystodelete; todo=false;
52                for (var id in z) { todo=true; }
53                if (todo) { uploadtasks.push([uploadDeletedWays,deepCopy(_root.waystodelete)]); }
54
55                // Assemble POIs to delete
56                var z=_root.poistodelete; todo=false;
57                for (var id in z) { todo=true; }
58                if (todo) { uploadtasks.push([uploadDeletedPOIs,deepCopy(_root.poistodelete)]); }
59
60                // Check there's something to do
61                if (uploadtasks.length==0) { 
62                    setAdvice(true,iText("Nothing to upload",'advice_uploadempty'));
63                        return;
64                }
65               
66                // Ask for changeset comment if not already created
67                if (_root.changeset) { if (!renewChangeset()) { startUpload(); } } 
68                                else { changesetRequest(iText("Save changes",'prompt_savechanges'),completeClose,''); }
69        }
70
71        // -------------------------------------------------------------------------------------
72        // startUpload
73        // 'Save' button pressed, so set up screen progress display and begin upload
74
75        function startUpload() {
76            _root.uploading=true;
77
78                _root.windows.attachMovie("modal","upload",++windowdepth);
79                _root.windows.upload.init(200,250,[iText('Cancel','cancel')],abortUpload);
80
81        box=_root.windows.upload.box;
82                box.createTextField("title",10,7,7,280,20);
83                box.title.text = iText("Uploading...","uploading");
84                with (box.title) { setTextFormat(boldText); selectable=false; type='dynamic'; }
85
86        box.createTextField("progress",11,10,40,180,170);
87        with (box.progress) {
88            background=true; backgroundColor=0xF3F3F3;
89            border=true; borderColor=0xFFFFFF;
90            type='dynamic'; wordWrap=true; multiline=true;
91            setNewTextFormat(plainSmall); text='';
92        }
93        box.progress.onChanged=function() { _root.windows.upload.box.progress.scroll=_root.windows.upload.box.progress.maxscroll; };
94
95            operationDone('first');
96    }
97
98        // -------------------------------------------------------------------------------------
99        // abortUpload
100        // Stop upload in case of failure
101
102        function abortUpload() {
103                var i,z;
104                if (!_root.uploading) { return; }
105                _root.uploading=false;
106                setAdvice(false,iText("Upload stopped",'advice_uploadfail'));
107                _root.windows.upload.remove();
108                z=_root.map.pois; for (i in z) { z[i].uploading=false; }
109                z=_root.map.ways; for (i in z) { z[i].uploading=false; }
110                z=_root.map.nodes; for (i in z) { z[i].uploading=false; }
111                z=_root.map.relations; for (i in z) { z[i].uploading=false; }
112        }
113
114        // ----------------------------------------------------------------------------------------
115        // operationDone( id | all | first )
116        // removes element from current task from list, and does next if task complete
117        // ('all' takes the entire first task; 'first' doesn't take anything, just fires the first)
118
119        function operationDone(id) {
120                if (!_root.uploading) { return; }
121
122                var doNext=false;
123                if (id=='all') {
124                        // Entire first event done (e.g. startChangeset)
125                        _root.uploadtasks.shift(); doNext=true;
126                } else if (id=='first') {
127                        // First task, so we want to fire it
128                        doNext=true;
129                } else {
130                        // Remove task from list, do next if none left
131                        var a=_root.uploadtasks[0][1]; delete a[id];
132                        var c=0; for (i in a) { c++; }
133                        doNext=(c==0); if (doNext) { 
134                                _root.uploadtasks.shift();
135                        }
136                }
137
138                if (!doNext) { return; }
139                if (_root.uploadtasks.length>0) { 
140                        _root.uploadtasks[0][0].call(null,_root.uploadtasks[0][1]); 
141                return;
142        }
143               
144                // Hooray, we're complete
145                _root.uploading=false;
146                _root.waystodelete=new Object();
147                _root.poistodelete=new Object();
148//        _root.windows.upload.box.progress.text+="Upload complete";
149//              var box=_root.windows.upload.box;
150//              box.createEmptyMovieClip(1,1);
151//              drawButton(box[1],140,220,iText("Ok","ok"),"");
152//              box[1].onPress=function() { _root.windows.upload.remove(); };
153        _root.windows.upload.remove(); 
154                setAdvice(false,iText("All data successfully uploaded",'advice_uploadsuccess'));
155        markClean(true);
156        }
157
158        // -------------------------------------------------------------------------------------
159        // individual upload tasks
160
161        function uploadPOIs(list) {
162                for (var id in list) {
163            _root.windows.upload.box.progress.text+="Uploading POI "+id+", "+getName(_root.map.pois[id].attr,nodenames)+"\n";
164                        _root.map.pois[id].upload();
165                }
166        }
167
168        function uploadWays(list) {
169                for (var id in list) {
170            _root.windows.upload.box.progress.text+="Uploading way "+id+", "+getName(_root.map.ways[id].attr,waynames)+"\n";
171                        _root.map.ways[id].upload();
172                }
173        }
174       
175        function uploadRelations(list) {
176                for (var id in list) {
177            _root.windows.upload.box.progress.text+="Uploading relation "+id+", "+getName(_root.map.relations[id].attr,[])+"\n";
178                        _root.map.relations[id].upload();
179                }
180        }
181       
182        function uploadDeletedWays(list) {
183        _root.windows.upload.box.progress.text+="Deleting ways";
184                for (var id in list) {
185            _root.windows.upload.box.progress.text+=".";
186                        deleteresponder = function() { };
187                        deleteresponder.onResult = function(result) { deletewayRespond(result); };
188                        _root.writesrequested++;
189                        remote_write.call('deleteway',deleteresponder,_root.usertoken,_root.changeset,Number(id),waystodelete[id][0],waystodelete[id][1]);
190                }
191        _root.windows.upload.box.progress.text+="\n";
192        }
193
194        function uploadDeletedPOIs(list) {
195        _root.windows.upload.box.progress.text+="Deleting POIs";
196                for (var id in list) {
197            _root.windows.upload.box.progress.text+=".";
198                        poidelresponder = function() { };
199                        poidelresponder.onResult = function(result) { deletepoiRespond(result); };
200                        _root.writesrequested++;
201                        remote_write.call('putpoi',poidelresponder,_root.usertoken,_root.changeset,Number(poistodelete[id][0]),Number(id),poistodelete[id][1],poistodelete[id][2],poistodelete[id][3],0);
202                }
203        _root.windows.upload.box.progress.text+="\n";
204        }
205
206
Note: See TracBrowser for help on using the repository browser.