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