1// Siteexport Admin Plugin Script 2(function($){ 3 $(function(){ 4 5 if ( !$('form#siteexport').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 = false; 22 _.allElements = 'form#siteexport :input:not([readonly]):not([disabled]):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 _.addSite = function(site) { 84 85 var settings = _.settings('__siteexport_addsite'); 86 settings.site = site; 87 settings.pattern = this.pattern; 88 settings.base = DOKU_BASE; 89 90 _.throbber(true); 91 $.post( _.url, settings, function(data, textStatus, jqXHR) { 92 _.zipURL = data.split("\n").pop(); 93 _.nextPage(); 94 }).fail(function(jqXHR){ 95 _.errorLog(jqXHR.responseText); 96 _.errorCount++; 97 }).always(function(){ 98 _.throbber(false); 99 }); 100 }; 101 102 _.nextPage = function() { 103 if (!this.allPages) { 104 return; 105 } 106 107 var page = this.allPages.shift(); 108 109 if (!page) { 110 _.status('Finished'); 111 if (_.zipURL != "" && _.zipURL != 'undefined' && typeof _.zipURL != 'undefined' ) { 112 113 var frame = $('<iframe>') 114 .hide() 115 .prop({ 116 type : 'application/octet-stream', 117 src : window.location.origin + _.zipURL 118 }) 119 .load(function(e){ 120 _.status('Download completed.'); 121 frame.remove(); 122 }).appendTo('#siteexport'); 123 _.status('Starting Download.'); 124 } else { 125 _.status('Finished - download failed. Please check your settings.'); 126 _.errorLog(_.zipURL); 127 } 128 return; 129 } 130 131 if (!page) { 132 this.nextPage(); 133 } 134 135 _.status('Adding "' + page + '" ' + this.pages(this.currentCount++)); 136 _.addSite(page); 137 }; 138 139 _.pages = function() { 140 return '( ' 141 + _.currentCount 142 + ' / ' 143 + _.pageCount 144 + (_.errorCount && _.errorCount != 0 ? ' / <span style="color: #a00">' + _.errorCount + '</span>' 145 : '') + ' )'; 146 }; 147 148 _.status = function(text) { 149 $('#siteexport__out').html(text); 150 }; 151 152 _.settings = function(call) { 153 var settings = $(_.allElements).serializeArray(); 154 if (call)settings.push({ name: 'call', value: call}); 155 return settings; 156 }; 157 158 _.cleanSettings = function(call) { 159 160 return _.settings(call).filter(function(element){ 161 162 if ( element.value == NS || element.value == JSINFO.id || element.value == JSINFO.namespace ) { element.name = null; } 163 if ( !isNaN(element.value) ) element.value = parseInt(element.value); 164 return element.name && _.forbidden_options.indexOf(element.name) < 0 && (element.value.length > 0 || (!isNaN(element.value) && element.value > 0)); 165 }); 166 }; 167 168 /** 169 * Display the loading gif 170 */ 171 _.throbberCount = 0; 172 _.throbber = function(on) { 173 174 _.throbberCount += (on?1:-1); 175 $('#siteexport__throbber').css('visibility', _.throbberCount>0 ? 'visible' : 'hidden'); 176 }; 177 178 _.resetDataForNewRequest = function() { 179 180 this.pageCount = 0; 181 this.currentCount = 0; 182 this.errorCount = 0; 183 this.allPages = []; 184 this.zipURL = ''; 185 this.pattern = ''; 186 187 this.status(''); 188 this.resetErrorLog(); 189 }; 190 191 /** 192 * Log errors into container 193 */ 194 _.errorLog = function(text) { 195 196 if (!text) { 197 return; 198 } 199 200 if (!$('#siteexport__errorlog').size()) { 201 $('#siteexport__out').parent().append($('<div id="siteexport__errorlog"></div>')); 202 } 203 204 var msg = text.split("\n"); 205 for ( var int = 0; int < msg.length; int++) { 206 207 var txtMsg = msg[int]; 208 txtMsg = txtMsg.replace(new RegExp("^runtime error:", "i"), ""); 209 210 if (txtMsg.length == 0) { 211 continue; 212 } 213 214 $('#siteexport__errorlog').append($('<p></p>').text(txtMsg.replace(new RegExp( 215 "</?.*?>", "ig"), ""))); 216 } 217 }; 218 219 _.resetErrorLog = function() { 220 $('#siteexport__errorlog').remove(); 221 }; 222 223 _.toggleDisableAllPlugins = function(input) { 224 $('#siteexport :input[name=disableplugin\\[\\]]:not([disabled=disabled])').prop('checked', input.checked); 225 }; 226 227 228 _.addCustomOption = function(nameVal, valueVal) { 229 230 if ( typeof nameVal == 'undefined' ) 231 { 232 nameVal = 'name'; 233 } 234 235 if ( typeof valueVal == 'undefined' ) 236 { 237 valueVal = 'value'; 238 } 239 240 241 var regenerate = function(event) { 242 event.stopPropagation(); 243 _.generate(); 244 }; 245 246 var name = $('<input/>').addClass('edit').attr({ name: 'customoptionname[]', value: nameVal}).change(regenerate).click(function(){this.select()}); 247 var value = $('<input/>').addClass('edit').attr({ name: 'customoptionvalue[]', value: valueVal}).change(regenerate).click(function(){this.select()}); 248 249 $('<li/>').append(name).append(value).appendTo('#siteexport__customActions'); 250 }; 251 252 _.cronAction = function(action, cronExists, successstatus) { 253 _.resetDataForNewRequest(); 254 _.throbber(true); 255 256 $.post( this.url, _.settings(action), function(data){ 257 _.updateCronStatusExists(cronExists, true); 258 _.status('Successfully <b>'+successstatus+'</b> the Cron Job'); 259 }).fail(function(jqXHR){ 260 _.errorLog(jqXHR.responseText); 261 }).always(function(){ 262 _.throbber(false); 263 }); 264 }; 265 266 _.saveCron = function() { 267 _.cronAction('__siteexport_savecron', true, 'saved'); 268 }; 269 270 _.deleteCron = function() { 271 _.cronAction('__siteexport_deletecron', false, 'deleted'); 272 }; 273 274 275 _.updateCronStatusExists = function(cronExists, updateDeleteButton) { 276 277 // Cron is not enabled. 278 if (!$('form#siteexport :input[type=submit][name=do\\[cronSaveAction\\]]').size()) { 279 return; 280 } 281 282 if (!updateDeleteButton && updateDeleteButton !== false) { 283 updateDeleteButton = true; 284 } 285 286 $('#cronSaveAction').attr('disabled', cronExists); 287 288 if (updateDeleteButton) { 289 $('#cronDeleteAction').css( 'display', cronExists ? 'block' : 'none'); 290 291 $('#cronOverwriteExisting').change(function(event) { 292 event.stopPropagation(); 293 _.updateCronStatusExists($('form#siteexport :input[type=submit][name=do\\[cronSaveAction\\]]').attr( 294 'disabled') != 'disabled', false); 295 }); 296 } 297 }; 298 299 _.updateValue = function( elem, value ) { 300 if ( !elem.size() ) { 301 return; 302 } 303 switch(elem[0].type) { 304 case 'checkbox': elem.prop('checked', elem.val() == value); break; 305 case 'select-one': 306 case 'select': { 307 308 var selected = false; 309 elem.find('option').each(function(){ 310 if ( $(this).val() == value ) { 311 $(this).prop('selected', true); 312 selected = true; 313 return false; 314 } 315 }); 316 317 if ( !selected && !isNaN(value) ) { 318 elem.find('option:eq('+value+')').prop('selected', true); 319 } 320 321 break; 322 } 323 default: elem.val(value); 324 } 325 }; 326 327 _.setValues = function(values) { 328 329 $(_.allElements + ':not(:checkbox)').val(null); 330 $(_.allElements + ':checkbox').prop('checked', false); 331 $('#siteexport__customActions').html(""); 332 333 _.suspendGenerate = true; 334 for ( var node in values ) { 335 336 var value = values[node]; 337 var elem = null; 338 339 if ( typeof value == 'object' ) { 340 for ( var val in value ) { 341 _.updateValue($('#siteexport #'+node+'_'+value[val]+':input[name='+node+'\\[\\]]'), value[val]); 342 } 343 } else { 344 _.updateValue($('#siteexport :input[name='+node+']'), value); 345 } 346 } 347 348 // Custom Options 349 for ( var index in values['customoptionname'] ) { 350 351 try { 352 var name = values['customoptionname'][index]; 353 var value = values['customoptionvalue'][index]; 354 _.addCustomOption(name, value); 355 } catch (e) { 356 _.errorLog(e); 357 } 358 } 359 360 _.suspendGenerate = false; 361 }; 362 363 _.showCronJobs = function() { 364 _.resetDataForNewRequest(); 365 _.throbber(true); 366 367 $.post( this.url, _.settings('__siteexport_showcron'), function(data){ 368 369 data = $.parseJSON(data); 370 if ( data === null ) { 371 _.errorLog("No Valid CronData given."); 372 return; 373 } 374 375 if ( !$('#siteexport__cronList').size() ) { 376 $('#showcronjobs').parent().append($('<ul id="siteexport__cronList"/>')); 377 } else { 378 $('#siteexport__cronList').html(""); 379 } 380 381 for ( var pattern in data) { 382 383 var name = $('<span/>').text(pattern + ' ' + data[pattern]['ns']); 384 var show = $('<button/>').addClass('button').attr('pattern', pattern).text('view').click(function(event) { 385 event.stopPropagation(); 386 var values = data[this.getAttribute('pattern')]; 387 _.setValues(values); 388 _.generate(); 389 390 return false; 391 }); 392 393 $('<li/>').append(name).append(show).appendTo('#siteexport__cronList'); 394 } 395 396 397 }).fail(function(jqXHR){ 398 _.errorLog(jqXHR.responseText); 399 }).always(function(){ 400 _.throbber(false); 401 }); 402 }; 403 404 }(siteexportadmin.prototype)); 405 406 var __siteexport = null; 407 $.siteexport = function() { 408 if ( __siteexport == null ) { 409 __siteexport = new siteexportadmin(); 410 } 411 412 return __siteexport; 413 }; 414 415 $.siteexport().generate(); 416 $('#siteexport :input').each(function(index, element){ 417 $(this).change(function(event){ 418 event.stopPropagation(); 419 $.siteexport().generate(); 420 }); 421 }); 422 423 $('form#siteexport :input[type=submit][name~=do\\[siteexport\\]]').click(function(event){ 424 event.stopPropagation(); 425 $.siteexport().run(); 426 return false; 427 }); 428 429 $('form#siteexport #depthType:input').change(function(event){ 430 event.stopPropagation(); 431 if ( parseInt($(this).val()) == 2 ) { 432 $('div#depthContainer').show(); 433 } else { 434 $('div#depthContainer').hide(); 435 } 436 }); 437 438 439 $('form#siteexport #pdfExport:input').change(function(event){ 440 event.stopPropagation(); 441 $('form#siteexport #renderer').find('option[value=siteexport_pdf]').prop('selected', this.checked); 442 $('form#siteexport #renderer').prop('disabled', this.checked); 443 }); 444 445 $('form#siteexport #disableall:input').change(function(event){ 446 event.stopPropagation(); 447 $.siteexport().toggleDisableAllPlugins(this); 448 }); 449 450 $('form#siteexport :input[name=disableplugin\\[\\]]').change(function(event){ 451 event.stopPropagation(); 452 453 if ( !this.checked && $('form#siteexport #disableall:input').prop('checked') ) { 454 $('form#siteexport #disableall:input').prop('checked', false); 455 } 456 }); 457 458 $('form#siteexport :input[type=submit][name=do\\[addoption\\]]').click(function(event){ 459 event.stopPropagation(); 460 $.siteexport().addCustomOption(); 461 return false; 462 }); 463 464 $('form#siteexport :input[type=submit][name=do\\[cronDeleteAction\\]]').click(function(event){ 465 event.stopPropagation(); 466 $.siteexport().deleteCron(); 467 return false; 468 }); 469 470 $('form#siteexport :input[type=submit][name=do\\[cronSaveAction\\]]').click(function(event){ 471 event.stopPropagation(); 472 $.siteexport().saveCron(); 473 return false; 474 }); 475 476 $('form#siteexport a#showcronjobs').click(function(event){ 477 event.stopPropagation(); 478 $.siteexport().showCronJobs(); 479 return false; 480 }); 481 482 483 }); 484})(jQuery); 485