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