xref: /plugin/siteexport/script.js (revision a8c17ab5b37308343f86651acb8c4a1b3f36f0ae)
1/* DOKUWIKI:include jquery.filedownload.js */
2
3/** global: DOKU_BASE */
4/** global: LANG */
5/** global: NS */
6/** global: JSINFO */
7/** global: opener */
8// Siteexport Admin Plugin Script
9(function($){
10    $(function(){
11
12        if ( !$('form#siteexport, form#siteexport_site_aggregator, form#siteexport_siteexporter').size() ) {
13            return;
14        }
15
16        if (!window.location.origin) {
17            window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');
18        }
19
20        var SiteexportAdmin = function() {
21        };
22
23        (function(_){
24
25            _.url = DOKU_BASE + 'lib/exe/ajax.php';
26            _.aggregateForm = $('form#siteexport_site_aggregator, form#siteexport_siteexporter');
27            _.suspendGenerate = _.aggregateForm.size() > 0;
28            _.allElements = 'form#siteexport :input:not([readonly]):not([disabled]):not([type=submit]):not(button):not(.dummy), form#siteexport_site_aggregator :input:not([type=submit]):not(button), form#siteexport_siteexporter :input:not([type=submit]):not(button)';
29            _.isManager = $('div#siteexport__manager').size() > 0;
30            _.forbidden_options = [ 'call', 'sectok' ];
31
32            _.generate = function() {
33
34                if ( _.suspendGenerate || _.isManager ) { return; }
35
36                this.resetDataForNewRequest();
37
38                _.throbber(true);
39                $.post( _.url, _.settings('__siteexport_generateurl'), function(data) {
40                    data = data.split("\n");
41                    $('#copyurl').val(data[0]);
42                    $('#wgeturl').val(data[1]);
43                    $('#curlurl').val(data[2]);
44                }).fail(function(jqXHR){
45                    _.errorLog(jqXHR.responseText);
46                }).always(function(){
47                    _.throbber(false);
48                });
49            };
50
51            _.run = function() {
52
53                this.resetDataForNewRequest();
54
55                if ( _.isManager && !(typeof opener === "undefined") ) {
56
57                    var settings = $.param(_.cleanSettings()).split('&').join(' ');
58                    if ( settings.length > 0 ) { settings = ' ' + settings; }
59
60                    var edid = String.prototype.match.call(document.location, new RegExp("&edid=([^&]+)"));
61                    opener.insertTags(edid ? edid[1] : 'wiki__text', '{{siteexportAGGREGATOR' + settings + '}}','','');
62
63                    window.close();
64                    opener.focus();
65                    return;
66                }
67
68                _.throbber(true);
69                $.post( _.url, _.settings('__siteexport_getsitelist'), function(data) {
70                    data = data.split("\n");
71
72                    _.pattern = data.shift();
73                    _.zipURL = data.shift();
74
75                    _.pageCount = data.length - 1; // starting at 0
76                    _.currentCount = 0;
77
78                    _.allPages = data;
79                    _.status(_.pages());
80                    _.nextPage();
81                }).fail(function(jqXHR){
82                    _.errorLog(jqXHR.responseText);
83                }).always(function(){
84                    _.throbber(false);
85                });
86            };
87
88
89            _.aggregatorStatus = null;
90            _.runAggregator = function() {
91
92                this.resetDataForNewRequest();
93
94                if ( _.aggregatorStatus == null ) {
95                    _.aggregatorStatus = $('<span id="siteexport__out"/>').appendTo("form#siteexport_site_aggregator, form#siteexport_siteexporter");
96                }
97
98                _.status(LANG.plugins.siteexport.loadingpage);
99                _.aggregatorStatus.removeClass('error').show();
100                _.aggregateForm.addClass('loading');
101                var settings = _.settings('__siteexport_aggregate');
102                var throbber = $('form#siteexport_site_aggregator :input[name=baseID], form#siteexport_site_aggregator :input[type=submit], form#siteexport_siteexporter :input[type=submit]').prop('disabled', true);
103                $.post( _.url, settings, function(data) {
104
105                    if ( data.match( new RegExp( 'mpdf error', 'i' ) ) ) {
106                        _.aggregatorStatus.addClass('error');
107                        _.status(data);
108                    } else {
109                        _.downloadFile({
110                                id : 'siteexport_site_aggregator_downloader',
111                                src: window.location.origin + data,
112                                root: 'div.siteexporter',
113                                timeout: function(){
114                                    _.aggregatorStatus.hide();
115                                }
116                        });
117                    }
118
119                }).fail(function(jqXHR){
120                    _.aggregatorStatus.addClass('error');
121                    _.status(jqXHR.responseText.replace("\n", "<br/>"));
122                }).always(function(){
123                    throbber.prop('disabled', false);
124                    _.aggregateForm.removeClass('loading');
125                });
126            };
127
128            _.downloadFile = function(iframeProps) {
129
130                    _.status(LANG.plugins.siteexport.startdownload);
131                    _.aggregateForm.addClass('download');
132                    if ( $.fileDownload ) {
133
134                        $.fileDownload(iframeProps.src).done(function(){
135                            _.status(LANG.plugins.siteexport.downloadfinished);
136
137                            if ( typeof iframeProps.timeout == 'function' ) {
138                                window.setTimeout(iframeProps.timeout, 2000);
139                            }
140
141                        }).fail(function(){
142                            _.error(LANG.plugins.siteexport.finishedbutdownloadfailed);
143                        }).always(function(){
144                            _.aggregateForm.removeClass('download');
145                        });
146
147                        return;
148                    }
149
150                    var frameQuery = "iframe#" + iframeProps.id;
151                    var frame = $(frameQuery);
152                    if ( frame.size() == 0 ) {
153                        frame = $('<iframe/>')
154                        .hide()
155                        .appendTo(iframeProps.root)
156                        .prop({
157                            type : 'application/octet-stream',
158                            id : iframeProps.id
159                        });
160                    }
161
162                    // Downloads do not generate a load event
163                    frame.load(function(){
164                        _.status(LANG.plugins.siteexport.downloadfinished);
165
166                        // This must only happen when not downloading, meaning we have a PDF file.
167                        // ENSURE THIS IS THE ONLY CASE!
168                        // frame.remove();
169
170                        if ( $.popupviewer ) {
171
172                            var clone = frame.clone().css({
173                                border: 'none'
174                            }).show();
175
176                            frame.remove();
177                            _.aggregateForm.removeClass('download');
178
179                            var viewer = new $.popupviewer();
180                            viewer.showViewer();
181
182                            $("div#popupviewer div.content").html(clone);
183                            viewer.resizePopup($(window).width(), $(window).height(), null, clone, false, false);
184                        } else {
185                            // No Popup? Open right here
186                            document.location.href = iframeProps.src;
187                        }
188                    });
189
190                    frame.attr('src', iframeProps.src);
191                    if ( typeof iframeProps.timeout == 'function' ) {
192                        window.setTimeout(iframeProps.timeout, 2000);
193                    }
194
195                       $(window).unload(function(){
196                           // last resort or the frame might reload
197                           frame.remove();
198                       });
199            };
200
201            _.addSite = function(site) {
202
203                var settings = _.settings('__siteexport_addsite');
204                settings.push({
205                    name: 'site',
206                    value: site
207                },{
208                    name: 'pattern',
209                    value: this.pattern
210                },{
211                    name: 'base',
212                    value: DOKU_BASE
213                });
214
215                _.throbber(true);
216                $.post( _.url, settings, function(data) {
217                    _.zipURL = data.split("\n").pop();
218                    _.nextPage();
219                }).fail(function(jqXHR){
220                    _.errorLog(jqXHR.responseText);
221                    _.errorCount++;
222                }).always(function(){
223                    _.throbber(false);
224                });
225            };
226
227            _.nextPage = function() {
228                if (!this.allPages) {
229                    return;
230                }
231
232                var page = this.allPages.shift();
233
234                if (!page) {
235                    if (_.zipURL != "" && _.zipURL != 'undefined' && typeof _.zipURL != 'undefined' ) {
236
237                        _.downloadFile({
238                                id : 'siteexport_downloader',
239                                src: window.location.origin + _.zipURL,
240                                root: '#siteexport'
241                        });
242
243                    } else {
244                        _.status(LANG.plugins.siteexport.finishedbutdownloadfailed);
245                        _.errorLog(_.zipURL);
246                    }
247                    return;
248                }
249
250                if (!page) {
251                    this.nextPage();
252                }
253
254                _.status('Adding "' + page + '" ' + this.pages(this.currentCount++));
255                _.addSite(page);
256            };
257
258            _.pages = function() {
259                return '( '
260                        + _.currentCount
261                        + ' / '
262                        + _.pageCount
263                        + (_.errorCount && _.errorCount != 0 ? ' / <span style="color: #a00">' + _.errorCount + '</span>'
264                                : '') + ' )';
265            };
266
267            _.status = function(text) {
268                $('#siteexport__out').html(text).removeClass('error');
269            };
270
271            _.error = function(text) {
272                $('#siteexport__out').html(text).addClass('error');
273            };
274
275            _.settings = function(call) {
276                var settings = $(_.allElements).serializeArray();
277
278                if (call) { settings.push({ name: 'call', value: call}); }
279                if ( $('input#pdfExport:checked').size() > 0 ) { settings.push({ name: 'renderer', value: 'siteexport_pdf'}); } // is disabled and would not get pushed
280                return settings;
281            };
282
283            _.cleanSettings = function(call) {
284
285                return _.settings(call).filter(function(element){
286
287                    if ( element.value == NS || element.value == JSINFO.id || element.value == JSINFO.namespace ) { element.name = null; }
288                    if ( !isNaN(element.value) ) { element.value = parseInt(element.value); }
289                    return element.name && _.forbidden_options.indexOf(element.name) < 0 && (element.value.length > 0 || (!isNaN(element.value) && element.value > 0));
290                });
291            };
292
293            /**
294             * Display the loading gif
295             */
296            _.throbberCount = 0;
297            _.throbber = function(on) {
298
299                _.throbberCount += (on?1:-1);
300                $('#siteexport__throbber').css('visibility', _.throbberCount>0 ? 'visible' : 'hidden');
301            };
302
303            _.resetDataForNewRequest = function() {
304
305                this.pageCount = 0;
306                this.currentCount = 0;
307                this.errorCount = 0;
308                this.allPages = [];
309                this.zipURL = '';
310                this.pattern = '';
311
312                this.status('');
313                this.resetErrorLog();
314            };
315
316            /**
317             * Log errors into container
318             */
319            _.errorLog = function(text) {
320
321                if (!text) {
322                    return;
323                }
324
325                if (!$('#siteexport__errorlog').size()) {
326                    $('#siteexport__out').parent().append($('<div id="siteexport__errorlog"></div>'));
327                }
328
329                var msg = text.split("\n");
330                for ( var int = 0; int < msg.length; int++) {
331
332                    var txtMsg = msg[int];
333                    txtMsg = txtMsg.replace(new RegExp("^runtime error:", "i"), "");
334
335                    if (txtMsg.length == 0) {
336                        continue;
337                    }
338
339                    $('#siteexport__errorlog').append($('<p></p>').text(txtMsg.replace(new RegExp(
340                            "</?.*?>", "ig"), "")));
341                }
342            };
343
344            _.resetErrorLog = function() {
345                $('#siteexport__errorlog').remove();
346            };
347
348            _.toggleDisableAllPlugins = function(input) {
349                $('#siteexport :input[name=disableplugin\\[\\]]:not([disabled=disabled])').prop('checked', input.checked);
350            };
351
352
353            _.addCustomOption = function(nameVal, valueVal) {
354
355                if ( typeof nameVal == 'undefined' )
356                {
357                    nameVal = 'name';
358                }
359
360                if ( typeof valueVal == 'undefined' )
361                {
362                    valueVal = 'value';
363                }
364
365
366                var regenerate = function(event) {
367                    event.stopPropagation();
368                    _.generate();
369                };
370
371                var customOption = $('<input type="hidden"/>').attr({ name: nameVal, value: valueVal});
372                var name = $('<input/>').addClass('edit dummy').attr({ value: nameVal}).change(function(event)
373                {
374                    customOption.attr({ name: this.value }); regenerate(event);
375                }).click(function(){this.select();});
376                var value = $('<input/>').addClass('edit dummy').attr({ value: valueVal}).change(function(event)
377                {
378                    customOption.attr({ value: this.value }); regenerate(event);
379                }).click(function(){this.select();});
380
381
382                $('<li/>').append(name).append(value).append(customOption).appendTo('#siteexport__customActions');
383            };
384
385            _.updateValue = function( elem, value ) {
386                if ( !elem.size() ) {
387                    return;
388                }
389                switch(elem[0].type) {
390                    case 'checkbox': elem.prop('checked', elem.val() == value); break;
391                    case 'select-one':
392                    case 'select': {
393
394                        var selected = false;
395                        elem.find('option').each(function(){
396                            if ( $(this).val() == value ) {
397                                $(this).prop('selected', true);
398                                selected = true;
399                                return false;
400                            }
401                            return true;
402                        });
403
404                        if ( !selected && !isNaN(value) ) {
405                            elem.find('option:eq('+value+')').prop('selected', true);
406                        }
407
408                         break;
409                    }
410                    default: elem.val(value);
411                }
412            };
413
414            _.setValues = function(values) {
415
416                $(_.allElements + ':not(:checkbox)').val(null);
417                $(_.allElements + ':checkbox').prop('checked', false);
418                $('#siteexport__customActions').html("");
419
420                _.suspendGenerate = true;
421                for ( var node in values ) {
422
423                    if ( !values.hasOwnProperty(node)) {
424                        continue; // Skip keys from the prototype.
425                    }
426
427                    var value = values[node];
428                    if ( typeof value == 'object' ) {
429                        for ( var val in value ) {
430                            if ( !value.hasOwnProperty(val)) {
431                                continue; // Skip keys from the prototype.
432                            }
433                            _.updateValue($('#siteexport #'+node+'_'+value[val]+':input[name='+node+'\\[\\]]'), value[val]);
434                        }
435                    } else {
436                        _.updateValue($('#siteexport :input[name='+node+']'), value);
437                    }
438                }
439
440                // Custom Options
441                for ( var index in values['customoptionname'] ) {
442
443                    if ( !values['customoptionname'].hasOwnProperty(index)) {
444                        continue; // Skip keys from the prototype.
445                    }
446
447                    try {
448                        _.addCustomOption(values['customoptionname'][index], values['customoptionvalue'][index]);
449                    } catch (e) {
450                        _.errorLog(e);
451                    }
452                }
453
454                _.suspendGenerate = false;
455            };
456
457        }(SiteexportAdmin.prototype));
458
459        var __siteexport = null;
460        $.siteexport = function() {
461            if ( __siteexport == null ) {
462                __siteexport = new SiteexportAdmin();
463            }
464
465            return __siteexport;
466        };
467
468        $.siteexport().generate();
469        $('#siteexport :input').each(function(){
470            $(this).change(function(event){
471                event.stopPropagation();
472                $.siteexport().generate();
473            });
474        });
475
476        $('form#siteexport :input[type=submit][name~=do\\[siteexport\\]]').click(function(event){
477            event.stopPropagation();
478            $.siteexport().run();
479            return false;
480        });
481
482        $('form#siteexport_site_aggregator :input[type=submit][name~=do\\[siteexport\\]], form#siteexport_siteexporter :input[type=submit][name~=do\\[siteexport\\]]').click(function(event){
483            event.stopPropagation();
484            $.siteexport().runAggregator();
485            return false;
486        });
487
488        $('form#siteexport #depthType:input').change(function(event){
489            event.stopPropagation();
490            if ( parseInt($(this).val()) == 2 ) {
491                $('div#depthContainer').show();
492            } else {
493                $('div#depthContainer').hide();
494            }
495        });
496
497
498        $('form#siteexport #pdfExport:input').change(function(event){
499            event.stopPropagation();
500            $('form#siteexport #renderer').find('option[value=siteexport_pdf]').prop('selected', this.checked);
501            $('form#siteexport #renderer').prop('disabled', this.checked);
502        });
503
504        $('form#siteexport select#renderer').change(function(event){
505            event.stopPropagation();
506            $('form#siteexport #pdfExport:input, form#siteexport select#template').prop('disabled', $(this).prop('value') == 'dw2pdf');
507        });
508
509
510        $('form#siteexport #disableall:input').change(function(event){
511            event.stopPropagation();
512            $.siteexport().toggleDisableAllPlugins(this);
513        });
514
515        $('form#siteexport :input[name=disableplugin\\[\\]]').change(function(event){
516            event.stopPropagation();
517
518            if ( !this.checked && $('form#siteexport #disableall:input').prop('checked') ) {
519                $('form#siteexport #disableall:input').prop('checked', false);
520            }
521        });
522
523        $('form#siteexport :input[type=submit][name=do\\[addoption\\]]').click(function(event){
524            event.stopPropagation();
525            $.siteexport().addCustomOption();
526            return false;
527        });
528    });
529})(jQuery);
530
531var copyMapIDToClipBoard = function() {
532    var $this = jQuery(this);
533    var $mapID = $this.find('span.mapID');
534    var range, selection, ok;
535
536    if (window.getSelection && document.createRange) {
537        selection = window.getSelection();
538        range = document.createRange();
539        range.selectNodeContents($mapID.get(0));
540        selection.removeAllRanges();
541        selection.addRange(range);
542    } else if (document.selection && document.body.createTextRange) {
543        range = document.body.createTextRange();
544        range.moveToElementText($mapID.get(0));
545        range.select();
546    }
547    // Use try & catch for unsupported browser
548    try {
549        // The important part (copy selected text)
550        ok = document.execCommand('copy');
551    } catch (err) {
552        // Ignore if it does not work.
553    }
554
555    if (ok) {
556        $mapID.addClass('done');
557        setTimeout(function(){
558            $mapID.removeClass('done');
559        }, 1000);
560    }
561};