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