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