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