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