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