| | 428 | |
| | 429 | jQuery(document).ready( function($){ |
| | 430 | |
| | 431 | autosave_local_storage.remove_stale_data(); |
| | 432 | |
| | 433 | autosave_local_storage.display_data(); |
| | 434 | |
| | 435 | }); |
| | 436 | |
| | 437 | autosave_local_storage = { |
| | 438 | |
| | 439 | lastsaveddata:'', |
| | 440 | modified_data : {}, |
| | 441 | html:'', |
| | 442 | content : new Array(), |
| | 443 | |
| | 444 | /** |
| | 445 | * Prepares data for saving in local storage. |
| | 446 | * @return {Object} |
| | 447 | */ |
| | 448 | prepare_data: function() { |
| | 449 | |
| | 450 | var post_data = { |
| | 451 | action: "autosave", |
| | 452 | post_ID: jQuery("#post_ID").val() || 0, |
| | 453 | post_type: jQuery('#post_type').val() || "" |
| | 454 | }; |
| | 455 | |
| | 456 | if ( fullscreen && fullscreen.settings.visible ) { |
| | 457 | post_data["post_title"] = jQuery('#wp-fullscreen-title').val() || ''; |
| | 458 | post_data["content"] = jQuery("#wp_mce_fullscreen").val() || ''; |
| | 459 | } else { |
| | 460 | post_data["post_title"] = jQuery("#title").val() || ''; |
| | 461 | post_data["content"] = jQuery("#content").val() || ''; |
| | 462 | } |
| | 463 | |
| | 464 | if ( jQuery('#post_name').val() ) |
| | 465 | post_data["post_name"] = jQuery('#post_name').val(); |
| | 466 | |
| | 467 | var cats = ([]); |
| | 468 | |
| | 469 | jQuery("[name='post_category[]']:checked").each( function(i) { |
| | 470 | cats.push(this.value); |
| | 471 | } ); |
| | 472 | post_data["catslist"] = cats.join(","); |
| | 473 | |
| | 474 | if ( jQuery("#comment_status").prop("checked") ) |
| | 475 | post_data["comment_status"] = 'open'; |
| | 476 | if ( jQuery("#ping_status").prop("checked") ) |
| | 477 | post_data["ping_status"] = 'open'; |
| | 478 | if ( jQuery("#excerpt").size() ) |
| | 479 | post_data["excerpt"] = jQuery("#excerpt").val(); |
| | 480 | if ( jQuery("#post_author").size() ) |
| | 481 | post_data["post_author"] = jQuery("#post_author").val(); |
| | 482 | if ( jQuery("#parent_id").val() ) |
| | 483 | post_data["parent_id"] = jQuery("#parent_id").val(); |
| | 484 | post_data["user_ID"] = jQuery("#user-id").val(); |
| | 485 | if ( jQuery('#auto_draft').val() == '1' ) |
| | 486 | post_data["auto_draft"] = '1'; |
| | 487 | |
| | 488 | post_data["save_time"] = new Date().getTime(); |
| | 489 | |
| | 490 | post_data['storage_status'] = 'fresh'; |
| | 491 | |
| | 492 | return post_data; |
| | 493 | |
| | 494 | }, |
| | 495 | |
| | 496 | /** |
| | 497 | * Returns post id from post edit page |
| | 498 | * @return {*|int} |
| | 499 | */ |
| | 500 | get_post_id: function() { |
| | 501 | var post_id = jQuery("#post_ID").val() || 0; |
| | 502 | |
| | 503 | if( 0 < post_id ) { |
| | 504 | return post_id; |
| | 505 | } |
| | 506 | }, |
| | 507 | |
| | 508 | /** |
| | 509 | * Checks if local storage is enabled or not |
| | 510 | * @return {*} |
| | 511 | */ |
| | 512 | get_storage: function() { |
| | 513 | |
| | 514 | if ( window.localStorage ) { |
| | 515 | //have local storage container per blogid |
| | 516 | var store = localStorage.getItem( 'wp_autosave_'+commonL10n.blog_id ); |
| | 517 | |
| | 518 | if( store ) { |
| | 519 | return JSON.parse( store ); |
| | 520 | } else { |
| | 521 | return {}; |
| | 522 | } |
| | 523 | } |
| | 524 | }, |
| | 525 | |
| | 526 | set_storage: function( storage_arr ) { |
| | 527 | if ( window.localStorage ) { |
| | 528 | localStorage.setItem( 'wp_autosave_'+commonL10n.blog_id, storage_arr ); |
| | 529 | } |
| | 530 | }, |
| | 531 | |
| | 532 | /** |
| | 533 | * Misc utility function to save/delete/edit post data in local storage. |
| | 534 | * @param data |
| | 535 | * @return {*} |
| | 536 | */ |
| | 537 | handle_post_data: function( data ) { |
| | 538 | |
| | 539 | var storage_arr = this.get_storage(); |
| | 540 | |
| | 541 | if ( storage_arr ) { |
| | 542 | |
| | 543 | var post_id = this.get_post_id(); |
| | 544 | |
| | 545 | if( post_id ) { |
| | 546 | |
| | 547 | if( data ) { |
| | 548 | |
| | 549 | //we wanna get rid of particular revision if data ='del' |
| | 550 | if( 'del' === data){ |
| | 551 | |
| | 552 | if( typeof storage_arr[post_id] !== 'undefined' ) { |
| | 553 | delete storage_arr[post_id]; |
| | 554 | } |
| | 555 | |
| | 556 | } else{ |
| | 557 | storage_arr[post_id] = data; |
| | 558 | } |
| | 559 | |
| | 560 | storage_arr = JSON.stringify( storage_arr ); |
| | 561 | |
| | 562 | this.set_storage( storage_arr ); |
| | 563 | //else return data for particular post |
| | 564 | } else if( typeof storage_arr[post_id] !== 'undefined' ) { |
| | 565 | |
| | 566 | return storage_arr[post_id]; |
| | 567 | } |
| | 568 | } |
| | 569 | |
| | 570 | } |
| | 571 | }, |
| | 572 | |
| | 573 | /** |
| | 574 | * Set post data for particular post id |
| | 575 | */ |
| | 576 | set_data: function() { |
| | 577 | |
| | 578 | var post_data = this.prepare_data(); |
| | 579 | |
| | 580 | var storage_data = this.handle_post_data(); |
| | 581 | |
| | 582 | //if the content and title did not change from last server save,dont keep data in local storage |
| | 583 | if ( ( post_data["post_title"].length == 0 && post_data["content"].length == 0 ) |
| | 584 | || post_data["post_title"] + post_data["content"] == autosaveLast |
| | 585 | || post_data["post_title"] + post_data["content"] == this.lastsaveddata |
| | 586 | ) { |
| | 587 | //Save only 5 revisions if there are more remove |
| | 588 | if( storage_data && 5 < storage_data.length ) { |
| | 589 | storage_data.pop(); |
| | 590 | this.handle_post_data( storage_data ) |
| | 591 | } |
| | 592 | |
| | 593 | } else { |
| | 594 | |
| | 595 | if( storage_data ) { |
| | 596 | |
| | 597 | //Save only 5 revisions if there are more remove |
| | 598 | if( 5 < storage_data.unshift( post_data ) ) { |
| | 599 | storage_data.pop(); |
| | 600 | } |
| | 601 | |
| | 602 | } else { |
| | 603 | //post data was not available create data for our new post id |
| | 604 | var storage_data = new Array( post_data ); |
| | 605 | } |
| | 606 | |
| | 607 | //Make sre we know whats our last saved data, so we dont keep on saving same data and replace important info |
| | 608 | this.lastsaveddata = post_data["post_title"] + post_data["content"]; |
| | 609 | |
| | 610 | this.handle_post_data( storage_data ); |
| | 611 | |
| | 612 | } |
| | 613 | }, |
| | 614 | |
| | 615 | /** |
| | 616 | * Remove all data from local storage if its saved for more that 12 hours. |
| | 617 | */ |
| | 618 | remove_stale_data: function() { |
| | 619 | |
| | 620 | var stored_data = this.get_storage(); |
| | 621 | |
| | 622 | if( stored_data ) { |
| | 623 | |
| | 624 | jQuery.each( stored_data, function( key, value ) { |
| | 625 | |
| | 626 | var current_time = new Date().getTime(); |
| | 627 | |
| | 628 | var new_val_arr = new Array(); |
| | 629 | |
| | 630 | for( var i=0; i < value.length; i++ ) { |
| | 631 | |
| | 632 | var post_store = value[i]; |
| | 633 | |
| | 634 | var time_diff = current_time - post_store['save_time']; |
| | 635 | |
| | 636 | //check for 12 hr difference |
| | 637 | if( 43200000 > time_diff ) { |
| | 638 | new_val_arr.unshift( post_store ); |
| | 639 | } |
| | 640 | } |
| | 641 | if( new_val_arr && 0 < new_val_arr.length ) { |
| | 642 | autosave_local_storage.modified_data[key] = new_val_arr; |
| | 643 | } |
| | 644 | }); |
| | 645 | |
| | 646 | storage_arr = JSON.stringify( this.modified_data ); |
| | 647 | |
| | 648 | this.modified_data = ''; |
| | 649 | |
| | 650 | this.set_storage( storage_arr ); |
| | 651 | } |
| | 652 | }, |
| | 653 | |
| | 654 | /** |
| | 655 | * Escape html so we can show in div |
| | 656 | * @param content |
| | 657 | * @return {*} |
| | 658 | */ |
| | 659 | esc_html: function( content ) { |
| | 660 | |
| | 661 | content = jQuery("<div/>").text(content).html(); |
| | 662 | |
| | 663 | |
| | 664 | return content; |
| | 665 | |
| | 666 | }, |
| | 667 | |
| | 668 | /** |
| | 669 | * Show data in admin menu that one has historical saved data available for recovery in case one wants. |
| | 670 | */ |
| | 671 | display_data: function() { |
| | 672 | |
| | 673 | stored_data = this.get_storage(); |
| | 674 | |
| | 675 | if( stored_data ) { |
| | 676 | |
| | 677 | jQuery.each( stored_data, function( key, post_data ) { |
| | 678 | |
| | 679 | for( var i= post_data.length-1; i > -1; i-- ) { |
| | 680 | |
| | 681 | var title = autosave_local_storage.esc_html(post_data[i]["post_title"]); |
| | 682 | |
| | 683 | if( jQuery.trim(title) == '' ) { |
| | 684 | title = post_data[i]["post_ID"]; |
| | 685 | } |
| | 686 | |
| | 687 | |
| | 688 | autosave_local_storage.content[key+i] = autosave_local_storage.esc_html(post_data[i]["content"]); |
| | 689 | |
| | 690 | |
| | 691 | autosave_local_storage.html = autosave_local_storage.html + '<span style="padding: 0 10px;"><a class="autosave-recover" data-key="'+key+i+'" data-postid="'+key+'" data-title="'+title+'" href="javascript:void(0)">'+title+'</a> </span>' |
| | 692 | |
| | 693 | } |
| | 694 | |
| | 695 | }); |
| | 696 | |
| | 697 | if( this.html != '' ) { |
| | 698 | |
| | 699 | var notice = "<div class='error' id='autosave_local_storage_wrap'><p><strong>Post History</strong> <a href='javascript:void(0)' id='autosave_local_storage_hide'>Hide This Box</a></p></p><p>"+this.html+"<div style='padding: 0 10px;' id='autosave_local_storage' ></div></p></div>"; |
| | 700 | |
| | 701 | jQuery("#wpbody .wrap h2:first").after( notice ); |
| | 702 | |
| | 703 | jQuery("#autosave_local_storage_hide").on("click", function(event){ |
| | 704 | |
| | 705 | jQuery("#autosave_local_storage_wrap").hide(); |
| | 706 | }); |
| | 707 | |
| | 708 | jQuery(".autosave-recover").on("click", function(event){ |
| | 709 | jQuery('#autosave_local_storage').html( autosave_local_storage.content[jQuery(this).data('key')] ); |
| | 710 | }); |
| | 711 | } |
| | 712 | |
| | 713 | } |
| | 714 | |
| | 715 | } |
| | 716 | } |