so that it is preserved
            preg_match_all( "/(.*?)\<\/code>/is", $text, $out );
            foreach( $out[1] as $instance => $inner_match )
            {
                $target_string = htmlentities( $out[1][ $instance ], ENT_QUOTES, $ppn_charset );
                $text = str_replace( $inner_match, $target_string, $text );
            }
        }
        return $text;
    }
    function kses_data( $text )
    {
        // This function is a copy of wp_kses_data that was introduced in WordPress 2.9
        // It's copied in this plugin to retain compatibility with WordPress 2.8
        global $allowedtags;
        return wp_kses( $text, $allowedtags );
    }
    function prepare_js_from_kses( $text )
    {
        return preg_replace( '/([^\\\\])"/', '$1\\"', $text );
    }
    // Return the author's display name if the author exists; otherwise, default to a generic name
    function get_author_name( $author_id )
    {
        $author = get_userdata( $author_id );
        // If the user does not exist (if they've been removed, for example, show a default name)
        if( !$author )
        {
            $author_name = __( 'User', 'peters_post_notes' );
        }
        else
        {
            $author_name = $author->display_name;
        }
        return $author_name;
    }
    // Defines the header for the "Latest note" column on the manage posts page
    function notes_column_header( $columns )
    {
        $columns['ppn_notes'] = __( 'Latest note' );
        return $columns;
    }
    // Defines the actual "Latest note" column content on the manage posts page
    function notes_column_content( $name )
    {
        global $post, $ppn_db_notes, $wpdb;
        switch( $name )
        {
            case 'ppn_notes':
                $latest_note = $wpdb->get_row( 'SELECT noteid, notecontent, author, notetime FROM ' . $ppn_db_notes . ' WHERE postid = ' . $post->ID . ' ORDER BY notetime DESC LIMIT 1', OBJECT );
                if( $latest_note )
                {
                    $author_name = ppnFunctionCollection::get_author_name( $latest_note->author );
                    print '[' . date( __( 'M j, Y \a\t G:i', 'peters_post_notes' ), strtotime( $latest_note->notetime ) ) . ', ' . $author_name . ']
' . $latest_note->notecontent;
                }
                else
                {
                    print '-';
                }
        }
    }
}
/* --------------------------------------------
Add meta box
---------------------------------------------*/
function ppn_add_meta_box() {
    global $ppn_post_types;
    foreach( $ppn_post_types as $ppn_post_type ) {
        add_meta_box('collaboration', __('Notes', 'peters_post_notes'), 'ppn_meta_contents', $ppn_post_type, 'side', 'high');
    }
}
/* --------------------------------------------
Output within meta box
---------------------------------------------*/
function ppn_meta_contents($post) {
    global $wpdb, $ppn_db_notes, $ppn_add_post_note_in_publish_panel, $ppn_superedit_roles, $ppn_superedit_caps;
    // Get information about the currently logged in user
    $current_user = wp_get_current_user();
    // Show all notes for this post
    $ppn_notes = $wpdb->get_results('SELECT noteid, notecontent, author, notetime FROM ' . $ppn_db_notes . ' WHERE postid = ' . $post->ID . ' ORDER BY notetime DESC', OBJECT);
        
    // If they are part of groups, get the moderator info for each group
    if( $ppn_notes ) {
        $ppn_num_notes = count($ppn_notes);
        $ppn_this_note = 1;
        $is_supereditor = ppnFunctionCollection::is_super( $current_user, $ppn_superedit_roles, $ppn_superedit_caps );
        foreach ($ppn_notes as $ppn_note) {
            $author_name = ppnFunctionCollection::get_author_name( $ppn_note->author );
            print '' . "\n";
            print '' . $author_name . '
' . "\n";
            print '' . date(__('M j, Y \a\t G:i', 'peters_post_notes'), strtotime($ppn_note->notetime)) . '
' . "\n";
            print '
' . "\n";
            print '' . "\n";
            print '';
            print '' . stripslashes($ppn_note->notecontent) . '
' . "\n";
            if( $current_user->ID == $ppn_note->author || $is_supereditor ) {
                print '' . "\n";
            }
            print '';
            if( $current_user->ID == $ppn_note->author || $is_supereditor ) {
                print '' . "\n";
            }
            // Show a divider if this isn't the last note
            if( $ppn_this_note != $ppn_num_notes ) {
                print '
' . "\n";
            }
            print '' . "\n";
            ++$ppn_this_note;
        }
    }
    else {
        print '' . __('No notes for this post.', 'peters_post_notes') . '
';
    }
    if ( $ppn_add_post_note_in_publish_panel ) {
        print '';
    }
    else {
        print '
';
    }
    print '
';
}
/* --------------------------------------------
Add a note during any post save or update action
---------------------------------------------*/
function ppn_save_note($post_id, $post) {
    global $wpdb, $ppn_db_notes, $_POST;
    // Get information about the currently logged in user, as the person submitting the post for review or approving it
    $current_user = wp_get_current_user();
    
    // Check to see whether anybody wrote anything
    if( isset($_POST['ppn_post_note']) && $_POST['ppn_post_note'] != '' ) {
        // Post note
        $ppn_post_note = ppnFunctionCollection::note_scrub( $_POST['ppn_post_note'] );
        
        // Check whether this exact note already exists, and whether it was the last note written on this post
        // This is to allow people to write things like "Thanks!" multiple times in a note as long as someone else has posted in between
        $latest_note = $wpdb->get_var( $wpdb->prepare( "SELECT `notecontent` FROM $ppn_db_notes 
                                                        WHERE `postid` = $post_id
                                                        ORDER BY `notetime` DESC
                                                        LIMIT 1;" ) );
        if( $ppn_post_note != $latest_note )
        {
            // Insert the note into the database if they haven't already posted the same thing
            $wpdb->insert(
                $ppn_db_notes,
                array('postid' => $post_id,
                    'notecontent' => $ppn_post_note,
                    'author' => $current_user->ID,
                    'notetime' => current_time('mysql')
                )
            );
        }
    }
}
/* --------------------------------------------
When a post is deleted, remove all notes related to it
---------------------------------------------*/
function ppn_delete_notes($post_id) {
    global $wpdb, $ppn_db_notes;
    
    $wpdb->query('DELETE FROM ' . $ppn_db_notes . ' WHERE postid = ' . $post_id);
}
/* --------------------------------------------
Show latest notes on dashboard
---------------------------------------------*/
function ppn_add_dashboard() {
    wp_add_dashboard_widget( 'ppn_dashboard', __('Collaboration Notes', 'peters_post_notes'), 'ppn_dashboard' );
}
function ppn_dashboard() {
    global $wpdb, $ppn_db_notes, $ppn_show_which_notes, $ppn_num_notes_limit, $ppn_super_roles, $ppn_super_caps;
    $current_user = wp_get_current_user();
    // Basic variable setup
    $ppn_relevant_post_list = '';
    $ppn_newest_posts = false;
    $ppn_query_options = '';
    // Do we need to filter the list of notes?
    if( $ppn_show_which_notes != 'all' ) {
        // Do another check to see whether this user has an exempted role or capability to be able to view all notes
        $is_super = ppnFunctionCollection::is_super( $current_user, $ppn_super_roles, $ppn_super_caps );
        if( !$is_super ) {
            // Get posts this author has written
            $ppn_author_posts = query_posts('author=' . $current_user->ID . '&orderby=modified&order=DESC&showposts=100');
            $ppn_relevant_posts = array();
            if( $ppn_author_posts ) {
                foreach ($ppn_author_posts as $ppn_author_post) {
                    $ppn_relevant_posts[] = $ppn_author_post->ID;
                }
            }
        
            // Now we want to grab any posts on which this person has created a note
            $ppn_associated_posts = $wpdb->get_results('SELECT postid FROM ' . $ppn_db_notes . ' WHERE author = ' . $current_user->ID . ' ORDER BY notetime DESC', OBJECT);
            if( $ppn_associated_posts ) {
                foreach($ppn_associated_posts as $ppn_associated_post) {
                    $ppn_relevant_posts[] = $ppn_associated_post->postid;
                }
            }
            $ppn_relevant_posts = array_unique($ppn_relevant_posts);
        
            $ppn_relevant_post_list = implode(',', $ppn_relevant_posts);
            // Make sure there are actually relevant posts
            if( '' != $ppn_relevant_post_list ) {
                // Grab notes for posts on which the current user was an author or already made a comment
                $ppn_query_options .= ' WHERE postid IN (' . $ppn_relevant_post_list . ') ';
            
                if( $ppn_show_which_notes == 'others' ) {
                    // Grab notes written by people other than the author, for posts on which the current user was an author or already made a comment
                    $ppn_query_options .= ' AND author != ' . $current_user->ID;
                }
            }
        }
    }
    if( $ppn_show_which_notes == 'all' || $is_super || '' != $ppn_relevant_post_list) {
        if( !$ppn_num_notes_limit ) {
            $ppn_num_notes = '';
        }
        else {
            $ppn_num_notes = ' LIMIT ' . $ppn_num_notes_limit;
        }
        $ppn_newest_posts = $wpdb->get_results('SELECT postid, author, notetime, notecontent FROM ' . $ppn_db_notes . $ppn_query_options . ' ORDER BY notetime DESC' . $ppn_num_notes, OBJECT);
    }
    if( $ppn_newest_posts ) {
        print '' . "\n";
        foreach ($ppn_newest_posts as $ppn_newest_post) {
            $author_name = ppnFunctionCollection::get_author_name( $ppn_newest_post->author );
            $ppn_post = get_post($ppn_newest_post->postid, OBJECT);
            
            print '- ' . $author_name . ': ' . stripslashes($ppn_newest_post->notecontent) . '
 ';
            print '' . date(__('M j, Y \a\t G:i', 'peters_post_notes'), strtotime($ppn_newest_post->notetime)) . ' '.__('on', 'peters_post_notes').' ';
            print '' . $ppn_post->post_title . ' (' . $ppn_post->post_status . ')';
            print '
' . "\n";
        }
        
        print '
' . "\n";
    }
    else {
        print '' . __('No relevant notes.', 'peters_post_notes') . '
';
    }
}
function ppn_add_dashboard_general() {
    wp_add_dashboard_widget( 'ppn_dashboard_general', __('General Notes', 'peters_post_notes'), 'ppn_dashboard_general' );
}
function ppn_dashboard_general() {
    global $wpdb, $ppn_db_generalnotes;
    $current_user = wp_get_current_user();
    
    if( isset( $_POST['ppn_submit_generalnote'] ) )
    {
    
        if( !empty( $_POST['ppn_post_generalnote'] ) )
        {
            // Is the private checkbox marked?
            $ppn_private = 0;
            if( isset( $_POST['ppn_private'] ) && 'on' == $_POST['ppn_private'] )
            {
                $ppn_private = 1;
            }
            
            $ppn_post_generalnote = ppnFunctionCollection::note_scrub( $_POST['ppn_post_generalnote'] );
            
            $wpdb->insert(
                $ppn_db_generalnotes,
                array('notecontent' => $ppn_post_generalnote,
                    'author' => $current_user->ID,
                    'notetime' => current_time('mysql'),
                    'personal' => $ppn_private
                )
            );
        }
    }
    $ppn_dashboard_general_newest = ppn_dashboard_general_newest(0, 0);
    
    if( !empty($ppn_dashboard_general_newest) ) {
        print '' . "\n";
        print $ppn_dashboard_general_newest;
        print '' . "\n";
    }
    
    $ppn_dashboard_general_personal = ppn_dashboard_general_newest(0, 1);
    
    if( !empty($ppn_dashboard_general_personal) ) {
        print '
';
        print 'Personal notes:
' . "\n";
        print '' . "\n";
        print $ppn_dashboard_general_personal;
        print '' . "\n";
    }
    
    if( empty($ppn_dashboard_general_newest) && empty($ppn_dashboard_general_personal) ) {
       print '' . __('No general notes.', 'peters_post_notes') . '
';
    }
    print '
' . "\n";
    print '' . "\n";
}
function ppn_dashboard_general_newest($ppn_page=0, $ppn_personal=0) {
    global $wpdb, $ppn_num_notes_limit, $ppn_db_generalnotes, $ppn_superedit_roles, $ppn_superedit_caps;
    
    $out = '';
    
    $current_user = wp_get_current_user();
    
    // Find out what page of entries you are looking for
    $ppn_page = max( intval( $ppn_page ), 0 );
    
    $ppn_personal = min( intval( $ppn_personal ), 1 );
    if( 1 == $ppn_personal ) {
        $ppn_personal_query = $ppn_personal . ' AND author = ' . $current_user->ID;
    }
    else {
        $ppn_personal_query = $ppn_personal;
    }
    if( !$ppn_num_notes_limit ) {
        $ppn_num_notes = '';
    }
    
    else {
        $ppn_start_at = $ppn_page * $ppn_num_notes_limit;
        $ppn_num_notes = ' LIMIT ' . $ppn_start_at . ', ' . $ppn_num_notes_limit;
    }
    
    $ppn_num_newest_posts = $wpdb->get_var('SELECT COUNT(*) FROM ' . $ppn_db_generalnotes . ' WHERE personal = ' . $ppn_personal_query);
    if( $ppn_num_newest_posts < $ppn_start_at ) {
        return 'Not enough entries to go that high.';
    }
    
    // How many pages of content are there?
    $ppn_total_pages = ceil($ppn_num_newest_posts / $ppn_num_notes_limit);
    
    if( $ppn_num_newest_posts ) {
        $ppn_newest_posts = $wpdb->get_results('SELECT noteid, author, notetime, notecontent FROM ' . $ppn_db_generalnotes . ' WHERE personal = ' . $ppn_personal_query . ' ORDER BY notetime DESC' . $ppn_num_notes, OBJECT);
        
        $is_supereditor = ppnFunctionCollection::is_super( $current_user, $ppn_superedit_roles, $ppn_superedit_caps );
        $out = '' . "\n";
        foreach ($ppn_newest_posts as $ppn_newest_post) {
            $author_name = ppnFunctionCollection::get_author_name( $ppn_newest_post->author );
            
            $out .= '- ';
            $out .= '' . "\n";
            $out .= '' . '';
            if( 0 == $ppn_personal ) {
                $out .= '' . $author_name . ': ';
            }
            $out .= '' . stripslashes($ppn_newest_post->notecontent) . '' . "\n";
            $out .= '
 ' . date(__('M j, Y \a\t G:i', 'peters_post_notes'), strtotime($ppn_newest_post->notetime)) . '';
            if( $current_user->ID == $ppn_newest_post->author || $is_supereditor) {
                $out .= '
 Edit';
            }
            $out .= '
 ';
            $out .= '' . "\n";
            if( $current_user->ID == $ppn_newest_post->author || $is_supereditor ) {
                $out .= '' . "\n";
            }
            $out .= '
' . "\n";
        }        
        $out .= '
' . "\n";
        if( 1 != $ppn_total_pages ) {
            $out .= '';
                if( ($ppn_page + 1) < $ppn_total_pages ) {
                    $out .= '« prev';
                }
                if( 0 != $ppn_page ) {
                    if( ($ppn_page + 1) != $ppn_total_pages ) {
                        $out .= ' |';
                    }
                    $out .= ' next »';
                }
            $out .= '
' . "\n";
        }
    }
    
    return $out;
}
/* --------------------------------------------
Add and remove tables when installing and uninstalling
---------------------------------------------*/
function ppn_install() {
    global $wpdb, $ppn_db_notes, $ppn_db_generalnotes, $ppn_version;
    
    $return = '';
    
    // Add the table to hold post-specific notes
    if($wpdb->get_var('SHOW TABLES LIKE \'' . $ppn_db_notes . '\'') != $ppn_db_notes) {
        $sql = 'CREATE TABLE ' . $ppn_db_notes . ' (
        `noteid` bigint(20) NOT NULL auto_increment,
        `postid` bigint(20) NOT NULL,
        `notecontent` text NOT NULL,
        `author` bigint(20) NOT NULL,
        `notetime` datetime NOT NULL,
        UNIQUE KEY `noteid` (noteid)
        ) AUTO_INCREMENT=1;';
        
        $added_notes_table = $wpdb->query($sql);
        if( $added_notes_table === 0 ) {
            $return .= __('Added notes table!
', 'peters_post_notes');
        }
    }
    // Add the table to hold general notes
    if($wpdb->get_var('SHOW TABLES LIKE \'' . $ppn_db_generalnotes . '\'') != $ppn_db_generalnotes) {
        $sql = 'CREATE TABLE ' . $ppn_db_generalnotes . ' (
        `noteid` bigint(20) NOT NULL auto_increment,
        `notecontent` text NOT NULL,
        `author` bigint(20) NOT NULL,
        `notetime` datetime NOT NULL,
        `personal` BINARY NOT NULL DEFAULT \'1\',
        UNIQUE KEY `noteid` (noteid)
        ) AUTO_INCREMENT=1;';
        $added_generalnotes_table = $wpdb->query($sql);
        
        if( $added_generalnotes_table === 0 ) {
            $return .= __('Added general notes table!
', 'peters_post_notes');
        }
    }
    // Store version number in the database
    add_option( 'ppn_version', $ppn_version, '', 'no' );
    
    return $return;
}
function ppn_install_link($action_links, $plugin_file, $plugin_data, $context) {
    if( $context == 'active' ) {
        $action_links[] = 'Update DB';
    }
    return $action_links;
}
function ppn_upgrade_page() {
    $ppn_install = ppn_install();
?>
    
        
        
Database tables for this plugin are properly installed.', 'peters_post_notes');
    }
    else {
        print $ppn_install;
    }
?>
    
get_var('SHOW TABLES LIKE \'' . $ppn_db_notes . '\'') )
    {
        $sql = 'DROP TABLE ' . $ppn_db_notes;
        $wpdb->query($sql);
    }
    if( $ppn_db_generalnotes == $wpdb->get_var('SHOW TABLES LIKE \'' . $ppn_db_generalnotes . '\'') )
    {
        $sql = 'DROP TABLE ' . $ppn_db_generalnotes;
        $wpdb->query($sql);
    }
    delete_option( 'ppn_version' );
}
/* --------------------------------------------
JavaScript used in this plugin
---------------------------------------------*/
function ppn_js_admin_header() {
  wp_enqueue_script( 'sack' );
  // Load jQuery as well, although not for Ajax in our case
  wp_enqueue_script( 'jquery' );
  wp_register_script( 'peters_post_notes', WP_PLUGIN_URL . '/' . dirname(plugin_basename(__FILE__)) . '/peters_post_notes.js', array( 'sack' ) );
  wp_enqueue_script( 'peters_post_notes' );
}
/* --------------------------------------------
Function to edit notes
---------------------------------------------*/
add_action('wp_ajax_ppn_edit_note', 'ppn_edit_note' );
function ppn_edit_note() {
    global $wpdb, $ppn_db_notes, $ppn_db_generalnotes, $ppn_superedit_roles, $ppn_superedit_caps;
    
    $current_user = wp_get_current_user();
    $is_supereditor = ppnFunctionCollection::is_super( $current_user, $ppn_superedit_roles, $ppn_superedit_caps );
    // read submitted information
    $note_id = intval($_POST['note_id']);
    
    $note_text = ppnFunctionCollection::note_scrub( $_POST['note_text'] );
    
    $note_type = substr($_POST['note_type'], 0, 7);
    
    switch( $note_type ) {
        case 0: $ppn_db_table = $ppn_db_generalnotes; break;
        case 1: $ppn_db_table = $ppn_db_notes; break;
    }
    
    $ppn_author = $wpdb->get_var('SELECT author from ' . $ppn_db_table . ' WHERE noteid = ' . $note_id . ' LIMIT 1');
    // If this user allowed to edit this note?
    if( $current_user->ID != $ppn_author && !$is_supereditor) {
        die('document.getElementById("ppn_noteerror_' . $note_id . '").innerHTML = \'' . __('Error: You can only edit notes that you wrote.', 'peters_post_notes') . '
\';
        document.getElementById("ppn_noteform_' . $note_id . '").style.display = "none";
        document.getElementById("ppn_notecontent_' . $note_id . '").style.display = "";');
    }
    
    // Edit the note!
    $ppn_editnotesuccess = $wpdb->update(
        $ppn_db_table,
        array ('notecontent' => $note_text),
        array ('noteid' => $note_id));
        
    if( $ppn_editnotesuccess ) {
        $note_text = str_replace( "\n", '\\n', $note_text );
        $note_text = str_replace( "\r", '\\r', $note_text );
        die( 'document.getElementById("ppn_noteerror_' . $note_id . '").innerHTML = "";
            document.getElementById("ppn_notecontent_p_' . $note_id . '").innerHTML = "' . ppnFunctionCollection::prepare_js_from_kses( $note_text ) . '"; ppn_fadeedit("ppn_notecontent_p_' . $note_id . '");
            document.getElementById("ppn_noteform_' . $note_id . '").style.display = "none";
            document.getElementById("ppn_notecontent_' . $note_id . '").style.display = "";');
    }
    // Database error
    elseif( $ppn_editnotesuccess === false ) {
        die( 'document.getElementById("ppn_noteerror_' . $note_id . '").innerHTML = \'' . __('Error: Unknown or database problem when updating note.', 'peters_post_notes') . '
\';
            document.getElementById("ppn_noteform_' . $note_id . '").style.display = "none";
            document.getElementById("ppn_notecontent_' . $note_id . '").style.display = "";');
    }
    // Here they actually didn't update anything
    else {
        die( 'document.getElementById("ppn_noteerror_' . $note_id . '").innerHTML = "";
            document.getElementById("ppn_noteform_' . $note_id . '").style.display = "none";
            document.getElementById("ppn_notecontent_' . $note_id . '").style.display = "";');
    }
}
/* --------------------------------------------
Function to delete posts
---------------------------------------------*/
add_action('wp_ajax_ppn_delete_note', 'ppn_delete_note' );
function ppn_delete_note() {
    global $wpdb, $ppn_db_notes, $ppn_db_generalnotes, $ppn_superedit_roles, $ppn_superedit_caps;
    
    $current_user = wp_get_current_user();
    $is_supereditor = ppnFunctionCollection::is_super( $current_user, $ppn_superedit_roles, $ppn_superedit_caps );
    // read submitted information
    $note_id = intval($_POST['note_id']);
    $note_type = substr($_POST['note_type'], 0, 7);
    
    switch($note_type) {
        case 0: $ppn_db_table = $ppn_db_generalnotes; break;
        case 1: $ppn_db_table = $ppn_db_notes; break;
    }
    
    $ppn_author = $wpdb->get_var('SELECT author from ' . $ppn_db_table . ' WHERE noteid = ' . $note_id . ' LIMIT 1');
    // If this user allowed to delete this note?
    if( $current_user->ID != $ppn_author && !$is_supereditor ) {
        die('document.getElementById("ppn_noteerror_' . $note_id . '").innerHTML = \'' . __('Error: You can only delete notes that you wrote.', 'peters_post_notes') . '
\';
        document.getElementById("ppn_noteform_' . $note_id . '").style.display = "none";
        document.getElementById("ppn_notecontent_' . $note_id . '").style.display = "";');
    }
    
    // Delete the note!
    $ppn_deletenotesuccess = $wpdb->query('DELETE FROM ' . $ppn_db_table . ' WHERE noteid = ' . $note_id . ' LIMIT 1');
    
    if( $ppn_deletenotesuccess ) {
        die( 'ppn_fadeout("ppn_entire_note_' . $note_id . '");');
    }
    // Database error
    else {
        die( 'document.getElementById("ppn_noteerror_' . $note_id . '").innerHTML = \'' . __('Error: Unknown or database problem when deleting note.', 'peters_post_notes') . '
\';
            document.getElementById("ppn_noteform_' . $note_id . '").style.display = "none";
            document.getElementById("ppn_notecontent_' . $note_id . '").style.display = "";');
    }
}
/* --------------------------------------------
Function to load new page of notes
---------------------------------------------*/
add_action('wp_ajax_ppn_load_page', 'ppn_load_page' );
function ppn_load_page() {
    $ppn_page = intval($_POST['ppn_page']);
    $ppn_personal = intval($_POST['ppn_personal']);
    
    $ppn_dashboard_general_newest = ppn_dashboard_general_newest($ppn_page, $ppn_personal);
    $ppn_dashboard_general_newest = str_replace("\n", '\\n', $ppn_dashboard_general_newest);
    $ppn_dashboard_general_newest = str_replace("\r", '\\r', $ppn_dashboard_general_newest);
    
    if( 0 == $ppn_personal ) {
        die('document.getElementById("ppn_dashboard_general_newest").innerHTML = "' . ppnFunctionCollection::prepare_js_from_kses( $ppn_dashboard_general_newest ) . '";');
    }
    if( 1 == $ppn_personal ) {
        die('document.getElementById("ppn_dashboard_general_personal").innerHTML = "' . ppnFunctionCollection::prepare_js_from_kses( $ppn_dashboard_general_newest ) . '";');
    }
}
register_activation_hook( __FILE__, 'ppn_install' );
register_uninstall_hook( __FILE__, 'ppn_uninstall' );
add_action( 'admin_menu', 'ppn_add_meta_box' );
add_action( 'wp_dashboard_setup', 'ppn_add_dashboard' );
add_action( 'wp_dashboard_setup', 'ppn_add_dashboard_general' );
add_action( 'edit_post', 'ppn_save_note', 10, 2 );
add_action( 'delete_post', 'ppn_delete_notes', 10, 1 );
add_filter( 'plugin_action_links_' . basename(__FILE__), 'ppn_install_link', 10, 4 );
// Would be more efficient to only load the plugin's JS on certain admin pages, but with custom post types it's better not to frustrate the developer
//if( $pagenow == 'post.php' || $pagenow == 'page.php' || $pagenow == 'index.php' )
add_action('admin_print_scripts', 'ppn_js_admin_header' );
if( $ppn_show_latest_notes_column )
{
    add_filter( 'manage_posts_columns', array( 'ppnFunctionCollection', 'notes_column_header' ) );
    add_action( 'manage_posts_custom_column', array( 'ppnFunctionCollection', 'notes_column_content' ) );
}
} // This closes that initial check to make sure someone is actually logged in
?>