xref: /plugin/siteexport/script.js (revision f44c759a20e24a9b69102e89c331188212327815)
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            _.updateValue = function( elem, value ) {
373                if ( !elem.size() ) {
374                    return;
375                }
376                switch(elem[0].type) {
377                    case 'checkbox': elem.prop('checked', elem.val() == value); break;
378                    case 'select-one':
379                    case 'select': {
380
381                        var selected = false;
382                        elem.find('option').each(function(){
383                            if ( $(this).val() == value ) {
384                                $(this).prop('selected', true);
385                                selected = true;
386                                return false;
387                            }
388                        });
389
390                        if ( !selected && !isNaN(value) ) {
391                            elem.find('option:eq('+value+')').prop('selected', true);
392                        }
393
394                         break;
395                    }
396                    default: elem.val(value);
397                }
398            };
399
400            _.setValues = function(values) {
401
402                $(_.allElements + ':not(:checkbox)').val(null);
403                $(_.allElements + ':checkbox').prop('checked', false);
404                $('#siteexport__customActions').html("");
405
406                _.suspendGenerate = true;
407                for ( var node in values ) {
408
409                    var value = values[node];
410                    var elem = null;
411
412                    if ( typeof value == 'object' ) {
413                        for ( var val in value ) {
414                            _.updateValue($('#siteexport #'+node+'_'+value[val]+':input[name='+node+'\\[\\]]'), value[val]);
415                        }
416                    } else {
417                        _.updateValue($('#siteexport :input[name='+node+']'), value);
418                    }
419                }
420
421                // Custom Options
422                for ( var index in values['customoptionname'] ) {
423
424                    try {
425                        _.addCustomOption(values['customoptionname'][index], values['customoptionvalue'][index]);
426                    } catch (e) {
427                        _.errorLog(e);
428                    }
429                }
430
431                _.suspendGenerate = false;
432            };
433
434        }(siteexportadmin.prototype));
435
436        var __siteexport = null;
437        $.siteexport = function() {
438            if ( __siteexport == null ) {
439                __siteexport = new siteexportadmin();
440            }
441
442            return __siteexport;
443        };
444
445        $.siteexport().generate();
446        $('#siteexport :input').each(function(index, element){
447            $(this).change(function(event){
448                event.stopPropagation();
449                $.siteexport().generate();
450            });
451        });
452
453        $('form#siteexport :input[type=submit][name~=do\\[siteexport\\]]').click(function(event){
454            event.stopPropagation();
455            $.siteexport().run();
456            return false;
457        });
458
459        $('form#siteexport_site_aggregator :input[type=submit][name~=do\\[siteexport\\]]').click(function(event){
460            event.stopPropagation();
461            $.siteexport().runAggregator();
462            return false;
463        });
464
465        $('form#siteexport #depthType:input').change(function(event){
466            event.stopPropagation();
467            if ( parseInt($(this).val()) == 2 ) {
468                $('div#depthContainer').show();
469            } else {
470                $('div#depthContainer').hide();
471            }
472        });
473
474
475        $('form#siteexport #pdfExport:input').change(function(event){
476            event.stopPropagation();
477            $('form#siteexport #renderer').find('option[value=siteexport_pdf]').prop('selected', this.checked);
478            $('form#siteexport #renderer').prop('disabled', this.checked);
479        });
480
481        $('form#siteexport select#renderer').change(function(event){
482            event.stopPropagation();
483            $('form#siteexport #pdfExport:input, form#siteexport select#template').prop('disabled', $(this).prop('value') == 'dw2pdf');
484        });
485
486
487        $('form#siteexport #disableall:input').change(function(event){
488            event.stopPropagation();
489            $.siteexport().toggleDisableAllPlugins(this);
490        });
491
492        $('form#siteexport :input[name=disableplugin\\[\\]]').change(function(event){
493            event.stopPropagation();
494
495            if ( !this.checked && $('form#siteexport #disableall:input').prop('checked') ) {
496                $('form#siteexport #disableall:input').prop('checked', false);
497            }
498        });
499
500        $('form#siteexport :input[type=submit][name=do\\[addoption\\]]').click(function(event){
501            event.stopPropagation();
502            $.siteexport().addCustomOption();
503            return false;
504        });
505
506    });
507})(jQuery);
508