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