[ Index ]

MailPress 544

[ Index ]     [ Classes ]     [ Functions ]     [ Variables ]     [ Constants ]     [ Statistics ]    

title

Body

[close]

/mp-content/add-ons/ -> MailPress_autoresponder.php (source)

   1  <?php
   2  if (class_exists('MailPress') && !class_exists('MailPress_autoresponder'))
   3  {
   4  /*
   5  Plugin Name: MailPress_autoresponder
   6  Plugin URI: http://blog.mailpress.org/tutorials/add-ons/autoresponder/
   7  Description: Autoresponders (based on wp-cron)
   8  Version: 5.4.4
   9  */
  10  
  11  // 3.
  12  
  13  /** for admin plugin pages */
  14  define ('MailPress_page_autoresponders',     'mailpress_autoresponders');
  15  
  16  /** for admin plugin urls */
  17  $mp_file = 'admin.php';
  18  define ('MailPress_autoresponders', $mp_file . '?page=' . MailPress_page_autoresponders);
  19  
  20  class MailPress_autoresponder
  21  {
  22      const taxonomy = 'MailPress_autoresponder';
  23      const log_name = 'autoresponder';
  24  
  25      const bt = 100;
  26  
  27  	function __construct()
  28      {
  29  // for taxonomy
  30          add_action('init',             array(__CLASS__, 'init'), 1);
  31  
  32  // for plugin
  33          add_action('MailPress_addons_loaded',             array(__CLASS__, 'addons_loaded'));
  34  
  35  // for autoresponder (from older mailpress versions)
  36          add_action('mp_autoresponder_process',             array(__CLASS__, 'process'));
  37          add_action('mp_process_autoresponder',             array(__CLASS__, 'process'));
  38  
  39  // for wp admin
  40          if (is_admin())
  41          {
  42          // for install
  43              register_activation_hook(plugin_basename(__FILE__),     array(__CLASS__, 'install'));
  44          // for link on plugin page
  45              add_filter('plugin_action_links',             array(__CLASS__, 'plugin_action_links'), 10, 2 );
  46          // for role & capabilities
  47              add_filter('MailPress_capabilities',         array(__CLASS__, 'capabilities'), 1, 1);
  48          // for settings
  49              add_action('MailPress_settings_logs',         array(__CLASS__, 'settings_logs'), 10);
  50          // for load admin page
  51              add_filter('MailPress_load_admin_page',         array(__CLASS__, 'load_admin_page'), 10, 1);
  52          // for mails list
  53              add_action('MailPress_get_icon_mails',         array(__CLASS__, 'get_icon_mails'), 8, 1);
  54          // for meta box in write page
  55              add_action('MailPress_update_meta_boxes_write',    array(__CLASS__, 'update_meta_boxes_write'));
  56              add_filter('MailPress_styles',             array(__CLASS__, 'styles'), 8, 2);
  57              add_filter('MailPress_scripts',             array(__CLASS__, 'scripts'), 8, 2);
  58              add_action('MailPress_add_meta_boxes_write',    array(__CLASS__, 'add_meta_boxes_write'), 8, 2);
  59          }
  60  
  61  // for ajax
  62          add_action('mp_action_add_atrspndr',             array(__CLASS__, 'mp_action_add_atrspndr'));
  63          add_action('mp_action_delete_atrspndr',             array(__CLASS__, 'mp_action_delete_atrspndr'));
  64          add_action('mp_action_add_wa',                 array(__CLASS__, 'mp_action_add_wa'));
  65          add_action('mp_action_delete_wa',                 array(__CLASS__, 'mp_action_delete_wa'));
  66      }
  67  
  68  //// Taxonomy ////
  69  
  70  	public static function init() 
  71      {
  72          register_taxonomy(self::taxonomy, 'MailPress_autoresponder', array('update_count_callback' => array(__CLASS__, 'update_count_callback')));
  73      }
  74  
  75  	public static function update_count_callback( $autoresponders )
  76      {
  77          return 0;
  78      }
  79  
  80  //// Plugin ////
  81  
  82  	public static function addons_loaded()
  83      {
  84          new MP_Autoresponder_events();
  85      }
  86  
  87  ////  Autoresponder  ////
  88  
  89  	public static function process($args)
  90      {
  91          MP_::no_abort_limit();
  92  
  93          extract($args);        // $umeta_id, $mail_order
  94          $meta_id = (isset($umeta_id)) ? $umeta_id : $meta_id;
  95  
  96          $meta = MP_User_meta::get_by_id($meta_id);
  97          $term_id     = (!$meta) ? false : str_replace('_MailPress_autoresponder_', '', $meta->meta_key);
  98          if (!$term_id) return;
  99          
 100          $autoresponder = MP_Autoresponder::get($term_id);
 101  
 102          do_action('mp_process_autoresponder_' . $autoresponder->description['event'], $args);
 103      }
 104  
 105  ////  ADMIN  ////
 106  ////  ADMIN  ////
 107  ////  ADMIN  ////
 108  ////  ADMIN  ////
 109  
 110  // install
 111  	public static function install() 
 112      {
 113          $logs = get_option(MailPress::option_name_logs);
 114          if (!isset($logs[self::log_name]))
 115          {
 116              $logs[self::log_name] = MailPress::$default_option_logs;
 117              update_option(MailPress::option_name_logs, $logs );
 118          }
 119      }
 120  
 121  // for link on plugin page
 122  	public static function plugin_action_links($links, $file)
 123      {
 124          return MailPress::plugin_links($links, $file, plugin_basename(__FILE__), 'logs');
 125      }
 126  
 127  // for role & capabilities
 128  	public static function capabilities($capabilities)
 129      {
 130          $capabilities['MailPress_manage_autoresponders'] = array(    'name'    => __('Autoresponders', MP_TXTDOM),
 131                                                  'group'    => 'mails',
 132                                                  'menu'    => 15,
 133  
 134                                                  'parent'    => false,
 135                                                  'page_title'=> __('MailPress Autoresponders', MP_TXTDOM),
 136                                                  'menu_title'=> '&#160;' . __('Autoresponders', MP_TXTDOM),
 137                                                  'page'    => MailPress_page_autoresponders,
 138                                                  'func'    => array('MP_AdminPage', 'body')
 139                                      );
 140          return $capabilities;
 141      }
 142  
 143  // for settings
 144  	public static function settings_logs($logs)
 145      {
 146          MP_AdminPage::logs_sub_form(self::log_name, $logs, __('Autoresponder', MP_TXTDOM));
 147      }
 148  
 149  // for load admin page
 150  	public static function load_admin_page($hub)
 151      {
 152          $hub[MailPress_page_autoresponders] = 'autoresponders';
 153          return $hub;
 154      }
 155  
 156  // for ajax
 157  	public static function mp_action_add_atrspndr() 
 158      {
 159          if (!current_user_can('MailPress_manage_autoresponders')) die('-1');
 160  
 161          if ( '' === trim($_POST['name']) ) 
 162          {
 163              $x = new WP_Ajax_Response( array(    'what' => 'autoresponder', 
 164                                      'id' => new WP_Error( 'autoresponder_name', __('You did not enter a valid autoresponder name.', MP_TXTDOM) )
 165                                     ) );
 166              $x->send();
 167          }
 168  
 169          if ( MP_Autoresponder::exists( trim( $_POST['name'] ) ) ) 
 170          {
 171              $x = new WP_Ajax_Response( array(    'what' => 'autoresponder', 
 172                                      'id' => new WP_Error( __CLASS__ . '::exists', __('The autoresponder you are trying to create already exists.', MP_TXTDOM), array( 'form-field' => 'name' ) ), 
 173                                    ) );
 174              $x->send();
 175          }
 176      
 177          $autoresponder = MP_Autoresponder::insert( $_POST, true );
 178  
 179          if ( is_wp_error($autoresponder) ) 
 180          {
 181              $x = new WP_Ajax_Response( array(    'what' => 'autoresponder', 
 182                                      'id' => $autoresponder
 183                                    ) );
 184              $x->send();
 185          }
 186  
 187          if ( !$autoresponder || (!$autoresponder = MP_Autoresponder::get( $autoresponder )) )     MP_::mp_die('0');
 188  
 189          $autoresponder_full_name     = $autoresponder->name;
 190  
 191          include  (MP_ABSPATH . 'mp-admin/autoresponders.php');
 192          $x = new WP_Ajax_Response( array(    'what' => 'autoresponder', 
 193                                  'id' => $autoresponder->term_id, 
 194                                  'data' => MP_AdminPage::get_row( $autoresponder, array() ), 
 195                                  'supplemental' => array('name' => $autoresponder_full_name, 'show-link' => sprintf(__( 'Autoresponder <a href="#%s">%s</a> added' , MP_TXTDOM), "autoresponder-$autoresponder->term_id", $autoresponder_full_name))
 196                                ) );
 197          $x->send();
 198          break;
 199      }
 200  
 201  	public static function mp_action_delete_atrspndr() 
 202      {
 203          $id = isset($_POST['id'])? (int) $_POST['id'] : 0;
 204          MP_::mp_die( MP_Autoresponder::delete($id) ? '1' : '0' );
 205      }
 206  
 207  // for mails list
 208  	public static function get_icon_mails($mail_id)
 209      {
 210          if (!MP_Autoresponder::object_have_relations($mail_id)) return;
 211  ?>
 212              <span class='icon autoresponder' title="<?php _e('Autoresponder', MP_TXTDOM); ?>"></span>
 213  <?php
 214      }
 215          
 216  // for meta box in write page
 217  	public static function meta_box_write_parms()
 218      {
 219          $x['table_body_id'] = 'wa-list';                // the-list
 220          $x['ajax_response'] = 'wa-response';             // ajar-response
 221          $x['table_list_id'] = 'wa-list-table';            // list-table
 222  
 223          $x['tr_prefix_id']  = 'wa';
 224  
 225          return $x;
 226      }
 227  
 228  	public static function update_meta_boxes_write()
 229      {
 230      }
 231  
 232  	public static function styles($styles, $screen) 
 233      {
 234          if ($screen != MailPress_page_write) return $styles;
 235  
 236          wp_register_style ( MailPress_page_autoresponders, '/' . MP_PATH . 'mp-admin/css/write_autoresponders.css', array(), false, 1);
 237  
 238          $styles[] = MailPress_page_autoresponders;
 239  
 240          return $styles;
 241      }
 242  
 243  	public static function scripts($scripts, $screen) 
 244      {
 245          if ($screen != MailPress_page_write) return $scripts;
 246  
 247          wp_register_script( MailPress_page_autoresponders, '/' . MP_PATH . 'mp-admin/js/write_autoresponders.js', array('mp-lists'), false, 1);
 248          wp_localize_script( MailPress_page_autoresponders,     'adminautorespondersL10n',    array_merge(    array('pending' => __('%i% pending'), 'screen' => MP_AdminPage::screen),
 249                                                                              self::meta_box_write_parms(),
 250                                                                              array('l10n_print_after' => 'try{convertEntities(adminautorespondersL10n);}catch(e){};')
 251                                                                  )
 252          );
 253          $scripts[] = MailPress_page_autoresponders;
 254  
 255          return $scripts;
 256      }
 257  
 258  	public static function add_meta_boxes_write($mail_id, $mp_screen)
 259      {
 260          if ( !current_user_can( 'MailPress_manage_autoresponders') )    return;
 261          add_meta_box('write_autoresponder', __('Autoresponders', MP_TXTDOM), array(__CLASS__, 'meta_box'), MP_AdminPage::screen, 'normal', 'core');
 262      }
 263  /**/
 264  	public static function meta_box($mail)
 265      {
 266          $parms = self::meta_box_write_parms();
 267  ?>
 268  <div id='postcustomstuff'>
 269      <div id='<?php echo $parms['ajax_response'] ?>'></div>
 270  <?php
 271              $id = (isset($mail->id)) ? $mail->id : 0;
 272          $metadata = MP_Autoresponder::get_object_terms($id);
 273          $count = 0;
 274          if ( !$metadata ) : $metadata = array(); 
 275  ?>
 276      <table id='<?php echo $parms['table_list_id'] ?>' style='display: none;'>
 277          <thead>
 278              <tr>
 279                  <th class='left'><?php _e( 'Autoresponder', MP_TXTDOM ); ?></th>
 280                  <th><?php _e( 'Schedule', MP_TXTDOM ); ?></th>
 281              </tr>
 282          </thead>
 283          <tbody id='<?php echo $parms['table_body_id'] ?>' class='list:<?php echo $parms['tr_prefix_id'] ?>'>
 284              <tr><td></td></tr>
 285          </tbody>
 286      </table>
 287  <?php else : ?>
 288      <table id='<?php echo $parms['table_list_id'] ?>'>
 289          <thead>
 290              <tr>
 291                  <th class='left'><?php _e( 'Autoresponder', MP_TXTDOM ) ?></th>
 292                  <th><?php _e( 'Schedule', MP_TXTDOM ); ?></th>
 293              </tr>
 294          </thead>
 295          <tbody id='<?php echo $parms['table_body_id'] ?>' class='list:<?php echo $parms['tr_prefix_id'] ?>'>
 296  <?php foreach ( $metadata as $entry ) echo self::meta_box_autoresponder_row( $entry, $count ); ?>
 297          </tbody>
 298      </table>
 299  <?php endif; ?>
 300  <?php
 301      $autoresponders = MP_Autoresponder::get_all();
 302      foreach( $autoresponders as $autoresponder )
 303      {
 304          $_autoresponders[$autoresponder->term_id] = $autoresponder->name;
 305      }
 306      if (empty($_autoresponders)) :
 307  ?>
 308      <p>
 309          <strong>
 310              <?php _e( 'No autoresponder', MP_TXTDOM) ?>
 311          </strong>
 312      </p>
 313  <?php else : ?>
 314      <p>
 315          <strong>
 316              <?php _e( 'Link to :', MP_TXTDOM) ?>
 317          </strong>
 318      </p>
 319      <table id='add_<?php echo $parms['tr_prefix_id']; ?>'>
 320          <thead>
 321              <tr>
 322                  <th class='left'><label for='autoresponderselect'><?php _e( 'Autoresponder', MP_TXTDOM ) ?></label></th>
 323                  <th><label for='metavalue'><?php _e( 'Schedule', MP_TXTDOM ) ?></label></th>
 324              </tr>
 325          </thead>
 326          <tbody>
 327              <tr>
 328                  <td id='newarleft' class='left'>
 329                      <select id='autoresponderselect' name='autoresponderselect' tabindex='7'>
 330  <?php MP_AdminPage::select_option($_autoresponders, false); ?>
 331                      </select>
 332                  </td>
 333                  <td style='vertical-align:top;'>
 334                      <table style='border:none;margin:8px 0 8px 8px;width:95%;'>
 335                          <tbody>
 336                              <tr>
 337                                  <td class='arschedule'>
 338                                      <?php _e('Year', MP_TXTDOM);?><br />
 339                                      <select style='width:auto;margin:0;padding:0;' name='autoresponder[schedule][Y]' >
 340  <?php MP_AdminPage::select_number(0, 99, 0); ?>
 341                                      </select>
 342                                  </td>
 343                                  <td class='arschedule'>
 344                                      <?php _e('Month', MP_TXTDOM);?><br />
 345                                      <select style='width:auto;margin:0;padding:0;' name='autoresponder[schedule][M]' >
 346  <?php MP_AdminPage::select_number(0, 99, 0); ?>
 347                                      </select>
 348                                  </td>
 349                                  <td class='arschedule'>
 350                                      <?php _e('Week', MP_TXTDOM);?><br />
 351                                      <select style='width:auto;margin:0;padding:0;' name='autoresponder[schedule][W]' >
 352  <?php MP_AdminPage::select_number(0, 99, 0); ?>
 353                                      </select>
 354                                  </td>
 355                                  <td class='arschedule'>
 356                                      <?php _e('Day', MP_TXTDOM);?><br />
 357                                      <select style='width:auto;margin:0;padding:0;' name='autoresponder[schedule][D]' >
 358  <?php MP_AdminPage::select_number(0, 99, 0); ?>
 359                                      </select>
 360                                  </td>
 361                                  <td class='arschedule'>
 362                                      <?php _e('Hour', MP_TXTDOM);?><br />
 363                                      <select style='width:auto;margin:0;padding:0;' name='autoresponder[schedule][H]' >
 364  <?php MP_AdminPage::select_number(0, 99, 0); ?>
 365                                      </select>
 366                                  </td>
 367                              </tr>
 368                          </tbody>
 369                      </table>
 370                  </td>
 371              </tr>
 372              <tr>
 373                  <td>
 374                      <div class='submit' style='border: 0 none;float: none;padding: 0 8px 8px;'>
 375                          <input type='submit' id='addmetasub' name='addwrite_autoresponder' class='add:<?php echo $parms['table_body_id']; ?>:add_<?php echo $parms['tr_prefix_id']; ?> button' tabindex='9' value="<?php _e( 'Add', MP_TXTDOM ) ?>" />
 376                      </div>
 377                  </td>
 378                  <td>
 379                      <p class='description'><?php _e('Not more than one year between two scheduled mails.', MP_TXTDOM); ?></p>
 380                      <?php wp_nonce_field( 'add-write-autoresponder', '_ajax_nonce', false ); ?>
 381                  </td>
 382              </tr>
 383          </tbody>
 384      </table>
 385  <?php endif; ?>
 386  </div>
 387  <?php
 388      }
 389      // for ajax
 390  	public static function meta_box_autoresponder_row( $entry, &$count ) 
 391      {
 392          $parms = self::meta_box_write_parms();
 393  
 394          static $update_nonce = false;
 395          if ( !$update_nonce ) $update_nonce = wp_create_nonce( 'add-write-autoresponder' );
 396  
 397          $r = '';
 398          ++ $count;
 399  
 400          if ( $count % 2 )    $style = 'alternate';
 401          else            $style = '';
 402  
 403          $entry['meta_id']     = (int) $entry['meta_id'];
 404  
 405          $delete_nonce         = wp_create_nonce( 'delete-write-autoresponder_' . $entry['meta_id'] );
 406  
 407          $autoresponders = MP_Autoresponder::get_all();
 408          foreach( $autoresponders as $autoresponder )
 409          {
 410              $_autoresponders[$autoresponder->term_id] = $autoresponder->name;
 411          }
 412          $r .= "
 413              <tr id='{$parms['tr_prefix_id']}-{$entry['meta_id']}' class='$style'>
 414                  <td class='left'>
 415                      <select id='write_autoresponder_{$entry['meta_id']}_key' name='write_autoresponder[{$entry['meta_id']}][key]' tabindex='7'>
 416  " . MP_::select_option($_autoresponders, $entry['term_id'], false) . "
 417                      </select>
 418                      <div class='submit'>
 419                          <input name='delete_wa-{$entry['meta_id']}' type='submit' class='delete:{$parms['table_body_id']}:{$parms['tr_prefix_id']}-{$entry['meta_id']}::_ajax_nonce=$delete_nonce delete_wa button' tabindex='6' value='".esc_attr(__( 'Delete' ))."' />
 420                          <input name='update_wa-{$entry['meta_id']}' type='submit' tabindex='6' value='".esc_attr(__( 'Update' ))."' class='add:{$parms['table_body_id']}:{$parms['tr_prefix_id']}-{$entry['meta_id']}::_ajax_nonce=$update_nonce update_wa button' />
 421                      " . wp_nonce_field( 'change-write_autoresponder', '_ajax_nonce', false, false ) . "
 422                      </div>
 423                  </td>
 424                  <td style='vertical-align:top;'>
 425                      <table style='border:none;margin:8px 0 8px 8px;width:95%;'>
 426                          <tbody>
 427                              <tr>
 428                                  <td class='arschedule'>
 429                                      " . __('Year', MP_TXTDOM) . "<br />
 430                                      <select style='width:auto;margin:0;padding:0;' name='write_autoresponder[" . $entry['meta_id'] . "][value][Y]' >
 431  " . MP_::select_number(0, 99, $entry['schedule']['Y'], 1, false) . "
 432                                      </select>
 433                                  </td>
 434                                  <td class='arschedule'>
 435                                      " . __('Month', MP_TXTDOM) . "<br />
 436                                      <select style='width:auto;margin:0;padding:0;' name='write_autoresponder[" . $entry['meta_id'] . "][value][M]' >
 437  " . MP_::select_number(0, 99, $entry['schedule']['M'], 1, false) . "
 438                                      </select>
 439                                  </td>
 440                                  <td class='arschedule'>
 441                                      " . __('Week', MP_TXTDOM) . "<br />
 442                                      <select style='width:auto;margin:0;padding:0;' name='write_autoresponder[" . $entry['meta_id'] . "][value][W]' >
 443  " . MP_::select_number(0, 99, $entry['schedule']['W'], 1, false) . "
 444                                      </select>
 445                                  </td>
 446                                  <td class='arschedule'>
 447                                      " . __('Day', MP_TXTDOM) . "<br />
 448                                      <select style='width:auto;margin:0;padding:0;' name='write_autoresponder[" . $entry['meta_id'] . "][value][D]' >
 449  " . MP_::select_number(0, 99, $entry['schedule']['D'], 1, false) . "
 450                                      </select>
 451                                  </td>
 452                                  <td class='arschedule'>
 453                                      " . __('Hour', MP_TXTDOM) . "<br />
 454                                      <select style='width:auto;margin:0;padding:0;' name='write_autoresponder[" . $entry['meta_id'] . "][value][H]' >
 455  " . MP_::select_number(0, 99, $entry['schedule']['H'], 1, false) . "
 456                                      </select>
 457                                  </td>
 458                              </tr>
 459                          </tbody>
 460                      </table>
 461                  </td>
 462              </tr>
 463              ";
 464          return $r;
 465      }
 466  
 467  // for ajax    
 468  
 469  	public static function mp_action_add_wa()
 470      {
 471          if ( !current_user_can( 'MailPress_manage_autoresponders') )    die('-1');
 472  
 473          $c = 0;
 474          $object_id = (int) $_POST['mail_id'];
 475          if ($object_id === 0) MP_::mp_die();
 476  
 477          if ( isset($_POST['autoresponderselect']) || isset($_POST['autoresponder']['schedule']) ) 
 478          {
 479              if ( !$meta_id = self::add_meta( $object_id ) ) MP_::mp_die();
 480  
 481              $response = array('position'     => 1);
 482          }
 483          else
 484          {
 485              $meta_id   = (int) array_pop(array_keys($_POST['write_autoresponder']));
 486              $key   = '_MailPress_autoresponder_' . $_POST['write_autoresponder'][$meta_id]['key'];
 487              $value = $_POST['write_autoresponder'][$meta_id]['value'];
 488  
 489              if ( !$meta = MP_Mail_meta::get_by_id( $meta_id ) )        MP_::mp_die();
 490              if ( !MP_Mail_meta::update_by_id($meta_id , $key, $value) )    MP_::mp_die(1);
 491  
 492              $response = array('old_id'     => $meta_id, 'position'     => 0);
 493          }
 494  
 495          $meta = MP_Mail_meta::get_by_id( $meta_id );
 496          $object_id = (int) $meta->mp_mail_id;
 497          $meta = get_object_vars( $meta );
 498  
 499          $response = array_merge($response, array('what' => 'write-autoresponder', 'id' => $meta_id, 'data' => self::meta_box_autoresponder_row( MP_Autoresponder::get_term_meta_id($meta_id), $c ), 'supplemental' => array('mail_id' => $object_id) ) );
 500  
 501          $x = new WP_Ajax_Response( $response );
 502  
 503          $x->send();
 504  
 505      }
 506  
 507  	public static function add_meta($mail_id)
 508      {
 509          $mail_id = (int) $mail_id;
 510          if (isset($_POST['autoresponder']['schedule'])) foreach ($_POST['autoresponder']['schedule'] as $k => $v) if ($v <10) $_POST['autoresponder']['schedule'][$k] = '0' . $v;
 511  
 512          $meta_key     = isset($_POST['autoresponderselect']) ? '_MailPress_autoresponder_' . trim( $_POST['autoresponderselect'] ) : '';
 513          $meta_value= isset($_POST['autoresponder']['schedule']) ? $_POST['autoresponder']['schedule'] : array();
 514  
 515          if ( empty($meta_value) || empty ($meta_key) ) return false;
 516  
 517          return MP_Mail_meta::add( $mail_id, $meta_key, $meta_value );
 518      }
 519  
 520  	public static function mp_action_delete_wa()
 521      {
 522          if ( !current_user_can( 'MailPress_manage_autoresponders') )    MP_::mp_die('-1');
 523  
 524          $id = isset($_POST['id'])? (int) $_POST['id'] : 0;
 525  
 526          if ( !$meta = MP_Mail_meta::get_by_id( $id ) )                 MP_::mp_die('1');
 527          if ( MP_Mail_meta::delete_by_id( $meta->meta_id ) )            MP_::mp_die('1');
 528          MP_::mp_die('0');
 529      }
 530  }
 531  new MailPress_autoresponder();
 532  }


Generated: Thu Apr 28 18:38:52 2016 Cross-referenced by PHPXref 0.7.1