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