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 }).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, new RegExp("&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 87 _.aggregatorStatus = null; 88 _.runAggregator = function() { 89 90 this.resetDataForNewRequest(); 91 92 if ( _.aggregatorStatus == null ) { 93 _.aggregatorStatus = $('<span id="siteexport__out"/>').appendTo("form#siteexport_site_aggregator"); 94 } 95 96 _.status(LANG.plugins.siteexport.loadingpage); 97 _.aggregatorStatus.removeClass('error').show(); 98 var settings = _.settings('__siteexport_aggregate'); 99 var throbber = $('form#siteexport_site_aggregator :input[name=baseID], form#siteexport_site_aggregator :input[type=submit]').prop('disabled', true); 100 $.post( _.url, settings, function(data, textStatus, jqXHR) { 101 102 if ( data.match( new RegExp( 'mpdf error', 'i' ) ) ) { 103 _.aggregatorStatus.addClass('error'); 104 _.status(data); 105 } else { 106 _.downloadFile({ 107 id : 'siteexport_site_aggregator_downloader', 108 src: window.location.origin + data, 109 root: 'form#siteexport_site_aggregator', 110 timeout: function(){ 111 _.aggregatorStatus.hide(); 112 } 113 }); 114 } 115 116 }).fail(function(jqXHR){ 117 _.aggregatorStatus.addClass('error'); 118 _.status(jqXHR.responseText.replace("\n", "<br/>")); 119 }).always(function(){ 120 throbber.prop('disabled', false); 121 }); 122 }; 123 124 _.downloadFile = function(iframeProps) { 125 126 _.status(LANG.plugins.siteexport.startdownload); 127 if ( $.fileDownload ) { 128 129 $.fileDownload(iframeProps.src).done(function(){ 130 _.status(LANG.plugins.siteexport.downloadfinished); 131 132 if ( typeof iframeProps.timeout == 'function' ) { 133 window.setTimeout(iframeProps.timeout, 2000); 134 } 135 136 }).fail(function(){ 137 _.error(LANG.plugins.siteexport.finishedbutdownloadfailed); 138 }); 139 140 return; 141 } 142 143 var frameQuery = "iframe#" + iframeProps.id; 144 var frame = $(frameQuery); 145 if ( frame.size() == 0 ) { 146 frame = $('<iframe/>') 147 .hide() 148 .appendTo(iframeProps.root) 149 .prop({ 150 type : 'application/octet-stream', 151 id : iframeProps.id 152 }); 153 } 154 155 // Downloads do not generate a load event 156 frame.load(function(event){ 157 _.status(LANG.plugins.siteexport.downloadfinished); 158 159 // This must only happen when not downloading, meaning we have a PDF file. 160 // ENSURE THIS IS THE ONLY CASE! 161 // frame.remove(); 162 163 if ( $.popupviewer ) { 164 165 var clone = frame.clone().css({ 166 border: 'none' 167 }).show(); 168 169 frame.remove(); 170 171 var viewer = new $.popupviewer(); 172 viewer.showViewer(); 173 174 $("div#popupviewer div.content").html(clone); 175 viewer.resizePopup($(window).width(), $(window).height(), null, clone, false, false); 176 } else { 177 // No Popup? Open right here 178 document.location.href = iframeProps.src; 179 } 180 }); 181 182 frame.attr('src', iframeProps.src); 183 if ( typeof iframeProps.timeout == 'function' ) { 184 window.setTimeout(iframeProps.timeout, 2000); 185 } 186 187 $(window).unload(function(){ 188 // last resort or the frame might reload 189 frame.remove(); 190 }); 191 }; 192 193 _.addSite = function(site) { 194 195 var settings = _.settings('__siteexport_addsite'); 196 settings.push({ 197 name: 'site', 198 value: site 199 },{ 200 name: 'pattern', 201 value: this.pattern 202 },{ 203 name: 'base', 204 value: DOKU_BASE 205 }); 206 207 _.throbber(true); 208 $.post( _.url, settings, function(data, textStatus, jqXHR) { 209 _.zipURL = data.split("\n").pop(); 210 _.nextPage(); 211 }).fail(function(jqXHR){ 212 _.errorLog(jqXHR.responseText); 213 _.errorCount++; 214 }).always(function(){ 215 _.throbber(false); 216 }); 217 }; 218 219 _.nextPage = function() { 220 if (!this.allPages) { 221 return; 222 } 223 224 var page = this.allPages.shift(); 225 226 if (!page) { 227 if (_.zipURL != "" && _.zipURL != 'undefined' && typeof _.zipURL != 'undefined' ) { 228 229 _.downloadFile({ 230 id : 'siteexport_downloader', 231 src: window.location.origin + _.zipURL, 232 root: '#siteexport' 233 }); 234 235 } else { 236 _.status(LANG.plugins.siteexport.finishedbutdownloadfailed); 237 _.errorLog(_.zipURL); 238 } 239 return; 240 } 241 242 if (!page) { 243 this.nextPage(); 244 } 245 246 _.status('Adding "' + page + '" ' + this.pages(this.currentCount++)); 247 _.addSite(page); 248 }; 249 250 _.pages = function() { 251 return '( ' 252 + _.currentCount 253 + ' / ' 254 + _.pageCount 255 + (_.errorCount && _.errorCount != 0 ? ' / <span style="color: #a00">' + _.errorCount + '</span>' 256 : '') + ' )'; 257 }; 258 259 _.status = function(text) { 260 $('#siteexport__out').html(text).removeClass('error'); 261 }; 262 263 _.error = function(text) { 264 $('#siteexport__out').html(text).addClass('error'); 265 }; 266 267 _.settings = function(call) { 268 var settings = $(_.allElements).serializeArray(); 269 270 if (call) { settings.push({ name: 'call', value: call}); } 271 if ( $('input#pdfExport:checked').size() > 0 ) { settings.push({ name: 'renderer', value: 'siteexport_pdf'}); } // is disabled and would not get pushed 272 return settings; 273 }; 274 275 _.cleanSettings = function(call) { 276 277 return _.settings(call).filter(function(element){ 278 279 if ( element.value == NS || element.value == JSINFO.id || element.value == JSINFO.namespace ) { element.name = null; } 280 if ( !isNaN(element.value) ) { element.value = parseInt(element.value); } 281 return element.name && _.forbidden_options.indexOf(element.name) < 0 && (element.value.length > 0 || (!isNaN(element.value) && element.value > 0)); 282 }); 283 }; 284 285 /** 286 * Display the loading gif 287 */ 288 _.throbberCount = 0; 289 _.throbber = function(on) { 290 291 _.throbberCount += (on?1:-1); 292 $('#siteexport__throbber').css('visibility', _.throbberCount>0 ? 'visible' : 'hidden'); 293 }; 294 295 _.resetDataForNewRequest = function() { 296 297 this.pageCount = 0; 298 this.currentCount = 0; 299 this.errorCount = 0; 300 this.allPages = []; 301 this.zipURL = ''; 302 this.pattern = ''; 303 304 this.status(''); 305 this.resetErrorLog(); 306 }; 307 308 /** 309 * Log errors into container 310 */ 311 _.errorLog = function(text) { 312 313 if (!text) { 314 return; 315 } 316 317 if (!$('#siteexport__errorlog').size()) { 318 $('#siteexport__out').parent().append($('<div id="siteexport__errorlog"></div>')); 319 } 320 321 var msg = text.split("\n"); 322 for ( var int = 0; int < msg.length; int++) { 323 324 var txtMsg = msg[int]; 325 txtMsg = txtMsg.replace(new RegExp("^runtime error:", "i"), ""); 326 327 if (txtMsg.length == 0) { 328 continue; 329 } 330 331 $('#siteexport__errorlog').append($('<p></p>').text(txtMsg.replace(new RegExp( 332 "</?.*?>", "ig"), ""))); 333 } 334 }; 335 336 _.resetErrorLog = function() { 337 $('#siteexport__errorlog').remove(); 338 }; 339 340 _.toggleDisableAllPlugins = function(input) { 341 $('#siteexport :input[name=disableplugin\\[\\]]:not([disabled=disabled])').prop('checked', input.checked); 342 }; 343 344 345 _.addCustomOption = function(nameVal, valueVal) { 346 347 if ( typeof nameVal == 'undefined' ) 348 { 349 nameVal = 'name'; 350 } 351 352 if ( typeof valueVal == 'undefined' ) 353 { 354 valueVal = 'value'; 355 } 356 357 358 var regenerate = function(event) { 359 event.stopPropagation(); 360 _.generate(); 361 }; 362 363 var customOption = $('<input type="hidden"/>').attr({ name: nameVal, value: valueVal}); 364 var name = $('<input/>').addClass('edit dummy').attr({ value: nameVal}).change(function(event) 365 { 366 customOption.attr({ name: this.value }); regenerate(event); 367 }).click(function(){this.select();}); 368 var value = $('<input/>').addClass('edit dummy').attr({ value: valueVal}).change(function(event) 369 { 370 customOption.attr({ value: this.value }); regenerate(event); 371 }).click(function(){this.select();}); 372 373 374 $('<li/>').append(name).append(value).append(customOption).appendTo('#siteexport__customActions'); 375 }; 376 377 _.updateValue = function( elem, value ) { 378 if ( !elem.size() ) { 379 return; 380 } 381 switch(elem[0].type) { 382 case 'checkbox': elem.prop('checked', elem.val() == value); break; 383 case 'select-one': 384 case 'select': { 385 386 var selected = false; 387 elem.find('option').each(function(){ 388 if ( $(this).val() == value ) { 389 $(this).prop('selected', true); 390 selected = true; 391 return false; 392 } 393 }); 394 395 if ( !selected && !isNaN(value) ) { 396 elem.find('option:eq('+value+')').prop('selected', true); 397 } 398 399 break; 400 } 401 default: elem.val(value); 402 } 403 }; 404 405 _.setValues = function(values) { 406 407 $(_.allElements + ':not(:checkbox)').val(null); 408 $(_.allElements + ':checkbox').prop('checked', false); 409 $('#siteexport__customActions').html(""); 410 411 _.suspendGenerate = true; 412 for ( var node in values ) { 413 414 var value = values[node]; 415 var elem = null; 416 417 if ( typeof value == 'object' ) { 418 for ( var val in value ) { 419 _.updateValue($('#siteexport #'+node+'_'+value[val]+':input[name='+node+'\\[\\]]'), value[val]); 420 } 421 } else { 422 _.updateValue($('#siteexport :input[name='+node+']'), value); 423 } 424 } 425 426 // Custom Options 427 for ( var index in values['customoptionname'] ) { 428 429 try { 430 _.addCustomOption(values['customoptionname'][index], values['customoptionvalue'][index]); 431 } catch (e) { 432 _.errorLog(e); 433 } 434 } 435 436 _.suspendGenerate = false; 437 }; 438 439 }(siteexportadmin.prototype)); 440 441 var __siteexport = null; 442 $.siteexport = function() { 443 if ( __siteexport == null ) { 444 __siteexport = new siteexportadmin(); 445 } 446 447 return __siteexport; 448 }; 449 450 $.siteexport().generate(); 451 $('#siteexport :input').each(function(index, element){ 452 $(this).change(function(event){ 453 event.stopPropagation(); 454 $.siteexport().generate(); 455 }); 456 }); 457 458 $('form#siteexport :input[type=submit][name~=do\\[siteexport\\]]').click(function(event){ 459 event.stopPropagation(); 460 $.siteexport().run(); 461 return false; 462 }); 463 464 $('form#siteexport_site_aggregator :input[type=submit][name~=do\\[siteexport\\]]').click(function(event){ 465 event.stopPropagation(); 466 $.siteexport().runAggregator(); 467 return false; 468 }); 469 470 $('form#siteexport #depthType:input').change(function(event){ 471 event.stopPropagation(); 472 if ( parseInt($(this).val()) == 2 ) { 473 $('div#depthContainer').show(); 474 } else { 475 $('div#depthContainer').hide(); 476 } 477 }); 478 479 480 $('form#siteexport #pdfExport:input').change(function(event){ 481 event.stopPropagation(); 482 $('form#siteexport #renderer').find('option[value=siteexport_pdf]').prop('selected', this.checked); 483 $('form#siteexport #renderer').prop('disabled', this.checked); 484 }); 485 486 $('form#siteexport select#renderer').change(function(event){ 487 event.stopPropagation(); 488 $('form#siteexport #pdfExport:input, form#siteexport select#template').prop('disabled', $(this).prop('value') == 'dw2pdf'); 489 }); 490 491 492 $('form#siteexport #disableall:input').change(function(event){ 493 event.stopPropagation(); 494 $.siteexport().toggleDisableAllPlugins(this); 495 }); 496 497 $('form#siteexport :input[name=disableplugin\\[\\]]').change(function(event){ 498 event.stopPropagation(); 499 500 if ( !this.checked && $('form#siteexport #disableall:input').prop('checked') ) { 501 $('form#siteexport #disableall:input').prop('checked', false); 502 } 503 }); 504 505 $('form#siteexport :input[type=submit][name=do\\[addoption\\]]').click(function(event){ 506 event.stopPropagation(); 507 $.siteexport().addCustomOption(); 508 return false; 509 }); 510 511 }); 512})(jQuery); 513