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