Your IP : 216.73.216.0


Current Path : /home/goldnueh/www/wp-content/plugins/sliced-invoices/admin/includes/
Upload File :
Current File : /home/goldnueh/www/wp-content/plugins/sliced-invoices/admin/includes/sliced-admin-options.php

<?php

// Exit if accessed directly
if ( ! defined('ABSPATH') ) { exit; }


class Sliced_Options {

	/**
	 * Default Option key
	 * @var string
	 */
	private $key = 'sliced_options';

	/**
	 * Array of metaboxes/fields
	 * @var array
	 */
	public $option_metabox = array();

	/**
	 * Options Page title
	 * @var string
	 */
	protected $title = '';

	/**
	 * Options Page title
	 * @var string
	 */
	protected $menu_title = '';

	/**
	 * Options Tab Pages
	 * @var array
	 */
	public $options_pages = array();

	/**
	 * Constructor
	 * @since 0.1.0
	 */
	public function __construct() {
		// Set our title
		$this->menu_title = __( 'Sliced Invoices', 'sliced-invoices' );
		$this->title = __( 'Sliced Invoices', 'sliced-invoices' );
	}

	/**
	 * Initiate our hooks
	 * @since 0.1.0
	 */
	public function hooks() {
		add_action( 'admin_init', array( $this, 'init' ), 999 );
		add_action( 'admin_menu', array( $this, 'add_options_page' ), 999 ); //create tab pages
		add_action( 'network_admin_menu', array( $this, 'add_options_page' ), 999 ); //for WP Multisite support
	}

	/**
	 * Register our setting tabs to WP
	 * @since  0.1.0
	 */
	public function init() {
		$option_tabs = self::option_fields();
		foreach ($option_tabs as $index => $option_tab) {
			register_setting( $option_tab['id'], $option_tab['id'] );
		}

	}

	/**
	 * Add menu options page.
	 * 
	 * @version 3.9.0
	 * @since 0.1.0
	 */
	public function add_options_page() {

		$option_tabs = self::option_fields();
		
		// Link admin menu to first tab
		$this->options_pages[] = add_menu_page( $this->title, $this->menu_title, 'manage_options', 'sliced_invoices_settings', array( $this, 'admin_page_display' ), 'dashicons-sliced' );
		
		// Duplicate menu link for first submenu page
		add_submenu_page( 'sliced_invoices_settings', $this->menu_title, __( 'Settings', 'sliced-invoices' ), 'manage_options', 'sliced_invoices_settings', array( $this, 'admin_page_display' ) );
		
		// add special pages
		$plugin_reports = new Sliced_Reports();
		$plugin_tools = new Sliced_Tools();
		$this->options_pages[] = add_submenu_page( 'sliced_invoices_settings', 'Reports', 'Reports', 'manage_options', 'sliced_reports', array( $plugin_reports, 'display_reports_page' )  );
		$this->options_pages[] = add_submenu_page( 'sliced_invoices_settings', 'Tools', 'Tools', 'manage_options', 'sliced_tools', array( $plugin_tools, 'display_tools_page' )  );
		
		// add "pinned" settings pages
		$this->options_pages[] = add_submenu_page( 'sliced_invoices_settings', $this->menu_title, 'Extras', 'manage_options', 'sliced_extras', array( $this, 'admin_page_display' ) );
		$this->options_pages[] = add_submenu_page( 'sliced_invoices_settings', $this->menu_title, 'Licenses', 'manage_options', 'sliced_licenses', array( $this, 'admin_page_display' ) );
		
		// for backwards compatibility (will be removed at some point in the future...)
		// $this->options_pages[] = add_submenu_page( null, $this->menu_title, 'General Settings', 'manage_options', 'sliced_general', array( $this, 'admin_page_display' ) );
		// $this->options_pages[] = add_submenu_page( null, $this->menu_title, 'Business Settings', 'manage_options', 'sliced_business', array( $this, 'admin_page_display' ) );
		// $this->options_pages[] = add_submenu_page( null, $this->menu_title, 'Quotes Settings', 'manage_options', 'sliced_quotes', array( $this, 'admin_page_display' ) );
		// $this->options_pages[] = add_submenu_page( null, $this->menu_title, 'Invoices Settings', 'manage_options', 'sliced_invoices', array( $this, 'admin_page_display' ) );
		// $this->options_pages[] = add_submenu_page( null, $this->menu_title, 'Payments Settings', 'manage_options', 'sliced_payments', array( $this, 'admin_page_display' ) );
		// $this->options_pages[] = add_submenu_page( null, $this->menu_title, 'Email Settings', 'manage_options', 'sliced_emails', array( $this, 'admin_page_display' ) );
		// $this->options_pages[] = add_submenu_page( null, $this->menu_title, 'PDF Settings', 'manage_options', 'sliced_pdf', array( $this, 'admin_page_display' ) );
		// $this->options_pages[] = add_submenu_page( null, $this->menu_title, 'Translate Settings', 'manage_options', 'sliced_translate', array( $this, 'admin_page_display' ) );
		
		// Include CMB CSS in the head to avoid FOUC
		foreach ( $this->options_pages as $page ) {
			add_action( "admin_print_styles-{$page}", array( 'CMB2_Hookup', 'enqueue_cmb_css' ) );
		}
		
	}


	/**
	 * Admin page markup.
	 * Mostly handled by CMB2.
	 * 
	 * @version 3.9.0
	 * @since   0.1.0
	 */
	public function admin_page_display() {

		global $pagenow;

		// check we are on the network settings page
		if( $pagenow != 'admin.php' ) {
			return;
		}
		
		if ( isset( $_GET['page'] ) && $_GET['page'] === 'sliced_extras' ) {
			$current_tab = 'extras';
		} elseif ( isset( $_GET['page'] ) && $_GET['page'] === 'sliced_licenses' ) {
			$current_tab = 'licenses';
		} else {
			$current_tab = empty( $_GET['tab'] ) ? 'general' : sanitize_title( $_GET['tab'] );
		}
		
		$option_tabs = self::option_fields(); //get all option tabs
		$tab_forms = array();

		?>
		<div class="wrap cmb2_sliced_options_page <?php echo esc_attr($this->key); ?>">

			<h2><?php _e( 'Sliced Invoices Settings', 'sliced-invoices' ) ?></h2>

			<!-- Options Page Nav Tabs -->
			<h2 class="nav-tab-wrapper">
				<?php foreach ($option_tabs as $option_tab) :
					$tab_slug = $option_tab['id'];
					$nav_class = 'i18n-multilingual-display nav-tab';
					if ( $tab_slug === 'sliced_'.$current_tab ) {
						$nav_class .= ' nav-tab-active'; //add active class to current tab
						$tab_forms[] = $option_tab; //add current tab to forms to be rendered
					}
					if ( $tab_slug === 'sliced_extras' || $tab_slug === 'sliced_licenses' ) {
						$admin_url = admin_url( 'admin.php?page='.$tab_slug );
					} else {
						$admin_url = admin_url( 'admin.php?page=sliced_invoices_settings&tab=' . str_replace( 'sliced_', '', $tab_slug ) );
					}
					?>
					<a class="<?php echo esc_attr( $nav_class ); ?>" href="<?php echo $admin_url; ?>"><?php esc_attr_e( $option_tab['menu_title'], 'sliced-invoices' ); ?></a>
				<?php endforeach; ?>
			</h2>

			<!-- End of Nav Tabs -->
			<?php foreach ($tab_forms as $tab_form) : //render all tab forms (normaly just 1 form) ?>
			<div id="<?php esc_attr_e($tab_form['id']); ?>" class="cmb-form group">
				<div class="metabox-holder">
					<div class="postbox">
						<h3 class="title"><?php esc_html_e($tab_form['title'], 'sliced-invoices'); ?></h3>
						<div class="desc"><?php echo $tab_form['desc'] ?></div>
						<?php cmb2_metabox_form( $tab_form, $tab_form['id'] ); ?>
					</div>
				</div>
			</div>
			<?php endforeach; ?>
		</div>
		<?php
	}

	/**
	 * Defines the contents of the plugin settings pages.
	 * 
	 * @version 3.9.0
	 * @since   0.1.0
	 * 
	 * @return array
	 */
	public function option_fields() {
		
		// Only need to initiate the array once per page-load
		if ( ! empty( $this->option_metabox ) ) {
			return $this->option_metabox;
		}
		
		$payments             = get_option( 'sliced_payments' );
		$quote_label          = sliced_get_quote_label();
		$quote_label_plural   = sliced_get_quote_label_plural();
		$invoice_label        = sliced_get_invoice_label();
		$invoice_label_plural = sliced_get_invoice_label_plural();
		$current_user         = wp_get_current_user();
		
		$this->option_metabox[] = apply_filters( 'sliced_general_option_fields', array(
			'id'         => 'sliced_general',
			'title'      => __( 'General Settings', 'sliced-invoices' ),
			'menu_title' => __( 'General', 'sliced-invoices' ),
			'desc'       => __( 'Just some general options.', 'sliced-invoices' ),
			'show_on'    => array( 'key' => 'options-page', 'value' => array( 'general' ), ),
			'show_names' => true,
			'fields'     => array(
				array(
					'name'      => __( 'Year Start', 'sliced-invoices' ),
					'id'        => 'year_start',
					'desc'      => __( 'The start date of the fiscal year', 'sliced-invoices' ),
					'type'      => 'select',
					'options'   => array(
						'01' => __( '01 Jan', 'sliced-invoices' ),
						'02' => __( '01 Feb', 'sliced-invoices' ),
						'03' => __( '01 Mar', 'sliced-invoices' ),
						'04' => __( '01 Apr', 'sliced-invoices' ),
						'05' => __( '01 May', 'sliced-invoices' ),
						'06' => __( '01 Jun', 'sliced-invoices' ),
						'07' => __( '01 Jul', 'sliced-invoices' ),
						'08' => __( '01 Aug', 'sliced-invoices' ),
						'09' => __( '01 Sep', 'sliced-invoices' ),
						'10' => __( '01 Oct', 'sliced-invoices' ),
						'11' => __( '01 Nov', 'sliced-invoices' ),
						'12' => __( '01 Dec', 'sliced-invoices' ),
					),
				),
				array(
					'name'      => __( 'Year End', 'sliced-invoices' ),
					'id'        => 'year_end',
					'desc'      => __( 'The end date of the fiscal year', 'sliced-invoices' ),
					'type'      => 'select',
					'options'   => array(
						'01' => __( '31 Jan', 'sliced-invoices' ),
						'02' => __( '28 Feb', 'sliced-invoices' ),
						'03' => __( '31 Mar', 'sliced-invoices' ),
						'04' => __( '30 Apr', 'sliced-invoices' ),
						'05' => __( '31 May', 'sliced-invoices' ),
						'06' => __( '30 Jun', 'sliced-invoices' ),
						'07' => __( '31 Jul', 'sliced-invoices' ),
						'08' => __( '31 Aug', 'sliced-invoices' ),
						'09' => __( '30 Sep', 'sliced-invoices' ),
						'10' => __( '31 Oct', 'sliced-invoices' ),
						'11' => __( '30 Nov', 'sliced-invoices' ),
						'12' => __( '31 Dec', 'sliced-invoices' ),
					),
				),
				array(
					'name'      => __( 'Pre-Defined Line Items', 'sliced-invoices' ),
					'desc'      => __( 'Add 1 line item per line in this format: Qty | Title | Price | Description. Each field separated with a | symbol. <br>Price should be numbers only, no currency symbol.<br>If you prefer to have an item blank, you still need the | symbol like so: 1 | Web Design | | Designing the web', 'sliced-invoices' ),
					'default'   => '',
					'id'        => 'pre_defined',
					'type'      => 'textarea_small',
					'attributes' => array(
						'placeholder' => '1 | Title goes here | 85 | Description goes here and basic HTML is allowed.',
					)
				),
			)
		) );
		
		$this->option_metabox[] = apply_filters( 'sliced_business_option_fields', array(
			'id'         => 'sliced_business',
			'title'      => __( 'Business Settings', 'sliced-invoices' ),
			'menu_title' => __( 'Business', 'sliced-invoices' ),
			'desc'       => sprintf( __( 'All of the Business Details below will be displayed on the %1s & %2s.', 'sliced-invoices' ), '<span class="i18n-multilingual-display">'.$quote_label_plural.'</span>', '<span class="i18n-multilingual-display">'.$invoice_label_plural.'</span>' ),
			'show_on'    => array( 'key' => 'options-page', 'value' => array( 'business' ), ),
			'show_names' => true,
			'fields'     => array(
				array(
					'name'      => __( 'Logo', 'sliced-invoices' ),
					'desc'      => __( 'Logo of your business. If no logo is added, the name of your business will be used instead.', 'sliced-invoices' ),
					'id'        => 'logo',
					'type'      => 'file',
					'allow'     => array( 'url', 'attachment' )
				),
				array(
					'name'      => __( 'Business Name', 'sliced-invoices' ),
					'default'   => '',
					'id'        => 'name',
					'type'      => 'text',
				),
				array(
					'name'      => __( 'Address', 'sliced-invoices' ),
					'desc'      => __( 'Add your full address and format it anyway you like. Basic HTML is allowed.', 'sliced-invoices' ),
					'default'   => '',
					'id'        => 'address',
					'type'      => 'textarea_small',
				),
				array(
					'name'      => __( 'Extra Business Info', 'sliced-invoices' ),
					'desc'      => __( 'Extra business info such as Business Number, phone number or email address and format it anyway you like. Basic HTML is allowed.<br>You can add your VAT number or ABN here.', 'sliced-invoices' ),
					'default'   => '',
					'id'        => 'extra_info',
					'type'      => 'textarea_small'
				),
				array(
					'name'      => __( 'Website', 'sliced-invoices' ),
					'default'   => 'This will add a link on your logo and your business name.',
					'id'        => 'website',
					'type'      => 'text'
				),
			)
		) );
		
		// Quotes
		$this->option_metabox[] = apply_filters( 'sliced_quote_option_fields', array(
			'id'         => 'sliced_quotes',
			'title'      => sprintf(
				/* translators: %s is a placeholder for the localized word "Quote" (singular) */
				__( '%s Settings', 'sliced-invoices' ),
				$quote_label
			),
			'menu_title' => $quote_label_plural,
			'desc'       => sprintf(
				/* translators: %s is a placeholder for the localized word "Quotes" (plural) */
				__( 'Here you will find all the settings for %s.', 'sliced-invoices' ),
				$quote_label_plural
			),
			'show_on'    => array( 'key' => 'options-page', 'value' => array( 'quotes' ), ),
			'show_names' => true,
			'fields'     => array(
				array(
					'name'       => __( 'Prefix', 'sliced-invoices' ),
					'desc'       => sprintf(
						/* translators: %s is a placeholder for the localized word "Quote" (singular) */
						__( 'Prefix before each %s number. Can be left blank if you don\'t need a prefix.', 'sliced-invoices' ),
						$quote_label
					),
					'default'    => '',
					'id'         => 'prefix',
					'type'       => 'text',
				),
				array(
					'name'       => __( 'Suffix', 'sliced-invoices' ),
					'desc'       => sprintf(
						/* translators: %s is a placeholder for the localized word "Quote" (singular) */
						__( 'Suffix after each %s number. Can be left blank if you don\'t need a suffix.', 'sliced-invoices' ),
						$quote_label
					),
					'default'    => '',
					'id'         => 'suffix',
					'type'       => 'text',
				),
				array(
					'name'       => __( 'Auto Increment', 'sliced-invoices' ),
					'desc'       => sprintf(
						/* translators: %s is a placeholder for the localized word "Quote" (singular) */
						__( 'Yes, increment %s numbers by one. Recommended.', 'sliced-invoices' ),
						$quote_label
					),
					'id'         => 'increment',
					'type'       => 'checkbox',
				),
				array(
					'name'       => __( 'Next Number', 'sliced-invoices' ),
					'desc'       => __( 'The next number to use for auto incrementing. Can use leading zeros.', 'sliced-invoices' ),
					'default'    => '',
					'id'         => 'number',
					'type'       => 'text',
				),
				array(
					'name'       => sprintf(
						/* translators: %s is a placeholder for the localized word "Quotes" (plural) */
						__( '%s Valid For', 'sliced-invoices' ),
						$quote_label_plural
					),
					'desc'       => sprintf(
						/* translators: %1s is a placeholder for the word "Quote" (singular); %2s is a placeholder for "Quotes" (plural) */
						__( 'Number of days each %1s is valid for. This will automatically set the date in the \'Valid Until\' field.<br>Can be overriden on individual %2s.', 'sliced-invoices' ),
						$quote_label,
						$quote_label_plural
					),
					'default'    => '',
					'id'         => 'valid_until',
					'type'       => 'text',
					'attributes' => array(
						'type'        => 'number',
						'placeholder' => '30',
					)
				),
				array(
					'name'       => __( 'Hide Adjust Field', 'sliced-invoices' ),
					'desc'       => __( 'Yes, hide the Adjust field on line items, I won\'t need this field', 'sliced-invoices' ),
					'id'         => 'adjustment',
					'type'       => 'checkbox',
				),
				array(
					'name'       => __( 'Terms & Conditions', 'sliced-invoices' ),
					'desc'       => sprintf(
						/* translators: %1s is a placeholder for the word "Quote" (singular); %2s is a placeholder for "Quotes" (plural) */
						__( 'Terms and conditions displayed on the %1s.<br>Can be overriden on individual %2s.', 'sliced-invoices' ),
						$quote_label,
						$quote_label_plural
					),
					'default'    => '',
					'id'         => 'terms',
					'type'       => 'textarea_small'
				),
				array(
					'name'       => __( 'Footer', 'sliced-invoices' ),
					'desc'       => sprintf(
						/* translators: %1s is a placeholder for the localized word "Quote" (singular) */
						__( 'The footer will be displayed at the bottom of each %1s. Basic HTML is allowed.', 'sliced-invoices' ),
						$quote_label
					),
					'default'    => '',
					'id'         => 'footer',
					'type'       => 'textarea_small',
				),
				array(
					'name'       => sprintf(
						/* translators: %s is a placeholder for the localized word "Quotes" (plural) */
						__( 'Accepting %s', 'sliced-invoices' ),
						$quote_label_plural
					),
					'id'         => 'accept_quote_title',
					'type'       => 'title',
				),
				array(
					'name'       => sprintf(
						/* translators: %s is a placeholder for the localized word "Quote" (singular) */
						__( 'Accept %s Button', 'sliced-invoices' ),
						$quote_label
					),
					'desc'       => sprintf(
						/* translators: %1s is a placeholder for the word "Quote" (singular); %2s is a placeholder for "Quotes" (plural) */
						__( 'Yes, show the "Accept %1s" button on %2s.', 'sliced-invoices' ),
						$quote_label,
						$quote_label_plural
					),
					'id'         => 'accept_quote',
					'type'       => 'checkbox',
				),
				array(
					'name'       => sprintf(
						/* translators: %s is a placeholder for the localized word "Quote" (singular) */
						__( 'Accepted %s Action', 'sliced-invoices' ),
						$quote_label
					),
					'desc'       => sprintf(
						/* translators: %s is a placeholder for the localized word "Quote" (singular) */
						__( 'Actions to perform automatically when client accepts a %s.', 'sliced-invoices' ),
						$quote_label
					),
					'id'         => 'accepted_quote_action',
					'type'       => 'select',
					'default'    => 'convert',
					'options'    => array(
						'convert'        => sprintf(
							/* translators: %1s is a placeholder for the word "Quote" (singular); %2s is a placeholder for "Invoice" (singular) */
							__( 'Convert %1s to %2s', 'sliced-invoices' ),
							$quote_label,
							$invoice_label
						),
						'convert_send'   => sprintf(
							/* translators: %1s is a placeholder for the word "Quote" (singular); %2s is a placeholder for "Invoice" (singular) */
							__( 'Convert %1s to %2s and send to client', 'sliced-invoices' ),
							$quote_label,
							$invoice_label
						),
						'duplicate'      => sprintf(
							/* translators: %1s is a placeholder for the word "Invoice" (singular); %2s is a placeholder for "Quote" (singular) */
							__( 'Create new %1s, keep %2s as-is', 'sliced-invoices' ),
							$invoice_label,
							$quote_label
						),
						'duplicate_send' => sprintf(
							/* translators: %1s is a placeholder for the word "Invoice" (singular); %2s is a placeholder for "Quote" (singular) */
							__( 'Create new %1s and send to client, keep %2s as-is', 'sliced-invoices' ),
							$invoice_label,
							$quote_label
						),
						'do_nothing'     => __( 'Do nothing', 'sliced-invoices' ),
					),
				),
				array(
					'name'       => sprintf(
						/* translators: %s is a placeholder for the localized word "Quote" (singular) */
						__( 'Accept %s Text', 'sliced-invoices' ),
						$quote_label
					),
					'desc'       => sprintf(
						/* translators: %1s and %2s are placeholders for the localized word "Quote" (singular) */
						__( 'Text to add on the "Accept %1s" popup. Basic HTML is allowed.<br>This should provide some indication to your client of what happens after accepting the %2s.', 'sliced-invoices' ),
						$quote_label,
						$quote_label
					),
					'default'    => '',
					'id'         => 'accept_quote_text',
					'type'       => 'textarea_small'
				),
				array(
					'name'       => sprintf(
						/* translators: %s is a placeholder for the localized word "Quote" (singular) */
						__( 'Accepted %s Message', 'sliced-invoices' ),
						$quote_label
					),
					'desc'       => sprintf(
						/* translators: %s is a placeholder for the localized word "Quote" (singular) */
						__( 'Message to display if client accepts the %s. Basic HTML is allowed.<br>Leave blank for the default message.', 'sliced-invoices' ),
						$quote_label
					),
					'default'    => '',
					'id'         => 'accepted_quote_message',
					'type'       => 'textarea_small',
					'attributes' => array(
						'placeholder' => sprintf(
							/* translators: %s is a placeholder for the localized word "Quote" (singular) */
							__( 'You have accepted the %s.<br>We will be in touch shortly.', 'sliced-invoices' ),
							$quote_label
						),
					)
				),
				array(
					'name'       => __( 'Decline Reason Required', 'sliced-invoices' ),
					'desc'       => __( 'Yes, make the "Reason for declining" field required.', 'sliced-invoices' ),
					'id'         => 'decline_reason_required',
					'type'       => 'checkbox',
				),
				array(
					'name'       => sprintf(
						/* translators: %s is a placeholder for the localized word "Quote" (singular) */
						__( 'Declined %s Message', 'sliced-invoices' ),
						$quote_label
					),
					'desc'       => sprintf(
						/* translators: %s is a placeholder for the localized word "Quote" (singular) */
						__( 'Message to display if client declines the %s. Basic HTML is allowed.<br>Leave blank for the default message.', 'sliced-invoices' ),
						$quote_label
					),
					'default'    => '',
					'id'         => 'declined_quote_message',
					'type'       => 'textarea_small',
					'attributes' => array(
						'placeholder' => sprintf(
							/* translators: %s is a placeholder for the localized word "Quote" (singular) */
							__( 'You have declined the %s.<br>We will be in touch shortly.', 'sliced-invoices' ),
							$quote_label
						),
					)
				),
				array(
					'name'       => __( 'Admin Notices', 'sliced-invoices' ),
					'desc'       => sprintf(
						__( 'These settings allow you to choose which notices may be displayed in your WordPress Admin area. (Note: this is different from admin emails, which you can configure on the <a href="%s">Email Settings</a> tab.', 'sliced-invoices' ),
						admin_url( 'admin.php?page=sliced_invoices_settings&tab=emails' )
					),
					'id'         => 'quote_admin_notices_title',
					'type'       => 'title',
				),
				array(
					'name'       => __( 'Show me notices when', 'sliced-invoices' ),
					'id'         => 'quote_admin_notices',
					'type'       => 'multicheck',
					'options'    => array(
						'quote_viewed'   => sprintf(
							/* translators: %s is a placeholder for the localized word "Quote" (singular) */
							__( '%s Viewed', 'sliced-invoices' ),
							$quote_label
						),
						'quote_accepted' => sprintf(
							/* translators: %s is a placeholder for the localized word "Quote" (singular) */
							__( '%s Accepted', 'sliced-invoices' ),
							$quote_label
						),
					),
				),
				array(
					'name'       => __( 'Template Design', 'sliced-invoices' ),
					'desc'       => sprintf(
						/* translators: %s: URL */
						__( 'For information on customizing your templates, please see our guide <a target="_blank" href="%s">here</a>.', 'sliced-invoices' ),
						'https://slicedinvoices.com/support/quote-invoice-templates/?utm_source=quote_settings_page_templates&utm_campaign=free&utm_medium=sliced_invoices'
					),
					'id'         => 'quote_design_title',
					'type'       => 'title',
				),
				array(
					'name'       => __( 'Template', 'sliced-invoices' ),
					'id'         => 'template',
					'type'       => 'radio',
					'default'    => 'template1',
					'options'    => apply_filters( 'sliced_quote_template_options', array(
						'template1' => '<img src="' . plugin_dir_url( dirname( __FILE__ ) ) . '/img/template1.png" width="200" />',
						'template2' => '<img src="' . plugin_dir_url( dirname( __FILE__ ) ) . '/img/template2.png" width="200" />',
						'template3' => '<img src="' . plugin_dir_url( dirname( __FILE__ ) ) . '/img/template3.png" width="200" />',
					) ),
				),
				array(
					'name'       => __( 'Custom CSS', 'sliced-invoices' ),
					'desc'       => sprintf(
						/* translators: %s is a placeholder for the localized word "Quotes" (plural) */
						__( 'Add custom CSS to your %s', 'sliced-invoices' ),
						$quote_label_plural
					),
					'default'    => '',
					'id'         => 'css',
					'type'       => 'textarea_small',
				),
			)
		) );
		
		// Invoices
		$this->option_metabox[] = apply_filters( 'sliced_invoice_option_fields', array(
			'id'         => 'sliced_invoices',
			'title'      => sprintf(
				/* translators: %s is a placeholder for the localized word "Invoice" (singular) */
				__( '%s Settings', 'sliced-invoices' ),
				$invoice_label
			),
			'menu_title' => $invoice_label_plural,
			'desc'       => sprintf(
				/* translators: %s is a placeholder for the localized word "Invoices" (plural) */
				__( 'Here you will find all the settings for %s.', 'sliced-invoices' ),
				$invoice_label_plural
			),
			'show_on'    => array( 'key' => 'options-page', 'value' => array( 'invoices' ), ),
			'show_names' => true,
			'fields'     => array(
				array(
					'name'       => __( 'Prefix', 'sliced-invoices' ),
					'desc'       => sprintf(
						/* translators: %s is a placeholder for the localized word "Invoice" (singular) */
						__( 'Prefix before each %s number. Can be left blank if you don\'t need a prefix.', 'sliced-invoices' ),
						$invoice_label
					),
					'default'    => '',
					'id'         => 'prefix',
					'type'       => 'text',
				),
				array(
					'name'       => __( 'Suffix', 'sliced-invoices' ),
					'desc'       => sprintf(
						/* translators: %s is a placeholder for the localized word "Invoice" (singular) */
						__( 'Suffix after each %s number. Can be left blank if you don\'t need a suffix.', 'sliced-invoices' ),
						$invoice_label
					),
					'default'    => '',
					'id'         => 'suffix',
					'type'       => 'text',
				),
				array(
					'name'       => __( 'Auto Increment', 'sliced-invoices' ),
					'desc'       => sprintf(
						/* translators: %s is a placeholder for the localized word "Invoice" (singular) */
						__( 'Yes, increment %s numbers by one. Recommended.', 'sliced-invoices' ),
						$invoice_label
					),
					'id'         => 'increment',
					'type'       => 'checkbox',
				),
				array(
					'name'       => __( 'Next Number', 'sliced-invoices' ),
					'desc'       => __( 'The next number to use for auto incrementing. Can use leading zeros', 'sliced-invoices' ),
					'default'    => '',
					'id'         => 'number',
					'type'       => 'text',
				),
				array(
					'name'       => __( 'Due Date', 'sliced-invoices' ),
					'desc'       => sprintf(
						/* translators: %1s is a placeholder for the word "Invoice" (singular); %2s is a placeholder for "Invoices" (plural) */
						__( 'Number of days each %1s is due after the created date. This will automatically set the date in the \'Due Date\' field.<br>Can be overriden on individual %2s.', 'sliced-invoices' ),
						$invoice_label,
						$invoice_label_plural
					),
					'default'    => '',
					'id'         => 'due_date',
					'type'       => 'text',
					'attributes' => array(
						'type'        => 'number',
						'placeholder' => '14',
					)
				),
				array(
					'name'       => __( 'Hide Adjust Field', 'sliced-invoices' ),
					'desc'       => __( 'Yes, hide the Adjust field on line items, I won\'t need this field', 'sliced-invoices' ),
					'id'         => 'adjustment',
					'type'       => 'checkbox',
				),
				array(
					'name'       => __( 'Terms & Conditions', 'sliced-invoices' ),
					'desc'       => sprintf(
						/* translators: %1s is a placeholder for the word "Invoice" (singular); %2s is a placeholder for "Invoices" (plural) */
						__( 'Terms and conditions displayed on the %1s.<br>Can be overriden on individual %2s.', 'sliced-invoices' ),
						$invoice_label,
						$invoice_label_plural
					),
					'default'    => '',
					'id'         => 'terms',
					'type'       => 'textarea_small'
				),
				array(
					'name'       => __( 'Footer', 'sliced-invoices' ),
					'desc'       => sprintf(
						/* translators: %1s is a placeholder for the localized word "Invoice" (singular) */
						__( 'The footer will be displayed at the bottom of each %1s. Basic HTML is allowed.', 'sliced-invoices' ),
						$invoice_label
					),
					'default'    => '',
					'id'         => 'footer',
					'type'       => 'textarea_small',
				),
				array(
					'name'       => __( 'Admin Notices', 'sliced-invoices' ),
					'desc'       => sprintf(
						__( 'These settings allow you to choose which notices may be displayed in your WordPress Admin area. (Note: this is different from admin emails, which you can configure on the <a href="%s">Email Settings</a> tab.', 'sliced-invoices' ),
						admin_url( 'admin.php?page=sliced_invoices_settings&tab=emails' )
					),
					'id'         => 'invoice_admin_notices_title',
					'type'       => 'title',
				),
				array(
					'name'       => __( 'Show me notices when', 'sliced-invoices' ),
					'id'         => 'invoice_admin_notices',
					'type'       => 'multicheck',
					'options'    => array(
						'invoice_viewed' => sprintf(
							/* translators: %s is a placeholder for the localized word "Invoice" (singular) */
							__( '%s Viewed', 'sliced-invoices' ),
							$invoice_label
						),
						'invoice_paid'   => sprintf(
							/* translators: %s is a placeholder for the localized word "Invoice" (singular) */
							__( '%s Paid', 'sliced-invoices' ),
							$invoice_label
						),
					),
				),
				array(
					'name'       => __( 'Template Design', 'sliced-invoices' ),
					'desc'       => sprintf(
						/* translators: %s: URL */
						__( 'For information on customizing your templates, please see our guide <a target="_blank" href="%s">here</a>.', 'sliced-invoices' ),
						'https://slicedinvoices.com/support/quote-invoice-templates/?utm_source=invoice_settings_page_templates&utm_campaign=free&utm_medium=sliced_invoices'
					),
					'id'         => 'invoice_design_title',
					'type'       => 'title',
				),
				array(
					'name'       => __( 'Template', 'sliced-invoices' ),
					'id'         => 'template',
					'type'       => 'radio',
					'default'    => 'template1',
					'options'    => apply_filters( 'sliced_invoice_template_options', array(
						'template1' => '<img src="' . plugin_dir_url( dirname( __FILE__ ) ) . '/img/template1.png" width="200" />',
						'template2' => '<img src="' . plugin_dir_url( dirname( __FILE__ ) ) . '/img/template2.png" width="200" />',
						'template3' => '<img src="' . plugin_dir_url( dirname( __FILE__ ) ) . '/img/template3.png" width="200" />',
					) ),
				),
				array(
					'name'       => __( 'Custom CSS', 'sliced-invoices' ),
					'desc'       => sprintf(
						/* translators: %s is a placeholder for the localized word "Invoices" (plural) */
						__( 'Add custom CSS to your %s', 'sliced-invoices' ),
						$invoice_label_plural
					),
					'default'    => '',
					'id'         => 'css',
					'type'       => 'textarea_small',
				),
			)
		) );
		
		$this->option_metabox[] = apply_filters( 'sliced_payment_option_fields', array(
			'id'         => 'sliced_payments',
			'title'      => __( 'Payment Settings', 'sliced-invoices' ),
			'menu_title' => __( 'Payments', 'sliced-invoices' ),
			'desc'       => __( 'Here you will find all of the Payment related settings.', 'sliced-invoices' ),
			'show_on'    => array( 'key' => 'options-page', 'value' => array( 'payments' ), ),
			'show_names' => true,
			'fields'     => array(
				array(
					'name'      => __( 'Currency Symbol', 'sliced-invoices' ),
					'default'   => '',
					'type'      => 'text',
					'id'        => 'currency_symbol',
					'attributes' => array(
						'placeholder' => '$',
					)
				),
				array(
					'name'      => __( 'Currency Position', 'sliced-invoices' ),
					'type'      => 'select',
					'id'        => 'currency_pos',
					'options'   => array(
						'left'          => 'Left ($100.00)',
						'right'         => 'Right (100.00$)',
						'left_space'    => 'Left with space ($ 100.00)',
						'right_space'   => 'Right with space(100.00 $)',
					),
				),
				array(
					'name'      => __( 'Thousand Separator', 'sliced-invoices' ),
					//'default'   => ',',
					'type'      => 'text',
					'id'        => 'thousand_sep',
					'attributes' => array(
						//'required' => 'required', // allow empty
						'placeholder' => ',',
					),
					'sanitization_cb' => false, // allow whitespace
				),
				array(
					'name'      => __( 'Decimal Separator', 'sliced-invoices' ),
					'default'   => '.',
					'type'      => 'text',
					'id'        => 'decimal_sep',
					'attributes' => array(
						'required' => 'required',
						'placeholder' => '.',
					),
				),
				array(
					'name'      => __( 'Number of Decimals', 'sliced-invoices' ),
					'default'   => '2',
					'type'      => 'text',
					'id'        => 'decimals',
					'attributes' => array(
						'required' => 'required',
						'placeholder' => '2',
						'maxlength' => 1,
						'type' => 'number',
					)
				),
				array(
					'name'       => __( 'Payment Page', 'sliced-invoices' ),
					'desc'       => sprintf(
						/* translators: %s: URL */
						__( 'Choose a page to use for PayPal and other <a target="_blank" href="%s">available payment gateway</a> messages and other confirmations.<br>A blank page named Payment would be perfect.', 'sliced-invoices' ),
						'https://slicedinvoices.com/extensions/?utm_source=payment_settings_page&utm_campaign=free&utm_medium=sliced_invoices'
					),
					'default'    => $payments['payment_page'],
					'type'       => 'select',
					'id'         => 'payment_page',
					'options'    => $this->get_the_pages(),
					'attributes' => array(
						'required' => 'required',
					)
				),
				array(
					'name'      => __( 'Payment Page Footer', 'sliced-invoices' ),
					'desc'      => __( 'The footer will be displayed at the bottom of the payment page. Basic HTML is allowed.<br>Use this to provide additional payment instructions, if desired.', 'sliced-invoices' ),
					'default'   => '',
					'id'        => 'footer',
					'type'      => 'textarea_small',
				),
				array(
					'name'      => __( 'Payment Methods', 'sliced-invoices' ),
					'default'   => '',
					'id'        => 'title_payment_methods',
					'type'      => 'title',
				),
				array(
					'name'      => __( 'Bank', 'sliced-invoices' ) . '<br><small>' . sprintf( __( 'Displayed on the %s', 'sliced-invoices' ), $invoice_label ) . '</small>',
					'desc'      => __( 'Add your bank account details if you wish to allow direct bank deposits. HTML is allowed.', 'sliced-invoices' ),
					'default'   => '',
					'id'        => 'bank',
					'type'      => 'textarea_small',
				),
				array(
					'name'      => __( 'Generic Payment', 'sliced-invoices' ) . '<br><small>' . sprintf( __( 'Displayed on the %s', 'sliced-invoices' ), $invoice_label ) . '</small>',
					'desc'      => __( 'Set a generic message or include further instructions for the user on how to pay. HTML is allowed.', 'sliced-invoices' ),
					'default'   => '',
					'id'        => 'generic_pay',
					'type'      => 'textarea_small',
				),
			)
		) );
		
		$this->option_metabox[] = apply_filters( 'sliced_tax_option_fields', array(
			'id'         => 'sliced_tax',
			'title'      => __( 'Tax Settings', 'sliced-invoices' ),
			'menu_title' => __( 'Tax', 'sliced-invoices' ),
			'desc'       => __( 'Here you will find all Tax-related settings.', 'sliced-invoices' ),
			'show_on'    => array( 'key' => 'options-page', 'value' => array( 'tax' ), ),
			'show_names' => true,
			'fields'     => array(
				array(
					'name'      => __( 'Prices entered with tax', 'sliced-invoices' ),
					'default'   => 'exclusive',
					'type'      => 'radio',
					'id'        => 'tax_calc_method',
					'options'   => array(
						'inclusive' => __( 'Yes, I will enter prices inclusive of tax', 'sliced-invoices' ),
						'exclusive' => __( 'No, I will enter prices exclusive of tax', 'sliced-invoices' ),
					)
				),
				array(
					'name'      => __( 'Tax Percentage', 'sliced-invoices' ),
					'desc'      => __( 'Default tax percentage. Set to 0 or leave blank for no tax.', 'sliced-invoices' ),
					'default'   => '',
					'id'        => 'tax',
					'type'      => 'text',
					'attributes'    => array(
						'placeholder'   => '10',
						'maxlength'     => '6',
						// 'type'          => 'number',
						// 'step'          => 'any',
					),
				),
				array(
					'name'      => __( 'Tax Name', 'sliced-invoices' ),
					'desc'      => __( 'The name of the tax for your country/region. GST, VAT, Tax etc', 'sliced-invoices' ),
					'default'   => '',
					'id'        => 'tax_name',
					'type'      => 'text',
					'attributes' => array(
						'maxlength' => 100,
					)
				),
			)
		) );
		
		$email_option_fields = array(
			array(
				'name'      => __( 'Email Address', 'sliced-invoices' ),
				'desc'      => __( 'The email address to send and receive notifications (probably your business email).', 'sliced-invoices' ),
				'default'   => '',
				'type'      => 'text',
				'id'        => 'from'
			),
			array(
				'name'      => __( 'Email Name', 'sliced-invoices' ),
				'desc'      => __( 'The name on emails to send and receive notifications (probably your business name).', 'sliced-invoices' ),
				'default'   => '',
				'type'      => 'text',
				'id'        => 'name',
			),
			array(
				'name'      => __( 'Bcc on Client Emails', 'sliced-invoices' ),
				'desc'      => __( 'Yes, send myself a copy of all client emails (Bcc). Recommended.<br><span class="description"><small>This ensures you have a copy of the email on record</small></span>', 'sliced-invoices' ),
				'id'        => 'bcc',
				'type'      => 'checkbox',
			),
			array(
				'name'      => __( 'Quote Available', 'sliced-invoices' ),
				'desc'      => 'Sent to the client manually, when you click the email button.',
				'id'        => 'quote_available_title',
				'type'      => 'title',
			),
			array(
				'name'      => __( 'Subject', 'sliced-invoices' ),
				'desc'      => __( 'The subject of the email (wildcards are allowed).', 'sliced-invoices' ),
				'default'   => '',
				'type'      => 'text',
				'id'        => 'quote_available_subject',
			),
			array(
				'name'      => __( 'Content', 'sliced-invoices' ),
				'desc'      => __( 'The content of the email (wildcards and HTML are allowed).', 'sliced-invoices' ),
				'type'      => 'wysiwyg',
				'default'   => '',
				'id'        => 'quote_available_content',
				'sanitization_cb' => false,
				'options' => array(
					'media_buttons' => false,
					'textarea_rows' => get_option('default_post_edit_rows', 7),
					'teeny' => true,
					'tinymce' => true,
					'quicktags' => true
				),
			),
			array(
				'name'      => __( 'Button text', 'sliced-invoices' ),
				'desc'      => __( 'The "view this quote online" button.', 'sliced-invoices' ),
				'default'   => '',
				'type'      => 'text',
				'id'        => 'quote_available_button',
			),
			array(
				'name'      => __( 'Invoice Available', 'sliced-invoices' ),
				'desc'      => 'Sent to the client manually, when you click the email button.',
				'id'        => 'invoice_available_title',
				'type'      => 'title',
			),
			array(
				'name'      => __( 'Subject', 'sliced-invoices' ),
				'desc'      => __( 'The subject of the email (wildcards are allowed).', 'sliced-invoices' ),
				'default'   => '',
				'type'      => 'text',
				'id'        => 'invoice_available_subject',
			),
			array(
				'name'      => __( 'Content', 'sliced-invoices' ),
				'desc'      => __( 'The content of the email (wildcards and HTML are allowed).', 'sliced-invoices' ),
				'type'      => 'wysiwyg',
				'default'   => '',
				'id'        => 'invoice_available_content',
				'sanitization_cb' => false,
				'options' => array(
					'media_buttons' => false,
					'textarea_rows' => get_option('default_post_edit_rows', 7),
					'teeny' => true,
					'tinymce' => true,
					'quicktags' => true
				),
			),
			array(
				'name'      => __( 'Button text', 'sliced-invoices' ),
				'desc'      => __( 'The "view this invoice online" button.', 'sliced-invoices' ),
				'default'   => '',
				'type'      => 'text',
				'id'        => 'invoice_available_button',
			),
			array(
				'name'      => __( 'Payment Received', 'sliced-invoices' ),
				'desc'      => 'Sent to the client automatically, when they make a payment.',
				'id'        => 'payment_received_client_title',
				'type'      => 'title',
			),
			array(
				'name'      => __( 'Subject', 'sliced-invoices' ),
				'desc'      => __( 'The subject of the email (wildcards are allowed).', 'sliced-invoices' ),
				'default'   => '',
				'type'      => 'text',
				'id'        => 'payment_received_client_subject',
			),
			array(
				'name'      => __( 'Content', 'sliced-invoices' ),
				'desc'      => __( 'The content of the email (wildcards and HTML are allowed).', 'sliced-invoices' ),
				'type'      => 'wysiwyg',
				'default'   => '',
				'id'        => 'payment_received_client_content',
				'sanitization_cb' => false,
				'options' => array(
					'media_buttons' => false,
					'textarea_rows' => get_option('default_post_edit_rows', 7),
					'teeny' => true,
					'tinymce' => true,
					'quicktags' => true
				),
			),
			array(
				'name'      => __( 'Payment Reminder', 'sliced-invoices' ),
				'desc'      => 'Sent to the client automatically on the chosen days.',
				'id'        => 'payment_reminder_title',
				'type'      => 'title',
			),
			array(
				'name'      => __( 'When to Send', 'sliced-invoices' ),
				'desc'      => __( 'Check when you would like payment reminders sent out.', 'sliced-invoices' ),
				'default'   => '',
				'type'    => 'multicheck',
				'options' => array(
					'-7'     => '7 days before Due Date',
					'-1'     => '1 day before Due Date',
					'+0'      => 'On the Due Date',
					'+1'      => '1 day after Due Date',
					'+7'      => '7 days after Due Date',
					'+14'     => '14 days after Due Date',
					'+21'     => '21 days after Due Date',
					'+30'     => '30 days after Due Date',
				),
				'id'        => 'payment_reminder_days',
			),
			array(
				'name'      => __( 'Subject', 'sliced-invoices' ),
				'desc'      => __( 'The subject of the email (wildcards are allowed).', 'sliced-invoices' ),
				'default'   => '',
				'type'      => 'text',
				'id'        => 'payment_reminder_subject',
			),
			array(
				'name'      => __( 'Content', 'sliced-invoices' ),
				'desc'      => __( 'The content of the email (wildcards and HTML are allowed).', 'sliced-invoices' ),
				'type'      => 'wysiwyg',
				'default'   => '',
				'id'        => 'payment_reminder_content',
				'sanitization_cb' => false,
				'options' => array(
					'media_buttons' => false,
					'textarea_rows' => get_option('default_post_edit_rows', 7),
					'teeny' => true,
					'tinymce' => true,
					'quicktags' => true
				),
			),
			array(
				'name'      => __( 'Wildcards For Emails', 'sliced-invoices' ),
				'desc'      => __( 'The following wildcards can be used in email subjects and email content:<br>
					%client_first_name% : Clients first name<br>
					%client_last_name% : Clients last name<br>
					%client_business% : Clients business<br>
					%client_email% : Clients email address<br>
					%link% : URL to the quote<br>
					%number% : The quote or invoice number<br>
					%total% : The quote or invoice total<br>
					%last_payment% : The amount of the last payment. (returns "N/A" if no payments)<br>
					%balance% : The balance outstanding on the quote or invoice<br>
					%created% : The quote or invoice created date<br>
					%valid_until% : The date the quote is valid until<br>
					%due_date% : The date the invoice is due<br>
					%date% : Todays date. Useful on Payment emails<br>
					%order_number% : The order number of the invoice<br>
					%is_was% : If due date of invoice is past, displays "was" otherwise displays "is"<br>
					', 'sliced-invoices-pdf-email' ),
				'id'        => 'wildcard_title',
				'type'      => 'title',
			),
		);
		if ( ! class_exists( 'Sliced_Pdf_Email' ) ) {
			$email_option_fields[] = array(
				'name'      => __( 'Footer Text', 'sliced-invoices' ),
				'type'      => 'wysiwyg',
				'default'   => '',
				'id'        => 'footer',
				'sanitization_cb' => false,
				'options' => array(
					'media_buttons' => false, // show insert/upload button(s)
					'textarea_rows' => get_option('default_post_edit_rows', 5), // rows="..."
					'teeny' => true, // output the minimal editor config used in Press This
					'tinymce' => true, // load TinyMCE, can be used to pass settings directly to TinyMCE using an array()
					'quicktags' => true // load Quicktags, can be used to pass settings directly to Quicktags using an array()
				),
			);
		}
		$this->option_metabox[] = apply_filters( 'sliced_email_option_fields', array(
			'id'         => 'sliced_emails',
			'title'      => __( 'Email Settings', 'sliced-invoices' ),
			'menu_title' => __( 'Emails', 'sliced-invoices' ),
			'desc'       => __( 'Here you will find all of the Email-related settings.', 'sliced-invoices' )
				. '<br /><br />' . sprintf(
					/* translators: %s: URL */
					__( '(PRO) The <a target="_blank" href="%s">PDF & Email Extension</a> adds a few extra options here for customizing emails.', 'sliced-invoices' ),
					'https://slicedinvoices.com/extensions/pdf-email/?utm_source=email_settings_page&utm_campaign=free&utm_medium=sliced_invoices'
				),
			'show_on'    => array( 'key' => 'options-page', 'value' => array( 'emails' ), ),
			'show_names' => true,
			'fields'     => $email_option_fields,
		) );
		
		$this->option_metabox[] = apply_filters( 'sliced_pdf_option_fields', array(
			'id'         => 'sliced_pdf',
			'title'      => __( 'PDF Settings', 'sliced-invoices' ),
			'menu_title' => __( 'PDF', 'sliced-invoices' ),
			'desc'       => __( 'Here you will find all of the PDF-related settings.', 'sliced-invoices' )
				. '<br /><br />' . sprintf(
					/* translators: %s: URL */
					__( '(PRO) The <a target="_blank" href="%s">PDF & Email Extension</a> is required for this feature.', 'sliced-invoices' ),
					'https://slicedinvoices.com/extensions/pdf-email/?utm_source=pdf_settings_page&utm_campaign=free&utm_medium=sliced_invoices'
				),
			'show_on'    => array( 'key' => 'options-page', 'value' => array( 'emails' ), ),
			'show_names' => true,
			'fields'     => array(),
		) );
		
		$this->option_metabox[] = apply_filters( 'sliced_translate_option_fields', array(
			'id'         => 'sliced_translate',
			'title'      => __( 'Translate Settings', 'sliced-invoices' ),
			'menu_title' => __( 'Translate', 'sliced-invoices' ),
			'desc'       => __( 'Here you can translate strings into your own language, or simply change the text to suit your needs.', 'sliced-invoices' )
				. '<br /><br />' . sprintf(
					/* translators: %s: URL */
					__( '(PRO) The <a target="_blank" href="%s">Easy Translate Extension</a> adds many more fields here, allowing you to translate every piece of text your client sees on your quotes and invoices.', 'sliced-invoices' ),
					'https://slicedinvoices.com/extensions/easy-translate/?utm_source=translate_settings_page&utm_campaign=free&utm_medium=sliced_invoices'
				),
			'show_on'    => array( 'key' => 'options-page', 'value' => array( 'translate' ), ),
			'show_names' => true,
			'fields'     => array(
				array(
					'name'      => __( 'Quote Label', 'sliced-invoices' ),
					'desc'      => __( 'You can change this from Quote to Estimate or Proposal (or any other word you like).', 'sliced-invoices' ),
					'default'   => 'Quote',
					'id'        => 'quote-label',
					'type'      => 'text',
					'attributes' => array(
						'class'      => 'i18n-multilingual regular-text',
					),
				),
				array(
					'name'      => __( 'Quote Label Plural', 'sliced-invoices' ),
					'desc'      => __( 'The plural of the above', 'sliced-invoices' ),
					'default'   => 'Quotes',
					'id'        => 'quote-label-plural',
					'type'      => 'text',
					'attributes' => array(
						'class'      => 'i18n-multilingual regular-text',
					),
				),
				array(
					'name'      => __( 'Invoice Label', 'sliced-invoices' ),
					'desc'      => __( 'You can change this from Invoice to Tax Invoice (or any other word you like).', 'sliced-invoices' ),
					'default'   => 'Invoice',
					'id'        => 'invoice-label',
					'type'      => 'text',
					'attributes' => array(
						'class'      => 'i18n-multilingual regular-text',
					),
				),
				array(
					'name'      => __( 'Invoice Label Plural', 'sliced-invoices' ),
					'desc'      => __( 'The plural of the above', 'sliced-invoices' ),
					'default'   => 'Invoices',
					'id'        => 'invoice-label-plural',
					'type'      => 'text',
					'attributes' => array(
						'class'      => 'i18n-multilingual regular-text',
					),
				),
				array(
					'name'      => __( 'Hrs/Qty', 'sliced-invoices' ),
					'default'   => 'Hrs/Qty',
					'id'        => 'hrs_qty',
					'type'      => 'text',
					'attributes' => array(
						'class'      => 'i18n-multilingual regular-text',
					),
				),
				array(
					'name'      => __( 'Service', 'sliced-invoices' ),
					'default'   => 'Service',
					'id'        => 'service',
					'type'      => 'text',
					'attributes' => array(
						'class'      => 'i18n-multilingual regular-text',
					),
				),
				array(
					'name'      => __( 'Rate/Price', 'sliced-invoices' ),
					'default'   => 'Rate/Price',
					'id'        => 'rate_price',
					'type'      => 'text',
					'attributes' => array(
						'class'      => 'i18n-multilingual regular-text',
					),
				),
				array(
					'name'      => __( 'Adjust', 'sliced-invoices' ),
					'default'   => 'Adjust',
					'id'        => 'adjust',
					'type'      => 'text',
					'attributes' => array(
						'class'      => 'i18n-multilingual regular-text',
					),
				),
				array(
					'name'      => __( 'Sub Total', 'sliced-invoices' ),
					'default'   => 'Sub Total',
					'id'        => 'sub_total',
					'type'      => 'text',
					'attributes' => array(
						'class'      => 'i18n-multilingual regular-text',
					),
				),
				array(
					'name'      => __( 'Discount', 'sliced-invoices' ),
					'default'   => 'Discount',
					'id'        => 'discount',
					'type'      => 'text',
					'attributes' => array(
						'class'      => 'i18n-multilingual regular-text',
					),
				),
				array(
					'name'      => __( 'Total', 'sliced-invoices' ),
					'default'   => 'Total',
					'id'        => 'total',
					'type'      => 'text',
					'attributes' => array(
						'class'      => 'i18n-multilingual regular-text',
					),
				),
				array(
					'name'      => __( 'Total Due', 'sliced-invoices' ),
					'default'   => 'Total Due',
					'id'        => 'total_due',
					'type'      => 'text',
					'attributes' => array(
						'class'      => 'i18n-multilingual regular-text',
					),
				),
			)
		) );
		
		$this->option_metabox[] = apply_filters( 'sliced_extras_option_fields', array(
			'id'         => 'sliced_extras',
			'title'      => __( 'Extras', 'sliced-invoices' ),
			'menu_title' => __( 'Extras', 'sliced-invoices' ),
			'desc'       => __( 'Just a page with some advertising and a cry for help ;-)', 'sliced-invoices' ),
			'show_on'    => array( 'key' => 'options-page', 'value' => array( 'extras' ), ),
			'show_names' => true,
			'fields'     => array(
				array(
					'name'      => __( 'We\'d Love Your Support', 'sliced-invoices' ),
					'id'        => 'help_us',
					'type'      => 'title',
					'after_field'  => '
					<span style="float: left; margin: 15px 50px 20px 0px; font-size: 38px;" class="dashicons dashicons-wordpress"></span>
					<p>Thanks for using Sliced Invoices, we hope that you enjoy using it.<br>We\'d love it if you could take a minute and give the plugin a rating over on the <a target="_blank" href="https://wordpress.org/support/plugin/sliced-invoices/reviews/?rate=5#new-post" title="Opens in new window">Sliced Invoices WordPress page</a>.<br />This will help to continue the development of the free plugin. </p>
					',
				),
				array(
					'name'      => __( 'Sign up for our newsletter', 'sliced-invoices' ),
					'id'        => 'newsletter',
					'type'      => 'title',
					'after_field'  => '
					<p>Sign up for our newsletter to receive occasional updates and announcements related to Sliced Invoices.  (We won\'t sell your information to anyone, we promise!)</p>
					<input id="sliced_newsletter_email" type="email" value="'.$current_user->user_email.'" />
					<button class="button" id="sliced_newsletter_submit" type="button">Submit</button>
					<span class="" id="sliced_newsletter_success" style="display:none;">Thanks! Please check your inbox to confirm your subscription.</span>
					<script type="text/javascript">
						jQuery( "#sliced_newsletter_submit" ).click(function(){
							var email_address = jQuery("#sliced_newsletter_email").val();
							if ( email_address > "" ) {
								jQuery.post(
									"https://slicedinvoices.com/wp-admin/admin-ajax.php",
									{ "action": "maillist_signup", "email_address": email_address },
									function(response) {
										if ( response > 1 ) {
											jQuery("#sliced_newsletter_submit").fadeOut();
											jQuery("#sliced_newsletter_success").fadeIn();
										}
									}
								);
							}
						});
					</script>
					',
				),
				array(
					'name'      => __( 'Extend Sliced Invoices', 'sliced-invoices' ),
					'id'        => 'extend',
					'type'      => 'title',
					'after_field'  => '

					<img style="margin:15px 0 5px;" src="' . plugin_dir_url( dirname( __FILE__ ) ) . '/img/sliced-invoices-logo.png" width="250" /><br>

					<p style="clear: both;">Check out the <strong>free and premium extensions</strong> that are available for Sliced Invoices at the <a target="_blank" href="https://slicedinvoices.com/extensions/?utm_source=extras_page&utm_campaign=free&utm_medium=sliced_invoices&utm_content=extensions" title="Opens in new window">extensions marketplace</a>.<br>
						There are also <a target="_blank" href="https://slicedinvoices.com/bundles/?utm_source=extras_page&utm_campaign=free&utm_medium=sliced_invoices&utm_content=bundles" title="Opens in new window">extension bundles</a> available where you can get our most popular plugins for one great price!</p>

					<ul class="sliced-extras">

						<li><a target="_blank" href="https://slicedinvoices.com/extensions/better-urls/?utm_source=extras_page&utm_campaign=free&utm_medium=sliced_invoices&utm_content=better_urls" title="Opens in new window">Better URL\'s</a> (free!)<br>
						<span class="description">Change the URL\'s of quotes and invoice to suit your business. Change it from \'sliced_invoice\' to \'bobs_invoice\' for example.</span></li>
						
						<li><a target="_blank" href="https://slicedinvoices.com/extensions/braintree-payment-gateway/?utm_source=extras_page&utm_campaign=free&utm_medium=sliced_invoices&utm_content=braintree" title="Opens in new window">Braintree Payment Gateway</a><br>
						<span class="description">The Braintree Payment Gateway extension allows you to accept credit card payments for your invoices securely.</span></li>
						
						<li><a target="_blank" href="https://slicedinvoices.com/extensions/client-area/?utm_source=extras_page&utm_campaign=free&utm_medium=sliced_invoices&utm_content=client_area" title="Opens in new window">Client Area</a><br>
						<span class="description">A secure area for your clients to view, print and export their list of Quotes and Invoices as well as edit their business details.</span></li>

						<li><a target="_blank" href="https://slicedinvoices.com/extensions/deposit-invoices/?utm_source=extras_page&utm_campaign=free&utm_medium=sliced_invoices&utm_content=deposit_invoices" title="Opens in new window">Deposit Invoices</a><br>
						<span class="description">Easily create deposit invoices with the click of a button. </span></li>

						<li><a target="_blank" href="https://slicedinvoices.com/extensions/easy-translate/?utm_source=extras_page&utm_campaign=free&utm_medium=sliced_invoices&utm_content=easy_translate" title="Opens in new window">Easy Translate</a><br>
						<span class="description">Translate or modify the text that is displayed on the standard invoice and quote templates, without touching any code.</span></li>
					
						<li><a target="_blank" href="https://slicedinvoices.com/extensions/partial-payments/?utm_source=extras_page&utm_campaign=free&utm_medium=sliced_invoices&utm_content=partial_payments" title="Opens in new window">Partial Payments</a><br>
						<span class="description">Allow your customers to make partial payments towards invoices.</span></li>

						<li><a target="_blank" href="https://slicedinvoices.com/extensions/pdf-email/?utm_source=extras_page&utm_campaign=free&utm_medium=sliced_invoices&utm_content=pdf_email" title="Opens in new window">PDF & Email</a><br>
						<span class="description">Print quotes and invoices to PDF, email direct to clients and style the HTML emails and notifications.</span></li>
						
						<li><a target="_blank" href="https://slicedinvoices.com/extensions/recurring-invoices/?utm_source=extras_page&utm_campaign=free&utm_medium=sliced_invoices&utm_content=recurring_invoices" title="Opens in new window">Recurring Invoices</a><br>
						<span class="description">Easily create recurring invoices with the click of a button. </span></li>
						
						<li><a target="_blank" href="https://slicedinvoices.com/extensions/secure-invoices/?utm_source=extras_page&utm_campaign=free&utm_medium=sliced_invoices&utm_content=secure_invoices" title="Opens in new window">Secure Invoices</a><br>
						<span class="description">Secure your invoices and only allow access to people who have been sent a secure link.</span></li>

						<li><a target="_blank" href="https://slicedinvoices.com/extensions/stripe-payment-gateway/?utm_source=extras_page&utm_campaign=free&utm_medium=sliced_invoices&utm_content=stripe" title="Opens in new window">Stripe Payment Gateway</a><br>
						<span class="description">The Stripe Payment Gateway extension allows you to accept credit card payments for your invoices securely.</span></li>
						
						<li><a target="_blank" href="https://slicedinvoices.com/extensions/subscription-invoices/?utm_source=extras_page&utm_campaign=free&utm_medium=sliced_invoices&utm_content=subscription_invoices" title="Opens in new window">Subscription Invoices</a><br>
						<span class="description">This extension allows you to easily charge your clients with automatic recurring payments.</span></li>

					</ul>
					<br />
					<br />
					',
				),
			)
		) );
		
		$this->option_metabox[] = apply_filters( 'sliced_licenses_option_fields', array(
			'id'         => 'sliced_licenses',
			'title'      => __( 'Licenses', 'sliced-invoices' ),
			'menu_title' => __( 'Licenses', 'sliced-invoices' ),
			'desc'       => sprintf(
				/* translators: %s: URL */
				__( 'This page is where you enter any license keys for extensions you have purchased from <a target="_blank" href="%s">Sliced Invoices</a>.', 'sliced-invoices' ),
				'https://slicedinvoices.com/?utm_source=licenses_page&utm_campaign=free&utm_medium=sliced_invoices'
			),
			'show_on'    => array( 'key' => 'options-page', 'value' => array( 'licenses' ), ),
			'show_names' => true,
			'fields'     => array(
				array(
					'name' => __( 'Instructions', 'sliced-invoices' ),
					'id'   => 'licenses_instructions',
					'type' => 'title',
					'desc' => sprintf(
							/* translators: %s: URL */
							__( 'Before you can enter your license keys here, you must install and activate the extensions first.  You can do this from your <a href="%s" target="_blank">Plugins</a> page.', 'sliced-invoices' ),
							admin_url( 'plugins.php' )
						)
						. '<br />'
						. sprintf(
							/* translators: %s: URL */
							__( 'For step-by-step instructions, please read our FAQ page: <a href="%s" target="_blank">How do I install and activate Sliced Invoices extensions?</a>', 'sliced-invoices' ),
							'https://slicedinvoices.com/question/install-activate-extensions/?utm_source=licenses_page&utm_campaign=free&utm_medium=sliced_invoices'
						)
						. '<br /><br />'
						. __( 'Once your extensions are installed and activated, you can activate your license keys by doing the following:', 'sliced-invoices' )
						. '<br /><br />'
						. __( '1. Copy the license key for your extension(s) and paste it into the field(s) below <strong>and then hit Save.</strong>', 'sliced-invoices' ) . '<br />'
						. __( '2. <strong>After</strong> hitting the Save button, you can now hit the <strong>Activate License</strong> button for your extension(s)', 'sliced-invoices' ) . '<br />'
						. __( '3. That\'s it!  Be sure to watch for any new updates for your extensions', 'sliced-invoices' ) . '<br /><br />',
				),
				array(
					'name' => __( 'Where can I find my license keys?', 'sliced-invoices' ),
					'id'   => 'licenses_where_to_find',
					'type' => 'title',
					'desc' => sprintf(
						/* translators: %s: URL */
						__( 'You should have received a Purchase Receipt email that contains the license key for each extension you have purchased from Sliced Invoices.<br>If you have lost the email, you can login to your account at Sliced Invoices <a target="_blank" href="%s">here</a> to get your license key(s).', 'sliced-invoices' ) . '<br /><br />',
						'https://slicedinvoices.com/login/?utm_source=licenses_page&utm_campaign=free&utm_medium=sliced_invoices'
					),
				),
				array(
					'name' => '',
					'id'   => 'licenses_divider',
					'type' => 'title',
				),
			)
		) );
		
		$this->option_metabox = apply_filters( 'sliced_invoices_admin_options', $this->option_metabox );
		
		return $this->option_metabox;
		
	}


	/**
	 * Get the list of pages to add to dropdowns in the settings.
	 *
	 * @since   2.0.4
	 */
	public function get_the_pages() {

		$pages = get_pages();
		$the_pages = array( '0' => '----' );
		if( $pages ) {
			foreach ( $pages as $page ) {
				$the_pages[$page->ID] = $page->post_title;
			}
		}

		return $the_pages;

	}

	/**
	 * Returns the option key for a given field id
	 * @since  0.1.0
	 * @return array
	 */
	public function get_option_key($field_id) {
		$option_tabs = $this->option_fields();
		foreach ($option_tabs as $option_tab) { //search all tabs
			foreach ($option_tab['fields'] as $field) { //search all fields
				if ($field['id'] == $field_id) {
					return $option_tab['id'];
				}
			}
		}
		return $this->key; //return default key if field id not found
	}

	/**
	 * Public getter method for retrieving protected/private variables
	 * @since  0.1.0
	 * @param  string  $field Field to retrieve
	 * @return mixed          Field value or exception is thrown
	 */
	public function __get( $field ) {

		// Allowed fields to retrieve
		if ( in_array( $field, array( 'key', 'fields', 'title', 'options_pages' ), true ) ) {
			return $this->{$field};
		}
		if ( 'option_metabox' === $field ) {
			return $this->option_fields();
		}

		throw new Exception( 'Invalid property: ' . $field );
	}

}

// Get it started
$Sliced_Options = new Sliced_Options();
$Sliced_Options->hooks();

/**
 * Wrapper function around cmb_get_option
 * @since  0.1.0
 * @param  string  $key Options array key
 * @return mixed        Option value
 */
function sliced_admin_option( $key = '' ) {
	global $Sliced_Options;
	return cmb2_get_option( $Sliced_Options->get_option_key($key), $key );
}