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