<?php

# PLUGIN PREVIEW BY TEXTPATTERN.INFO


/*
    adi_article_tab - Enhanced article tab

    Written by Adi Gilbert

    Released under the GNU General Public License

    Version history:
    0.3        - refixes for TXP 4.6
    0.2        - fixes for TXP 4.6
    0.1        - initial release

*/

if (@txpinterface == 'admin') {
    global 
$prefs,$adi_article_tab_debug;

    
$adi_article_tab_debug 0;

    if (!
version_compare(txp_version,'4.5.0','>=')) return;

    
adi_article_tab_init();
}

function 
adi_article_tab_init() {
// initial set up
    
global $prefs,$event,$step,$textarray,$adi_article_tab_tab_list,$adi_article_tab_prefs,$adi_article_tab_outlaws,$adi_article_tab_debug,$adi_article_tab_plugin_status,$adi_article_tab_url,$adi_article_tab_txp460;

    
$adi_article_tab_txp460 = (version_compare(txp_version,'4.6-dev','>='));

    
// default preferences
    
$adi_article_tab_prefs = array(
        
'adi_article_tab_privs' => array('value' => '1,2,3,4,5,6''blank' => 1'private' => 0'input' => 'custom''label' => 'adi_plugin_privs''tab' => 'options'), // allowed to use plugin
    
);

    
// plugin privs to be excluded
    
$adi_article_tab_outlaws = array(0);

# --- BEGIN PLUGIN TEXTPACK ---
    
$adi_article_tab_gtxt = array(
        
'adi_admin_privs' => 'Admin privileges',
        
'adi_install_fail' => 'Unable to install',
        
'adi_installed' => 'Installed',
        
'adi_not_installed' => 'Not installed',
        
'adi_plugin_privs' => 'Plugin privileges',
        
'adi_textpack_fail' => 'Textpack installation failed',
        
'adi_textpack_feedback' => 'Textpack feedback',
        
'adi_textpack_online' => 'Textpack also available online',
        
'adi_uninstall' => 'Uninstall',
        
'adi_uninstall_fail' => 'Unable to uninstall',
        
'adi_uninstalled' => 'Uninstalled',
        
'adi_update_prefs' => 'Update preferences',
        
'adi_upgrade_fail' => 'Unable to upgrade',
        
'adi_upgrade_required' => 'Upgrade required',
        
'adi_upgraded' => 'Upgraded',
        );
# --- END PLUGIN TEXTPACK ---

    // update $textarray
    
$textarray += $adi_article_tab_gtxt;

    
// Textpack
    
$adi_article_tab_url = array(
        
'textpack' => 'http://www.greatoceanmedia.com.au/files/adi_textpack.txt',
        
'textpack_download' => 'http://www.greatoceanmedia.com.au/textpack/download',
        
'textpack_feedback' => 'http://www.greatoceanmedia.com.au/textpack/?plugin=adi_article_tab',
    );
    if (
strpos($prefs['plugin_cache_dir'],'adi') !== FALSE// use Adi's local version
        
$adi_article_tab_url['textpack'] = $prefs['plugin_cache_dir'].'/adi_textpack.txt';

    
$view gps('view'); // values: blank or "text" (normal edit view), "html", "preview"
    
if (($view == 'text') || ($view == '')) { // don't want anything in HTML or Preview views
        // adi_article_tab privs & callbacks
        
add_privs('adi_article_tab',adi_article_tab_pref('adi_article_tab_privs'));
        if (
has_privs('adi_article_tab')) {
            if (
$event == 'article')
                
register_callback('adi_article_tab_delete_button','admin_side','body_end'); // load at bottom of page (to get new article ID) & shift into position using jQuery (USE MAIN_CONTENT_END IN 4.6?)
            
register_callback('adi_article_tab_display_id','article_ui','author');
        }
        
// script
        
if ($event == 'article')
            
register_callback('adi_article_tab_script','admin_side','head_end');
    }

    
// plugin options
    
$adi_article_tab_plugin_status fetch('status','txp_plugin','name','adi_article_tab');
    if (
$adi_article_tab_plugin_status) { // proper install - options under Plugins tab
        
add_privs('plugin_prefs.adi_article_tab'); // defaults to priv '1' only
        
register_callback('adi_article_tab_options','plugin_prefs.adi_article_tab');
    }
    else { 
// txpdev - options under Extensions tab
        
add_privs('adi_article_tab_options'); // defaults to priv '1' only
        
register_tab('extensions','adi_article_tab_options','adi_article_tab options');
        
register_callback('adi_article_tab_options','adi_article_tab_options');
    }

}

function 
adi_article_tab_script() {
// scriptism
    
global $adi_article_tab_txp460;

    echo <<<END_SCRIPT
<script type="text/javascript">
    $(function() {
        // adi_article_tab
        var txp460 = "
$adi_article_tab_txp460";
        // shift article delete button into place
        if (txp460 == "1") {
             $("#adi_article_tab_delete_link").appendTo("p.txp-save + p.txp-actions");
         }
         else {
             $("p.adi_article_tab_delete_button").insertBefore("fieldset#write-status");
         }
         // link click -> form submit
        $('#adi_article_tab_delete_link').click(function() {
            $('form#adi_article_tab_delete_form').submit();
        });
    });
</script>
END_SCRIPT;
}

function 
adi_article_tab_pref($name,$value=NULL,$private=FALSE) {
// read or set pref
    
global $prefs,$adi_article_tab_prefs;

    if (
$value === NULL)
        return 
get_pref($name,$adi_article_tab_prefs[$name]['value']);
    else {
        if (
array_key_exists($name,$adi_article_tab_prefs))
            
$html $adi_article_tab_prefs[$name]['input'];
        else
            
$html 'text_input';
        
$res set_pref($name,$value,'adi_article_tab_admin',2,$html,0,$private);
        
$prefs[$name] = get_pref($name,$adi_article_tab_prefs[$name]['value'],TRUE);
        return 
$res;
    }
}

function 
adi_article_tab_delete_button($e,$s) {
// delete button
// generate a hidden form to sit in footer (can't have it inside article tab's <form>)
// generate a link "button" that'll get shifted into place by jQuery
    
global $event,$step,$txp_user,$txp_permissions,$adi_article_tab_debug,$adi_article_tab_txp460;

    
$debug '[NO BUTTON]';

    if (
$step == 'edit') { // article edit only

        
if (isset($GLOBALS['ID'])) { // new article create
            
$id $GLOBALS['ID'];
            
$debug "id=n/a,globals_id=$id";
        }
        else { 
// existing article
            
$id gps('ID');
            
$debug "id=$id,globals_id=n/a";
        }

        
$id assert_int($id);

        
$author safe_field('AuthorID','textpattern',"ID=$id");

        if (
$adi_article_tab_debug) {
            
$user_priv safe_field("privs","txp_users","name='".doSlash($txp_user)."'");
            
$debug =
                
"event=$event,step=$step,".$debug
                
.br."txp_user=$txp_user,author=$author,user_priv=$user_priv"
                
.br."article.delete=".$txp_permissions['article.delete'].";article.delete.own=".$txp_permissions['article.delete.own'];
        }
        else
             
$debug '';

        if (
has_privs('article.delete') || (($txp_user == $author) && has_privs('article.delete.own'))) {

            
// echo (to avoid fiddling with $default) a hidden form that'll get actioned by jQuery when user clicks link button
            // have to use form coz list tab expects instructions to be POSTed
             
echo
                 
form(
                    
eInput('list')
                    .
sInput('list_multi_edit')
                    .
hInput('edit_method','delete')
                    .
hInput('selected[0]',$id)
                     ,
'display:none'
                     
,"confirm('".gTxt('confirm_delete_popup')."');"
                     
,'post'
                     
,''
                     
,''
                     
,'adi_article_tab_delete_form' // HTML ID
                 
);

            if (
$adi_article_tab_txp460)
                
$delete_link '<a href="#" id="adi_article_tab_delete_link" title="'.gTxt('delete').'" class="txp-destroy"><span class="ui-icon ui-icon-trash"></span> '.gTxt('delete').'</a>';
            else
                
$delete_link '<p class="action-create adi_article_tab_delete_button"><a href="#" id="adi_article_tab_delete_link" title="'.gTxt('delete').'" class="txp-destroy txp-button">'.gTxt('delete').'</a></p>';

            
// echo (to avoid fiddling with $default) a "delete article" link (shifted into place using jQuery)
            
echo $debug.$delete_link;

            return;
        }
        else
            
$debug .= br.'[INSUFFICIENT PRIVS]';
    }

    if (
$adi_article_tab_debug) echo graf($debug,' class="adi_article_tab_delete_button"');
}

function 
adi_article_tab_display_id($e,$s,$default) {
// insert article id before "Posted by" bit

    
if (isset($GLOBALS['ID'])) // new article create
        
$id $GLOBALS['ID'];
    else 
// existing article
        
$id gps('ID');

    return 
str_replace('<small>','<small>#'.$id.' &#183; ',$default);
}

function 
adi_article_tab_pref_inputs($event,$tab=NULL) {
// output preference input fields according to options/admin setting
    
global $txp_groups,$adi_article_tab_prefs,$adi_article_tab_outlaws,$adi_article_tab_admin_outlaws;

    if (
$tab === NULL) return;

    
$out '';

    foreach (
$adi_article_tab_prefs as $pref_name => $pref_info) {
        if (
$pref_info['tab'] == $tab) {
            switch (
$pref_info['input']) {
                case 
'yesnoradio':
                    
$out .=
                        
graf(
                            
tag(gTxt($pref_info['label']),'label')
                            .
sp.sp
                            
.tag(radio($pref_name,'0',(adi_article_tab_pref($pref_name) == '0')).sp.gTxt('no'),'label')
                            .
sp.sp
                            
.tag(radio($pref_name,'1',(adi_article_tab_pref($pref_name) == '1')).sp.gTxt('yes'),'label')
                            ,
' class="'.$pref_name.'"'
                        
);
                    break;
                case 
'custom':
                    
// admin privs
                    
if ($pref_name == 'adi_article_tab_admin_privs') {
                        
$priv_out gTxt($pref_info['label']);
                        
$admin_privs do_list(adi_article_tab_pref('adi_article_tab_admin_privs'));
                        foreach (
$txp_groups as $index => $group)
                            if (
array_search($index,$adi_article_tab_admin_outlaws) === FALSE// ignore the outlaws
                                
$priv_out .= tag(sp.sp.checkbox2("adi_article_tab_admin_privs[$index]",(array_search($index,$admin_privs) !== FALSE),'','adi_article_tab_admin_privs').sp.gTxt($group),'label');
                        
$out .= graf($priv_out,' class="'.$pref_name.'"');
                    }
                    
// plugin privs
                    
if ($pref_name == 'adi_article_tab_privs') {
                        
$priv_out gTxt($pref_info['label']);
                        
$plugin_privs do_list(adi_article_tab_pref('adi_article_tab_privs'));
                        foreach (
$txp_groups as $index => $group)
                            if (
array_search($index,$adi_article_tab_outlaws) === FALSE// ignore the outlaws
                                
$priv_out .= tag(sp.sp.checkbox2("adi_article_tab_privs[$index]",(array_search($index,$plugin_privs) !== FALSE),'','adi_article_tab_privs').sp.gTxt($group),'label');
                        
$out .= graf($priv_out,' class="'.$pref_name.'"');
                    }
                    break;
                default: 
// text_input
                    
$size = (isset($pref_info['size']) ? $pref_info['size'] : '');
                    
$out .=
                        
graf(
                            
tag(gTxt($pref_info['label']),'label')
                            .
sp.sp
                            
.finput('text',$pref_name,stripslashes(adi_article_tab_pref($pref_name)),$pref_name,'','',$size)
                            ,
' class="'.$pref_name.'"'
                        
);
                    break;
            }
        }
    }

    if (
$out)
        return
            
form(
                
tag(
                    
tag(gTxt('edit_preferences'),'h2')
                    .
$out
                    
.fInput('submit','do_something',gTxt('adi_update_prefs'),'smallerbox')
                    .
eInput($event)
                    .
sInput('update_prefs')
                    ,
'div'
                    
,' style="text-align:center" class="adi_article_tab_prefs"'
                
)
            );

}

function 
adi_article_tab_update_prefs($tab=NULL) {
// update prefs
    
global $txp_user,$adi_article_tab_prefs;

    if (
$tab === NULL)
        return 
FALSE;
    else {
        
$result TRUE;
        foreach (
$adi_article_tab_prefs as $pref_name => $pref_info) {
            if (
$pref_info['tab'] == $tab) { // tab match?
                
if (array_key_exists($pref_name,$_POST))
                    
$value $_POST[$pref_name];
                else if (
$pref_info['input'] == 'yesnoradio')
                    
$value '0';
                else
                    
$value $pref_info['value'];
                if (
is_array($value)) { // string-ify arrays
                    
$values array_keys($value); // need index values not 1s
                    
if ($pref_name == 'adi_article_tab_admin_privs') {
                        
$user_priv safe_field('privs','txp_users',"name='".doSlash($txp_user)."'");
                        
$values array_unique(array_merge($values,array(1,$user_priv))); // can't kill off Publisher or self
                    
}
                    
$value implode(',',$values);
                }
                
// some values not allowed to be blank, reset to default
                
if ((!$pref_info['blank']) && (trim($value) == ''))
                        
$value $adi_article_tab_prefs[$pref_name]['value'];
                
// update pref
                
$private = ($pref_info['tab'] == 'options' FALSE $pref_info['private']); // "options" prefs can't be private
                
$result &= adi_article_tab_pref($pref_name,$value,$private);
            }
        }
        return 
$result;
    }

}

function 
adi_article_tab_options($event,$step) {
// adi_article_tab options page
    
global $txp_user,$txp_groups,$adi_article_tab_debug,$adi_article_tab_url,$adi_article_tab_plugin_status,$adi_article_tab_prefs,$adi_article_tab_outlaws;

    
$message '';

    
// dance steps
    
if ($step == 'textpack') {
        
$adi_textpack file_get_contents($adi_article_tab_url['textpack']);
        if (
$adi_textpack) {
            
$result install_textpack($adi_textpack);
            
$message gTxt('textpack_strings_installed', array('{count}' => $result));
            
$textarray load_lang(LANG); // load in new strings
        
}
        else
            
$message = array(gTxt('adi_textpack_fail'),E_ERROR);
    }
    else if (
$step == 'update_prefs') {
        
$result adi_article_tab_update_prefs('options');
        
$result $message gTxt('preferences_saved') : $message = array(gTxt('adi_pref_update_fail'),E_ERROR);
    }

    
// generate page
    
pagetop('adi_article_tab - '.gTxt('plugin_prefs'),$message);

    
// plugin priv checkboxes
    
$plugin_privs do_list(adi_article_tab_pref('adi_article_tab_privs'));
    
$priv_checkboxes '';
    foreach (
$txp_groups as $index => $group)
        if (
array_search($index,$adi_article_tab_outlaws) === FALSE// ignore the outlaws
            
$priv_checkboxes .= tag(gTxt($group).checkbox2("adi_article_tab_privs[$index]",(array_search($index,$plugin_privs) !== FALSE),'','adi_article_tab_privs').sp.sp,'label');

    
// options
    
echo tag(
        
tag('adi_article_tab '.gTxt('plugin_prefs'),'h2')
        
// prefs
        
.adi_article_tab_pref_inputs($event,'options')
        
// textpack links
        
.graf(href(gTxt('install_textpack'),'?event='.$event.a.'step=textpack'),' style="margin-top:3em"')
        .
graf(href(gTxt('adi_textpack_online'),$adi_article_tab_url['textpack_download']))
        .
graf(href(gTxt('adi_textpack_feedback'),$adi_article_tab_url['textpack_feedback']))
        ,
'div'
        
,' style="text-align:center"'
    
);
}