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