1/* DOKUWIKI:include jquery.filedownload.js */ 2 3 4// Siteexport Admin Plugin Script 5(function($){ 6 $(function(){ 7 8 if ( !$('form#siteexport, form#siteexport_site_aggregator').size() ) { 9 return; 10 } 11 12 var siteexportadmin = function() { 13 }; 14 15 var hasErrors = function(data, status) { 16 return (status != 'undefined' && status != 200); 17/* return data.match(new RegExp("((runtime|fatal) error|[error])", "i")) 18 || (status != 'undefined' && status != 200);*/ 19 }; 20 21 (function(_){ 22 23 _.url = DOKU_BASE + 'lib/exe/ajax.php'; 24 _.suspendGenerate = $('form#siteexport_site_aggregator').size() > 0; 25 _.allElements = 'form#siteexport :input:not([readonly]):not([disabled]):not([type=submit]):not(button), form#siteexport_site_aggregator :input:not([type=submit]):not(button)'; 26 _.isManager = $('div#siteexport__manager').size() > 0; 27 _.forbidden_options = [ 'call', 'sectok' ]; 28 29 _.generate = function() { 30 31 if ( _.suspendGenerate || _.isManager ) { return; } 32 33 this.resetDataForNewRequest(); 34 35 _.throbber(true); 36 $.post( _.url, _.settings('__siteexport_generateurl'), function(data, textStatus, jqXHR) { 37 data = data.split("\n"); 38 $('#copyurl').val(data[0]); 39 $('#wgeturl').val(data[1]); 40 $('#curlurl').val(data[2]); 41 _.updateCronStatusExists(data[3] == 'true'); 42 }).fail(function(jqXHR){ 43 _.errorLog(jqXHR.responseText); 44 }).always(function(){ 45 _.throbber(false); 46 }); 47 }; 48 49 _.run = function() { 50 51 this.resetDataForNewRequest(); 52 53 if ( _.isManager && opener ) { 54 55 var settings = $.param(_.cleanSettings()).split('&').join(' '); 56 if ( settings.length > 0 ) settings = ' ' + settings; 57 58 edid = String.prototype.match.call(document.location, /&edid=([^&]+)/); 59 opener.insertTags(edid ? edid[1] : 'wiki__text', '{{siteexportAGGREGATOR' + settings + '}}','',''); 60 61 window.close(); 62 opener.focus(); 63 return; 64 } 65 66 _.throbber(true); 67 $.post( _.url, _.settings('__siteexport_getsitelist'), function(data, textStatus, jqXHR) { 68 data = data.split("\n"); 69 70 _.pattern = data.shift(); 71 _.zipURL = data.shift(); 72 73 _.pageCount = data.length - 1; // starting at 0 74 _.currentCount = 0; 75 76 _.allPages = data; 77 _.status(_.pages()); 78 _.nextPage(); 79 }).fail(function(jqXHR){ 80 _.errorLog(jqXHR.responseText); 81 }).always(function(){ 82 _.throbber(false); 83 }); 84 }; 85 86 _.aggregatorStatus = null; 87 _.runAggregator = function() { 88 89 this.resetDataForNewRequest(); 90 91 if ( _.aggregatorStatus == null ) { 92 _.aggregatorStatus = $('<span id="siteexport__out"/>').appendTo("form#siteexport_site_aggregator"); 93 } 94 95 _.status(LANG.plugins.siteexport.loadingpage); 96 _.aggregatorStatus.removeClass('error').show(); 97 var settings = _.settings('__siteexport_aggregate'); 98 var throbber = $('form#siteexport_site_aggregator :input[name=baseID], form#siteexport_site_aggregator :input[type=submit]').prop('disabled', true); 99 $.post( _.url, settings, function(data, textStatus, jqXHR) { 100 101 _.downloadFile({ 102 id : 'siteexport_site_aggregator_downloader', 103 src: window.location.origin + data, 104 root: 'form#siteexport_site_aggregator', 105 timeout: function(){ 106 _.aggregatorStatus.hide(); 107 } 108 }); 109 }).fail(function(jqXHR){ 110 _.aggregatorStatus.addClass('error'); 111 _.status(jqXHR.responseText); 112 }).always(function(){ 113 throbber.prop('disabled', false); 114 }); 115 }; 116 117 _.downloadFile = function(iframeProps) { 118 119 _.status(LANG.plugins.siteexport.startdownload); 120 if ( $.fileDownload ) { 121 122 $.fileDownload(iframeProps.src).done(function(){ 123 _.status(LANG.plugins.siteexport.downloadfinished); 124 125 if ( typeof iframeProps.timeout == 'function' ) { 126 window.setTimeout(iframeProps.timeout, 2000); 127 } 128 129 }).fail(function(){ 130 _.error(LANG.plugins.siteexport.finishedbutdownloadfailed); 131 }); 132 133 return; 134 } 135 136 var frameQuery = "iframe#" + iframeProps.id; 137 var frame = $(frameQuery); 138 if ( frame.size() == 0 ) { 139 frame = $('<iframe/>') 140 .hide() 141 .appendTo(iframeProps.root) 142 .prop({ 143 type : 'application/octet-stream', 144 id : iframeProps.id, 145 }); 146 } 147 148 // Downloads do not generate a load event 149 frame.load(function(event){ 150 _.status(LANG.plugins.siteexport.downloadfinished); 151 152 // This must only happen when not downloading, meaning we have a PDF file. 153 // ENSURE THIS IS THE ONLY CASE! 154 // frame.remove(); 155 156 if ( $.popupviewer ) { 157 158 var clone = frame.clone().css({ 159 border: 'none' 160 }).show(); 161 162 frame.remove(); 163 164 var viewer = new $.popupviewer(); 165 viewer.showViewer(); 166 167 $("div#popupviewer div.content").html(clone); 168 viewer.resizePopup($(window).width(), $(window).height(), null, clone, false, false); 169 } else { 170 // No Popup? Open right here 171 document.location.href = iframeProps.src; 172 } 173 }); 174 175 frame.attr('src', iframeProps.src); 176 if ( typeof iframeProps.timeout == 'function' ) { 177 window.setTimeout(iframeProps.timeout, 2000); 178 } 179 180 $(window).unload(function(){ 181 // last resort or the frame might reload 182 frame.remove(); 183 }); 184 }; 185 186 _.addSite = function(site) { 187 188 var settings = _.settings('__siteexport_addsite'); 189 settings.push({ 190 name: 'site', 191 value: site 192 },{ 193 name: 'pattern', 194 value: this.pattern 195 },{ 196 name: 'base', 197 value: DOKU_BASE 198 }); 199 200 _.throbber(true); 201 $.post( _.url, settings, function(data, textStatus, jqXHR) { 202 _.zipURL = data.split("\n").pop(); 203 _.nextPage(); 204 }).fail(function(jqXHR){ 205 _.errorLog(jqXHR.responseText); 206 _.errorCount++; 207 }).always(function(){ 208 _.throbber(false); 209 }); 210 }; 211 212 _.nextPage = function() { 213 if (!this.allPages) { 214 return; 215 } 216 217 var page = this.allPages.shift(); 218 219 if (!page) { 220 if (_.zipURL != "" && _.zipURL != 'undefined' && typeof _.zipURL != 'undefined' ) { 221 222 _.downloadFile({ 223 id : 'siteexport_downloader', 224 src: window.location.origin + _.zipURL, 225 root: '#siteexport', 226 }); 227 228 } else { 229 _.status(LANG.plugins.siteexport.finishedbutdownloadfailed); 230 _.errorLog(_.zipURL); 231 } 232 return; 233 } 234 235 if (!page) { 236 this.nextPage(); 237 } 238 239 _.status('Adding "' + page + '" ' + this.pages(this.currentCount++)); 240 _.addSite(page); 241 }; 242 243 _.pages = function() { 244 return '( ' 245 + _.currentCount 246 + ' / ' 247 + _.pageCount 248 + (_.errorCount && _.errorCount != 0 ? ' / <span style="color: #a00">' + _.errorCount + '</span>' 249 : '') + ' )'; 250 }; 251 252 _.status = function(text) { 253 $('#siteexport__out').html(text).removeClass('error'); 254 }; 255 256 _.error = function(text) { 257 $('#siteexport__out').html(text).addClass('error'); 258 }; 259 260 _.settings = function(call) { 261 var settings = $(_.allElements).serializeArray(); 262 263 if (call)settings.push({ name: 'call', value: call}); 264 if ( $('input#pdfExport:checked').size() > 0 )settings.push({ name: 'renderer', value: 'siteexport_pdf'}); // is disabled and would not get pushed 265 return settings; 266 }; 267 268 _.cleanSettings = function(call) { 269 270 return _.settings(call).filter(function(element){ 271 272 if ( element.value == NS || element.value == JSINFO.id || element.value == JSINFO.namespace ) { element.name = null; } 273 if ( !isNaN(element.value) ) element.value = parseInt(element.value); 274 return element.name && _.forbidden_options.indexOf(element.name) < 0 && (element.value.length > 0 || (!isNaN(element.value) && element.value > 0)); 275 }); 276 }; 277 278 /** 279 * Display the loading gif 280 */ 281 _.throbberCount = 0; 282 _.throbber = function(on) { 283 284 _.throbberCount += (on?1:-1); 285 $('#siteexport__throbber').css('visibility', _.throbberCount>0 ? 'visible' : 'hidden'); 286 }; 287 288 _.resetDataForNewRequest = function() { 289 290 this.pageCount = 0; 291 this.currentCount = 0; 292 this.errorCount = 0; 293 this.allPages = []; 294 this.zipURL = ''; 295 this.pattern = ''; 296 297 this.status(''); 298 this.resetErrorLog(); 299 }; 300 301 /** 302 * Log errors into container 303 */ 304 _.errorLog = function(text) { 305 306 if (!text) { 307 return; 308 } 309 310 if (!$('#siteexport__errorlog').size()) { 311 $('#siteexport__out').parent().append($('<div id="siteexport__errorlog"></div>')); 312 } 313 314 var msg = text.split("\n"); 315 for ( var int = 0; int < msg.length; int++) { 316 317 var txtMsg = msg[int]; 318 txtMsg = txtMsg.replace(new RegExp("^runtime error:", "i"), ""); 319 320 if (txtMsg.length == 0) { 321 continue; 322 } 323 324 $('#siteexport__errorlog').append($('<p></p>').text(txtMsg.replace(new RegExp( 325 "</?.*?>", "ig"), ""))); 326 } 327 }; 328 329 _.resetErrorLog = function() { 330 $('#siteexport__errorlog').remove(); 331 }; 332 333 _.toggleDisableAllPlugins = function(input) { 334 $('#siteexport :input[name=disableplugin\\[\\]]:not([disabled=disabled])').prop('checked', input.checked); 335 }; 336 337 338 _.addCustomOption = function(nameVal, valueVal) { 339 340 if ( typeof nameVal == 'undefined' ) 341 { 342 nameVal = 'name'; 343 } 344 345 if ( typeof valueVal == 'undefined' ) 346 { 347 valueVal = 'value'; 348 } 349 350 351 var regenerate = function(event) { 352 event.stopPropagation(); 353 _.generate(); 354 }; 355 356 var name = $('<input/>').addClass('edit').attr({ name: 'customoptionname[]', value: nameVal}).change(regenerate).click(function(){this.select();}); 357 var value = $('<input/>').addClass('edit').attr({ name: 'customoptionvalue[]', value: valueVal}).change(regenerate).click(function(){this.select();}); 358 359 $('<li/>').append(name).append(value).appendTo('#siteexport__customActions'); 360 }; 361 362 _.cronAction = function(action, cronExists, successstatus) { 363 _.resetDataForNewRequest(); 364 _.throbber(true); 365 366 $.post( this.url, _.settings(action), function(data){ 367 _.updateCronStatusExists(cronExists, true); 368 _.status('Successfully <b>'+successstatus+'</b> the Cron Job'); 369 }).fail(function(jqXHR){ 370 _.errorLog(jqXHR.responseText); 371 }).always(function(){ 372 _.throbber(false); 373 }); 374 }; 375 376 _.saveCron = function() { 377 _.cronAction('__siteexport_savecron', true, 'saved'); 378 }; 379 380 _.deleteCron = function() { 381 _.cronAction('__siteexport_deletecron', false, 'deleted'); 382 }; 383 384 385 _.updateCronStatusExists = function(cronExists, updateDeleteButton) { 386 387 // Cron is not enabled. 388 if (!$('form#siteexport :input[type=submit][name=do\\[cronSaveAction\\]]').size()) { 389 return; 390 } 391 392 if (!updateDeleteButton && updateDeleteButton !== false) { 393 updateDeleteButton = true; 394 } 395 396 $('#cronSaveAction').attr('disabled', cronExists); 397 398 if (updateDeleteButton) { 399 $('#cronDeleteAction').css( 'display', cronExists ? 'block' : 'none'); 400 401 $('#cronOverwriteExisting').change(function(event) { 402 event.stopPropagation(); 403 _.updateCronStatusExists($('form#siteexport :input[type=submit][name=do\\[cronSaveAction\\]]').attr( 404 'disabled') != 'disabled', false); 405 }); 406 } 407 }; 408 409 _.updateValue = function( elem, value ) { 410 if ( !elem.size() ) { 411 return; 412 } 413 switch(elem[0].type) { 414 case 'checkbox': elem.prop('checked', elem.val() == value); break; 415 case 'select-one': 416 case 'select': { 417 418 var selected = false; 419 elem.find('option').each(function(){ 420 if ( $(this).val() == value ) { 421 $(this).prop('selected', true); 422 selected = true; 423 return false; 424 } 425 }); 426 427 if ( !selected && !isNaN(value) ) { 428 elem.find('option:eq('+value+')').prop('selected', true); 429 } 430 431 break; 432 } 433 default: elem.val(value); 434 } 435 }; 436 437 _.setValues = function(values) { 438 439 $(_.allElements + ':not(:checkbox)').val(null); 440 $(_.allElements + ':checkbox').prop('checked', false); 441 $('#siteexport__customActions').html(""); 442 443 _.suspendGenerate = true; 444 for ( var node in values ) { 445 446 var value = values[node]; 447 var elem = null; 448 449 if ( typeof value == 'object' ) { 450 for ( var val in value ) { 451 _.updateValue($('#siteexport #'+node+'_'+value[val]+':input[name='+node+'\\[\\]]'), value[val]); 452 } 453 } else { 454 _.updateValue($('#siteexport :input[name='+node+']'), value); 455 } 456 } 457 458 // Custom Options 459 for ( var index in values['customoptionname'] ) { 460 461 try { 462 var name = values['customoptionname'][index]; 463 var value = values['customoptionvalue'][index]; 464 _.addCustomOption(name, value); 465 } catch (e) { 466 _.errorLog(e); 467 } 468 } 469 470 _.suspendGenerate = false; 471 }; 472 473 _.showCronJobs = function() { 474 _.resetDataForNewRequest(); 475 _.throbber(true); 476 477 $.post( this.url, _.settings('__siteexport_showcron'), function(data){ 478 479 data = $.parseJSON(data); 480 if ( data === null ) { 481 _.errorLog("No Valid CronData given."); 482 return; 483 } 484 485 if ( !$('#siteexport__cronList').size() ) { 486 $('#showcronjobs').parent().append($('<ul id="siteexport__cronList"/>')); 487 } else { 488 $('#siteexport__cronList').html(""); 489 } 490 491 for ( var pattern in data) { 492 493 var name = $('<span/>').text(pattern + ' ' + data[pattern]['ns']); 494 var show = $('<button/>').addClass('button').attr('pattern', pattern).text('view').click(function(event) { 495 event.stopPropagation(); 496 var values = data[this.getAttribute('pattern')]; 497 _.setValues(values); 498 _.generate(); 499 500 return false; 501 }); 502 503 $('<li/>').append(name).append(show).appendTo('#siteexport__cronList'); 504 } 505 506 507 }).fail(function(jqXHR){ 508 _.errorLog(jqXHR.responseText); 509 }).always(function(){ 510 _.throbber(false); 511 }); 512 }; 513 514 }(siteexportadmin.prototype)); 515 516 var __siteexport = null; 517 $.siteexport = function() { 518 if ( __siteexport == null ) { 519 __siteexport = new siteexportadmin(); 520 } 521 522 return __siteexport; 523 }; 524 525 $.siteexport().generate(); 526 $('#siteexport :input').each(function(index, element){ 527 $(this).change(function(event){ 528 event.stopPropagation(); 529 $.siteexport().generate(); 530 }); 531 }); 532 533 $('form#siteexport :input[type=submit][name~=do\\[siteexport\\]]').click(function(event){ 534 event.stopPropagation(); 535 $.siteexport().run(); 536 return false; 537 }); 538 539 $('form#siteexport_site_aggregator :input[type=submit][name~=do\\[siteexport\\]]').click(function(event){ 540 event.stopPropagation(); 541 $.siteexport().runAggregator(); 542 return false; 543 }); 544 545 $('form#siteexport #depthType:input').change(function(event){ 546 event.stopPropagation(); 547 if ( parseInt($(this).val()) == 2 ) { 548 $('div#depthContainer').show(); 549 } else { 550 $('div#depthContainer').hide(); 551 } 552 }); 553 554 555 $('form#siteexport #pdfExport:input').change(function(event){ 556 event.stopPropagation(); 557 $('form#siteexport #renderer').find('option[value=siteexport_pdf]').prop('selected', this.checked); 558 $('form#siteexport #renderer').prop('disabled', this.checked); 559 }); 560 561 $('form#siteexport #disableall:input').change(function(event){ 562 event.stopPropagation(); 563 $.siteexport().toggleDisableAllPlugins(this); 564 }); 565 566 $('form#siteexport :input[name=disableplugin\\[\\]]').change(function(event){ 567 event.stopPropagation(); 568 569 if ( !this.checked && $('form#siteexport #disableall:input').prop('checked') ) { 570 $('form#siteexport #disableall:input').prop('checked', false); 571 } 572 }); 573 574 $('form#siteexport :input[type=submit][name=do\\[addoption\\]]').click(function(event){ 575 event.stopPropagation(); 576 $.siteexport().addCustomOption(); 577 return false; 578 }); 579 580 $('form#siteexport :input[type=submit][name=do\\[cronDeleteAction\\]]').click(function(event){ 581 event.stopPropagation(); 582 $.siteexport().deleteCron(); 583 return false; 584 }); 585 586 $('form#siteexport :input[type=submit][name=do\\[cronSaveAction\\]]').click(function(event){ 587 event.stopPropagation(); 588 $.siteexport().saveCron(); 589 return false; 590 }); 591 592 $('form#siteexport a#showcronjobs').click(function(event){ 593 event.stopPropagation(); 594 $.siteexport().showCronJobs(); 595 return false; 596 }); 597 598 599 }); 600})(jQuery); 601