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