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