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