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

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

Show error messages when something goes wrong with twitter / display a popup if a twit was successfully twatted / associated cleanup of code

File size: 7.7 KB
Line 
1
2        // Changeset management code
3       
4        // -----------------------------------------------------------------------
5        // closeChangeset
6        // prompts for a comment, then closes current changeset
7        // and starts a new one
8
9        function closeChangeset() {
10                if (!_root.changeset) { return; }
11        if (_root.sandbox) {
12                        _root.panel.advanced.disableOption(5);
13            pleaseWait(iText('closechangeset'));
14                    startChangeset(false);
15        } else {
16                    changesetRequest(iText('prompt_closechangeset',_root.changeset),completeClose,'');
17                }
18        }
19
20        // -----------------------------------------------------------------------
21        // renewChangeset
22        // renew a right changeset within us (if it's over an hour since the last)
23        // returns:
24        //              false - no changeset needed, continue
25        //              true  - new changeset needed
26       
27        function renewChangeset() {
28                if (!_root.changeset) { return false; }
29                var t=new Date(); if (t.getTime()-_root.csopened<3400000) { return false; }
30                pleaseWait(iText('openchangeset'),abortOpen);
31                _root.changeset=null; startChangeset(true);
32                return true;
33        }
34       
35        function abortOpen() { _root.changeset=null; }
36        function freshenChangeset() { var t=new Date(); _root.csopened=t.getTime(); }
37       
38        // changesetRequest(text,exit routine,comment)
39
40        function changesetRequest(prompt,doOnClose,comment) {
41                _root.panel.properties.enableTabs(false);
42                _root.windows.attachMovie("modal","cs",++windowdepth);
43                _root.windows.cs.init(300, 160, [iText('cancel'), iText('ok')], completeClose);
44
45                var z = 5;
46                var box = _root.windows.cs.box;
47               
48                box.createTextField("title",z++,7,7,280,20);
49                box.title.text = prompt;
50                with (box.title) { wordWrap=true; setTextFormat(boldText); selectable=false; type='dynamic'; }
51                box.title.adjustTextField();
52
53                box.createTextField("prompt",z++,7,27,280,20);
54                box.prompt.text = iText('prompt_changesetcomment');
55                with (box.prompt) { wordWrap=true; setTextFormat(plainSmall); selectable=false; type='dynamic'; }
56                box.prompt.adjustTextField();
57
58                box.attachMovie("checkbox","twitter",z++);
59                box.twitter.init(10,110,iText('prompt_twitter',100),preferences.data.twitter,function(n) { preferences.data.twitter=n; },(preferences.data.twitterid!='' && preferences.data.twitterpwd!=''));
60               
61                box.createTextField("cscomment",z++,10,50,280,50);
62                with (box.cscomment) {
63                        setNewTextFormat(plainSmall);
64                        type='input';
65                        backgroundColor=0xDDDDDD;
66                        background=true;
67                        border=true;
68                        borderColor=0xFFFFFF;
69                        wordWrap=true;
70                        text=comment;
71                }
72                _root.csswallowed=false;
73                Selection.setFocus(box.cscomment);
74                box.cscomment.onChanged=function() {                            // swallow 'C'
75                        fixUTF8();
76                        if ((box.cscomment.text.toUpperCase()=='C' || box.cscomment.text.toUpperCase()=='S') && !_root.csswallowed ) {
77                                box.cscomment.text='';
78                        }
79                        _root.windows.cs.box.twitter.prompt.text=iText('prompt_twitter',100-box.cscomment.text.length);
80                        _root.csswallowed=true;
81                };
82        }
83       
84        function completeClose(button) {
85                if (button!=iText('ok')) { return false; }
86        _root.changecomment=_root.windows.cs.box.cscomment.text;
87                if (_root.windows.cs.box.twitter.state) { twitterPost(); }
88                startChangeset(true);
89        }
90       
91
92        // -----------------------------------------------------------------------
93        // startChangeset
94        // Closes current changeset if it exists (with optional comment)
95        // then starts a new one
96       
97        function startChangeset(open_new) {
98                csresponder=function() {};
99                csresponder.onResult = function(result) {
100                        var code=result.shift(); var msg=result.shift(); if (code) { handleError(code,msg,result); return; }
101                        // ** probably needs to fail really catastrophically here...
102                        _root.changeset=result[0];
103                        freshenChangeset();
104                        if (_root.windows.pleasewait) { _root.windows.pleasewait.remove(); }
105            if (_root.sandbox && !_root.uploading && _root.changeset) {
106                                startUpload();
107                        } else if (!_root.sandbox) { 
108                                uploadDirtyWays();
109                                uploadDirtyPOIs();
110                                uploadDirtyRelations();
111                        }
112                };
113
114                var cstags=new Object();                                                                                                                // Changeset tags
115                cstags['created_by']="Potlatch "+_root.signature + ' (' + (_root.sandbox ? 'save' : 'live') + ' ' + iText('__potlatch_locale') + ')';
116
117                remote_write.call('startchangeset',csresponder,_root.usertoken,cstags,_root.changeset,_root.changecomment,open_new);
118                if (open_new) { _root.panel.advanced.enableOption(5); }
119        }
120
121        // -----------------------------------------------------------------------
122        // shortLink (from site.js)
123
124        function shortLink(lat, lon, zoom) {
125            var char_array="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_@";
126                var i;
127            var x=Math.round((lon+180.0) * ((1 << 30) /90.0));
128            var y=Math.round((lat+ 90.0) * ((1 << 30) /45.0));
129            var c1=0, c2=0;
130            for (i=31; i>16; --i) {
131                        c1=(c1 << 1) | ((x >> i) & 1);
132                        c1=(c1 << 1) | ((y >> i) & 1);
133            }
134            for (i=16; i>1; --i) {
135                        c2=(c2 << 1) | ((x >> i) & 1);
136                        c2=(c2 << 1) | ((y >> i) & 1);
137            }
138            var str="";
139            for (i=0; i<Math.ceil((zoom+8) / 3.0) && i<5; ++i) {
140                        digit=(c1 >> (24 - 6 * i)) & 0x3f;
141                        str += char_array.charAt(digit);
142            }
143            for (i=5; i<Math.ceil((zoom+8) / 3.0); ++i) {
144                        digit=(c2 >> (24 - 6 * (i - 5))) & 0x3f;
145                        str += char_array.charAt(digit);
146            }
147            for (i=0; i<((zoom+8) % 3); ++i) {
148                        str += "-";
149            }
150            return str;
151        }
152
153        function twitterPost() {
154                if (preferences.data.twitterid=='' || preferences.data.twitterpwd=='' || _root.changecomment=='') { return; }
155                var rv=new LoadVars();
156                var lv=new LoadVars();
157        rv.onLoad = function(success) {
158            if (rv.success == 0) {
159                errorDialogue(iText("error_twitter_long", rv.errcode, rv.errmsg, rv.errerr),130);
160            } else {
161                setAdvice(false, iText('advice_twatted'), true);
162            }
163        };
164                lv.twitter_id =preferences.data.twitterid;
165                lv.twitter_pwd=preferences.data.twitterpwd;
166                lv.clientver = _root.signature;
167                lv.tweet      ="#osmedit "+_root.changecomment+" http://osm.org/go/"+shortLink(centrelat(0),centrelong(0),Math.min(_root.scale,18));
168                lv.lat        =centrelat(0);
169                lv.long       =centrelong(0);
170               
171                lv.sendAndLoad("http://richard.dev.openstreetmap.org/cgi-bin/potlatchtweet.cgi",rv,"POST");
172
173/*
174        The following code will be used when Twitter relax crossdomain restrictions on api.twitter.com (as promised).
175        Until then we have to go via a proxy.
176                _root.twitterresponse=new Object();
177                var lv=new LoadVars();
178                lv.addRequestHeader("Authorization","BASIC "+base64(preferences.data.twitterid+":"+preferences.data.twitterpwd));
179                lv.addRequestHeader("X-Twitter-Client","Potlatch");
180                lv.onLoad=function(success) { _root.chat.text+="onLoad "+success+"\n"; twitterUpdate(); };
181                resp=lv.sendAndLoad("http://twitter.com/account/verify_credentials.json",_root.twitterresponse,"POST");
182
183        ...and then in the twitterUpdate function, the same lv stuff plus:
184                lv['status']="#osmedit "+_root.changecomment+" http://osm.org/go/"+shortLink(centrelat(0),centrelong(0),Math.min(_root.scale,18));
185                lv['lat']=centrelat(0);
186                lv['long']=centrelong(0);
187                lv.sendAndLoad("http://twitter.com/account/update.json",_root.twitterresponse,"POST");
188
189        And for the Base64 function:
190
191                // base64 - public domain from http://rumkin.com/tools/compression/base64.php (thanks!)
192                function base64(input) {
193                        var char_array="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
194                        var output='';
195                        var i=0;
196
197                        while (i < input.length) {
198                                var chr1 = input.charCodeAt(i++);
199                                var chr2 = input.charCodeAt(i++);
200                                var chr3 = input.charCodeAt(i++);
201
202                                var enc1 = chr1 >> 2;
203                                var enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
204                                var enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
205                                var enc4 = chr3 & 63;
206
207                                if (isNaN(chr2)) { enc3 = enc4 = 64; }
208                                else if (isNaN(chr3)) { enc4 = 64; }
209
210                                output+=char_array.charAt(enc1) + char_array.charAt(enc2) + char_array.charAt(enc3) + char_array.charAt(enc4);
211                   }
212                   return output;
213                }
214
215*/
216
217        }
218
219       
Note: See TracBrowser for help on using the repository browser.