<?php 
/*!
 * Jetpack CRM
 * https://jetpackcrm.com
 * V3.0
 *
 * Copyright 2020 Automattic
 *
 * Date: 20/02/2019
 */

defined( 'ZEROBSCRM_PATH' ) || exit( 0 );




/* ======================================================
   Init Func
   ====================================================== */

   function zeroBSCRM_CompaniesMetaboxSetup(){

        // main deets
        $zeroBS__Metabox_Company = new zeroBS__Metabox_Company( __FILE__ );

        // Actions (Save + status)
        $zeroBS__Metabox_CompanyActions = new zeroBS__Metabox_CompanyActions( __FILE__ );

        // contacts
        $zeroBS__Metabox_CompanyContacts = new zeroBS__Metabox_CompanyContacts( __FILE__ );

        // Tags
        $zeroBS__Metabox_CompanyTags = new zeroBS__Metabox_CompanyTags( __FILE__ );

        // files
        $zeroBS__Metabox_CompanyFiles = new zeroBS__Metabox_CompanyFiles( __FILE__ );

        // external sources
        $zeroBS__Metabox_ExtSource = new zeroBS__Metabox_ExtSource( __FILE__, 'company','zbs-add-edit-company-edit');

        #} Activity box on view page
        if(zeroBSCRM_is_company_view_page()){
            $zeroBS__Metabox_Company_Activity = new zeroBS__Metabox_Company_Activity( __FILE__ );
        }

        #} Ownership
        if (zeroBSCRM_getSetting('perusercustomers') == "1") $zeroBS__CoMetabox_Ownership = new zeroBS__Metabox_Ownership( __FILE__, ZBS_TYPE_COMPANY);

        
   }

   add_action( 'admin_init','zeroBSCRM_CompaniesMetaboxSetup');


/* ======================================================
   / Init Func
   ====================================================== */

/* ======================================================
  Company Metabox
   ====================================================== */

    class zeroBS__Metabox_Company extends zeroBS__Metabox{ 
        
        // this is for catching 'new' companys
        private $newRecordNeedsRedir = false;

        private $coOrgLabel = '';

        public function __construct( $plugin_file ) {

            // oldschool.
            $this->coOrgLabel = jpcrm_label_company();

            // set these
            $this->objType = 'company';
            $this->metaboxID = 'zerobs-company-edit';
            $this->metaboxTitle = $this->coOrgLabel.' '.__('Details','zero-bs-crm');
            $this->metaboxScreen = 'zbs-add-edit-company-edit';
            $this->metaboxArea = 'normal';
            $this->metaboxLocation = 'high';
            $this->saveOrder = 1;
            $this->capabilities = array(

                'can_hide'          => false, // can be hidden
                'areas'             => array('normal'), // areas can be dragged to - normal side = only areas currently
                'can_accept_tabs'   => true,  // can/can't accept tabs onto it
                'can_become_tab'    => false, // can be added as tab
                'can_minimise'      => true, // can be minimised
                'can_move'          => true // can be moved

            );

            // call this 
            $this->initMetabox();

        }

        public function html( $company, $metabox ) {

                global $zbs;

                // localise ID
                $companyID = -1; if (is_array($company) && isset($company['id'])) $companyID = (int)$company['id'];

               // PerfTest: zeroBSCRM_performanceTest_startTimer('custmetabox-dataget');

                #} Rather than reload all the time :)
                global $zbsCompanyEditing; 

                if (!isset($zbsCompanyEditing)){
                    $zbsCompany = zeroBS_getCompany($companyID,false);
                    $zbsCompanyEditing = $zbsCompany;
                } else {
                    $zbsCompany = $zbsCompanyEditing;
                }

					global $zbsCompanyFields; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
					$fields               = $zbsCompanyFields; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
					$show_id              = (int) $zbs->settings->get( 'showid' );
					$fields_to_hide       = $zbs->settings->get( 'fieldhides' );
					$show_addresses       = (int) $zbs->settings->get( 'showaddress' );
					$show_second_address  = (int) $zbs->settings->get( 'secondaddress' );
					$show_country_fields  = $zbs->settings->get( 'countries' );
					$second_address_label = $zbs->settings->get( 'secondaddresslabel' );
                if ( empty( $second_address_label ) ) {
                  $second_address_label = __( 'Second Address', 'zero-bs-crm' );
                }
            ?>
                <script type="text/javascript">var zbscrmjs_secToken = '<?php echo esc_js( wp_create_nonce( 'zbscrmjs-ajax-nonce' ) ); ?>';</script>

                <?php #} Pass this if it's a new customer (for internal automator) - note added this above with DEFINE for simpler.

                    if (gettype($zbsCompany) != "array") echo '<input type="hidden" name="zbscrm_newcompany" value="1" />';

                ?>
			<div>
				<div class="jpcrm-form-grid" id="wptbpMetaBoxMainItem">

                    <?php #} WH Hacky quick addition for MVP 
                    # ... further hacked

				if ( $show_id === 1 && $companyID > 0 ) { // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
					?>
							<div class="jpcrm-form-group">
								<label class="jpcrm-form-label"><?php echo esc_html( $this->coOrgLabel ) . ' '; esc_html_e( 'ID', 'zero-bs-crm' ); // phpcs:ignore Generic.Formatting.DisallowMultipleStatements.SameLine, WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase, Squiz.PHP.EmbeddedPhp.MultipleStatements ?>:</label>
								<b>#<?php echo isset( $companyID ) ? esc_html( $companyID ) : ''; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase ?></b>
							</div>
							<div class="jpcrm-form-group">
							</div>
                    <?php } ?>

					<?php
					global $zbsFieldsEnabled; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
					if ( $show_second_address === 1 ) {
						$zbsFieldsEnabled['secondaddress'] = true; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
					}
					$field_group = '';

					foreach ( $fields as $field_key => $field_value ) {
						$show_field = ! isset( $field_value['opt'] ) || isset( $zbsFieldsEnabled[ $field_value['opt'] ] ); // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
						$show_field = isset( $fields_to_hide['company'] )
							&& is_array( $fields_to_hide['company'] )
							&& in_array( $field_key, $fields_to_hide['company'] ) // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
							? false
							: $show_field;
						$show_field = isset( $field_value[0] )
							&& 'selectcountry' === $field_value[0]
							&& 0 === $show_country_fields
							? false
							: $show_field;

						if ( isset( $field_value['area'] ) && $field_value['area'] !== '' ) { // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
							if ( $show_addresses !== 1 ) { // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
								continue;
							} elseif ( $field_group === '' ) { // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
								echo '<div class="jpcrm-form-grid" style="padding:0;grid-template-columns: 1fr;">';
								echo '<div class="jpcrm-form-group"><label>';
								echo esc_html__( $field_value['area'], 'zero-bs-crm' ); // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase, WordPress.WP.I18n.NonSingularStringLiteralText
								echo '</label></div>';
							} elseif ( $field_group !== $field_value['area'] ) { // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
								echo '</div>';
								echo '<div class="jpcrm-form-grid" style="padding:0;grid-template-columns: 1fr;">';
								echo '<div class="jpcrm-form-group"><label>';
								echo $show_field ? esc_html( $second_address_label ) : '';
								echo '</label></div>';
							}
							$field_group = $field_value['area']; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase, WordPress.WP.I18n.NonSingularStringLiteralText
						}

						if ( $field_group !== '' && ( ! isset( $field_value['area'] ) || $field_value['area'] === '' ) ) { // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
							$field_group = ''; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
							echo '</div>';
							echo '<div class="jpcrm-form-group jpcrm-form-group-span-2">&nbsp;</div>';
						}

						if ( $show_field ) {
							if ( isset( $field_value[0] ) ) {
								if ( $field_group === 'Second Address' ) {
									$field_value[1] = str_replace( ' (' . $second_address_label . ')', '', $field_value[1] );
								}
								zeroBSCRM_html_editField( $zbsCompany, $field_key, $field_value, 'zbsco_' ); // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
							}
						}
					}
					?>
				</div>
			</div>


            <script type="text/javascript">

                jQuery(function(){

                    zbscrm_JS_bindFieldValidators();

                });


            </script><?php

            // PerfTest: zeroBSCRM_performanceTest_finishTimer('custmetabox-draw');
        }

        public function save_data( $company_id, $company ) {

            if (!defined('ZBS_CO_SAVED')){

                // debug if (get_current_user_id() == 12) echo 'FIRING<br>';
                define('ZBS_CO_SAVED',1);

                // DAL3.0+
                global $zbs;

                // check this
                if (empty($company_id) || $company_id < 1)  $company_id = -1;

                // retrieve data in format
                //... by using zeroBS_buildCompanyMeta, custom fields are 'dealt with' automatically
                $dataArr = zeroBS_buildCompanyMeta($_POST);

                // Use the tag-class function to retrieve any tags so we can add inline.
                // Save tags against objid
                $dataArr['tags'] = zeroBSCRM_tags_retrieveFromPostBag(true,ZBS_TYPE_COMPANY); 
 
                // owner - saved here now, rather than ownership box, to allow for pre-hook update. (as tags)
                $owner = -1; if (isset($_POST['zerobscrm-owner'])){

                    // should this have perms check to see if user can actually assign to? or should that be DAL?
                    $potentialOwner = (int)sanitize_text_field( $_POST['zerobscrm-owner'] );
                    if ($potentialOwner > 0) $owner = $potentialOwner;

                }

                // now we check whether a user with this email already exists (separate to this company id), so we can warn them
                // ... that it wont have changed the email
                if (isset($dataArr['email']) && !empty($dataArr['email'])){

                    $potentialID = zeroBS_getCompanyIDWithEmail($dataArr['email']);

                    if (!empty($potentialID) && $potentialID != $company_id){

                        // no go.
                        $this->updateEmailDupeMessage($potentialID);

                        // unset email change (leave as was)
                        $dataArr['email'] = zeroBS_companyEmail($company_id);

                    }

                }

                #AVATARSAVE - save any avatar change if changed :)
                if (isset($_POST['zbs-company-avatar-custom-url']) && !empty($_POST['zbs-company-avatar-custom-url'])) $dataArr['avatar'] = sanitize_text_field( $_POST['zbs-company-avatar-custom-url'] );

                    // Stripslashes
                    // This avoids us adding `O\'toole ltd' into the db. see #1107
                    // ...this is more sensitive than using zeroBSCRM_stripSlashesFromArr
                    // in the long term it may make more sense to stripslashes pre insert/update in the DAL  
                    // in the case of companies, there are no core fields which will be broken by stripslashes at this time (4.0.11)
                    $data_array = $dataArr;
                    foreach ($dataArr as $key => $val){

                        // op strings
                        $value = $val;
                        if ( is_string( $value ) ) $value = stripslashes( $value );
                        
                        // pass into final array
                        $data_array[$key] = $value;

                    }

                    // add update directly
                    $addUpdateReturn = $zbs->DAL->companies->addUpdateCompany(array(

                            'id'    => $company_id,
                            'owner' => $owner,
                            'data'  => $data_array,
                            'limitedFields' => -1,

                    ));

                    // Note: For NEW contacts, we make sure a global is set here, that other update funcs can catch 
                    // ... so it's essential this one runs first!
                    // this is managed in the metabox Class :)
                    if ($company_id == -1 && !empty($addUpdateReturn) && $addUpdateReturn != -1) {
                        
                        $company_id = $addUpdateReturn;
                        global $zbsJustInsertedMetaboxID; $zbsJustInsertedMetaboxID = $company_id;

                        // set this so it redirs
                        $this->newRecordNeedsRedir = true;
                    }

                    // success?
                    if ($addUpdateReturn != -1 && $addUpdateReturn > 0){

                        // Update Msg
                        // this adds an update message which'll go out ahead of any content
                        // This adds to metabox: $this->updateMessages['update'] = zeroBSCRM_UI2_messageHTML('info olive mini zbs-not-urgent',__('Contact Updated',"zero-bs-crm"),'','address book outline','contactUpdated');
                        // This adds to edit page
                        $this->updateMessage( $this->newRecordNeedsRedir );

                        // catch any non-critical messages
                        $nonCriticalMessages = $zbs->DAL->getErrors(ZBS_TYPE_COMPANY);
                        if (is_array($nonCriticalMessages) && count($nonCriticalMessages) > 0) $this->dalNoticeMessage($nonCriticalMessages);

                    } else {

                        // fail somehow
                        $failMessages = $zbs->DAL->getErrors(ZBS_TYPE_COMPANY);

                        // show msg (retrieved from DAL err stack)
                        if (is_array($failMessages) && count($failMessages) > 0)
                            $this->dalErrorMessage($failMessages);
                        else
                            $this->dalErrorMessage(array(__('Insert/Update Failed with general error','zero-bs-crm')));

                        // pass the pre-fill:
                        global $zbsObjDataPrefill; $zbsObjDataPrefill = $dataArr;

            
                    }

            }

            return $company;
        }

        // This catches 'new' contacts + redirs to right url
        public function post_save_data($objID,$obj){

            if ($this->newRecordNeedsRedir){

                global $zbs, $zbsJustInsertedMetaboxID;
                if (!empty($zbsJustInsertedMetaboxID) && $zbsJustInsertedMetaboxID > 0){

                    // redir
                    $zbs->new_record_edit_redirect( $this->objType, $zbsJustInsertedMetaboxID );

                }

            }

        }

        public function updateMessage( $created = false ) {
            $message = $this->coOrgLabel . ' ' . ( $created ? __( 'Created', 'zero-bs-crm' ) : __( 'Updated', 'zero-bs-crm' ) );
            // zbs-not-urgent means it'll auto hide after 1.5s
            $msg = zeroBSCRM_UI2_messageHTML('info olive mini zbs-not-urgent', $message,'','address book outline','companyUpdated');

            // quick + dirty
            global $zbs;

            $zbs->pageMessages[] = $msg;

        }

        public function updateEmailDupeMessage($otherCompanyID=-1){

            global $zbs;

            $viewHTML = ' <a href="'.jpcrm_esc_link('view',$otherCompanyID,$this->objType).'" target="_blank">'.__('View','zero-bs-crm').' '.$this->coOrgLabel.'</a>';

            $msg = zeroBSCRM_UI2_messageHTML('info orange mini',__('Email could not be updated. (A record already exists with this email address).',"zero-bs-crm").$viewHTML,'','address book outline','companyNotUpdated');

            $zbs->pageMessages[] = $msg;

        }
    }


/* ======================================================
  / Company Metabox
   ====================================================== */


/* ======================================================
  "Contacts at Company" Metabox
   ====================================================== */

class zeroBS__Metabox_CompanyContacts extends zeroBS__Metabox{

    private $coOrgLabel = '';

    public function __construct( $plugin_file ) {

        // oldschool.
        $this->coOrgLabel = jpcrm_label_company();
    
        $this->objType = 'company';
        $this->metaboxID = 'zerobs-company-contacts';
        $this->metaboxTitle = __('Associated Contacts',"zero-bs-crm");
        $this->metaboxScreen = 'zbs-add-edit-company-edit'; //'zerobs_edit_contact'; // we can use anything here as is now using our func
        $this->metaboxArea = 'normal';
        $this->metaboxLocation = 'high';
        $this->headless = false;
        //$this->metaboxClasses = '';
        $this->capabilities = array(

            'can_hide'          => false, // can be hidden
            'areas'             => array('normal'), // areas can be dragged to - normal side = only areas currently
            'can_accept_tabs'   => false,  // can/can't accept tabs onto it
            'can_become_tab'    => false, // can be added as tab
            'can_minimise'      => false, // can be minimised
            'can_move'          => false // can be moved

        );

            
        // hide if "new" (not edit) - as can't yet add this way
        $isEdit = false;
        if (isset($_GET['action']) && $_GET['action'] == 'edit' && isset($_GET['zbsid']) && !empty($_GET['zbsid'])) $isEdit = true;
        
        if ($isEdit){
            // call this 
            $this->initMetabox();
        }

    }

    public function html( $company, $metabox ) {

            global $zbs;

            $coID = -1; if (is_array($company) && isset($company['id'])) $coID = (int)$company['id'];

            //$contacts = zeroBS_getCustomers(true,1000,0,false,false,'',false,false,$coID);        
            $contacts = array();
            if ($coID > 0){
                $contacts = $zbs->DAL->contacts->getContacts(array(

                        'inCompany' => $coID,

                        'sortByField'   => 'ID',
                        'sortOrder'     => 'ASC',
                        'page'          => 0,
                        'perPage'       => 200,
                        'ignoreowner'   => zeroBSCRM_DAL2_ignoreOwnership(ZBS_TYPE_CONTACT)

                ));
            }


            #} JUST OUTPUT

            ?><table class="form-table wh-metatab wptbp" id="wptbpMetaBoxMainItemContacts">

                <tr class="wh-large"><th>
                    <?php
                        if (count($contacts) > 0){
                            echo '<div id="zbs-co-contacts" class="ui cards">';

                            foreach ($contacts as $contact){

                                #} new view link
                                $contactUrl = jpcrm_esc_link('view',$contact['id'],'zerobs_customer');

                                #} Name
                                $contactName = zeroBS_customerName($contact['id'],$contact,false,false);
                                $contactFirstName = ''; if (isset($contact['fname'])) $contactFirstName = $contact['fname'];

                                #} Description
                                $contactDesc = '<i class="calendar alternate outline icon"></i>' . __('Contact since',"zero-bs-crm").' '.zeroBSCRM_date_i18n(zeroBSCRM_getDateFormat(), $contact['createduts'], true, false);
                                if (isset($contact['email']) && !empty($contact['email'])) $contactDesc .= '<br /><a href="'.$contactUrl.'" target="_blank">'.$contact['email'].'</a>';

                                ?><div class="card">
                                  <div class="content">
                                    <div class="center aligned header"><?php echo '<a href="'.esc_attr($contactUrl).'">'.esc_html($contactName).'</a>'; ?></div>
                                    <?php if (!empty($contactDesc)){ ?>
                                    <div class="center aligned description">
                                      <p><?php echo $contactDesc; ?></p>
                                    </div>
                                    <?php } ?>
                                  </div>
                                  <div class="extra content">
                                    <div class="center aligned author">
                                      <?php
                                            #} Img or ico 
                                            echo zeroBS_getCustomerIcoHTML($contact['id'],'ui avatar image').' '. esc_html( $contactFirstName );
                                        ?>
                                    </div>
                                  </div>
                                </div><?php
                            }


                            echo '</div>';

                        } else {

                            echo '<div style="margin-left:auto;margin-right:auto;display:inline-block">';
                            esc_html_e('No contacts found at',"zero-bs-crm"); echo ' ' . esc_html( $this->coOrgLabel );
                            echo '</div>';

                        }

                    ?>
                </th></tr>
                
            </table>

            <script type="text/javascript">

                jQuery(function(){

                });

            </script>
             


            <?php

    }

    public function save_data( $companyID, $company ) {    

        // none as of yet

        return $company;
    }
}



/* ======================================================
  / "Contacts at Company" Metabox
   ====================================================== */

/* ======================================================
  Create Tags Box
   ====================================================== */

class zeroBS__Metabox_CompanyTags extends zeroBS__Metabox_Tags{


    public function __construct( $plugin_file ) {
    
        $this->objTypeID = ZBS_TYPE_COMPANY;
        $this->objType = 'company';
        $this->metaboxID = 'zerobs-company-tags';
        $this->metaboxTitle = __(jpcrm_label_company().' Tags',"zero-bs-crm");
        $this->metaboxScreen = 'zbs-add-edit-company-edit'; //'zerobs_edit_contact'; // we can use anything here as is now using our func
        $this->metaboxArea = 'side';
        $this->metaboxLocation = 'high';
        $this->showSuggestions = true;
        $this->capabilities = array(

            'can_hide'          => true, // can be hidden
            'areas'             => array('side'), // areas can be dragged to - normal side = only areas currently
            'can_accept_tabs'   => false,  // can/can't accept tabs onto it
            'can_become_tab'    => false, // can be added as tab
            'can_minimise'      => true // can be minimised

        );

        // call this 
        $this->initMetabox();

    }

    // html + save dealt with by parent class :) 
}

/* ======================================================
  / Create Tags Box
   ====================================================== */

/* ======================================================
  Attach files to company metabox
   ====================================================== */

    class zeroBS__Metabox_CompanyFiles extends zeroBS__Metabox{

        public function __construct( $plugin_file ) {

            $this->objType = 'company';
            $this->metaboxID = 'zerobs-company-files';
            $this->metaboxTitle = __('Files',"zero-bs-crm");
            $this->metaboxScreen = 'zbs-add-edit-company-edit'; //'zerobs_edit_contact'; // we can use anything here as is now using our func
            $this->metaboxArea = 'normal';
            $this->metaboxLocation = 'low';
            $this->capabilities = array(

                'can_hide'          => true, // can be hidden
                'areas'             => array('normal'), // areas can be dragged to - normal side = only areas currently
                'can_accept_tabs'   => true,  // can/can't accept tabs onto it
                'can_become_tab'    => true, // can be added as tab
                'can_minimise'      => true // can be minimised

            );

            // call this 
            $this->initMetabox();

        }

        public function html( $company, $metabox ) {

                global $zbs;

                $html = '';
                $companyID = -1; if (is_array($company) && isset($company['id'])) $companyID = (int)$company['id'];
                $zbsFiles = zeroBSCRM_files_getFiles('company',$companyID);

                ?><table class="form-table wh-metatab wptbp" id="wptbpMetaBoxMainItemFiles">

                    <?php

                    #} Whole file delete method could do with rewrite
                    #} Also sort JS into something usable - should be ajax all this

                    #} Any existing
                    if (is_array($zbsFiles) && count($zbsFiles) > 0){ 
                      ?><tr class="wh-large zbsFileDetails"><th class="zbsFilesTitle"><label><?php echo '<span>'.count($zbsFiles).'</span> '.esc_html__('File(s)','zero-bs-crm').':'; ?></label></th>
                                <td id="zbsFileWrapOther">
                                    <table class="ui celled table" id="zbsFilesTable">
                                      <thead>
                                        <tr>
                                            <th><?php esc_html_e("File", 'zero-bs-crm');?></th>
                                            <th class="collapsing center aligned"><?php esc_html_e("Actions", 'zero-bs-crm');?></th>
                                        </tr>
                                    </thead><tbody>
                                                <?php $fileLineIndx = 1; foreach($zbsFiles as $zbsFile){

                                                    /* $file = basename($zbsFile['file']);

                                                    // if in privatised system, ignore first hash in name
                                                    if (isset($zbsFile['priv'])){

                                                        $file = substr($file,strpos($file, '-')+1);
                                                    } */
                                                    $file = zeroBSCRM_files_baseName($zbsFile['file'],isset($zbsFile['priv']));

                                                    $fileEditUrl = admin_url('admin.php?page='.$zbs->slugs['editfile']) . "&company=".$companyID."&fileid=" . ($fileLineIndx-1);

                                                    echo '<tr class="zbsFileLineTR" id="zbsFileLineTRCustomer'.esc_attr($fileLineIndx).'">';
                                                    echo '<td><div class="zbsFileLine" id="zbsFileLineCustomer'.esc_attr($fileLineIndx).'"><a href="' . esc_url( $zbsFile['url'] ) . '" target="_blank">' . esc_html( $file ) . '</a></div>';

                                                    // if using portal.. state shown/hidden
                                                    // this is also shown in each file slot :) if you change any of it change that too
                                                    /*if(defined('ZBS_CLIENTPRO_TEMPLATES')){
                                                        if(isset($zbsFile['portal']) && $zbsFile['portal']){
                                                          echo "<p><i class='icon check circle green inverted'></i> ".__('Shown on Portal','zero-bs-crm').'</p>';
                                                        }else{
                                                          echo "<p><i class='icon ban inverted red'></i> ".__('Not shown on Portal','zero-bs-crm').'</p>';
                                                        }
                                                    }*/

                                                    echo '</td>';
                                                    echo '<td class="collapsing center aligned"><span class="zbsDelFile ui button basic" data-delurl="' . esc_attr( $zbsFile['url'] ) . '"><i class="trash alternate icon"></i> '.esc_html__('Delete','zero-bs-crm').'</span></td></tr>'; // <a href="'.$fileEditUrl.'" target="_blank" class="ui button basic"><i class="edit icon"></i> '.__('Edit','zero-bs-crm').'</a>
                                                    $fileLineIndx++;

                                                } ?>
                                    </tbody></table>
                                </td></tr><?php

                    } ?>

                    <?php #adapted from http://code.tutsplus.com/articles/attaching-files-to-your-posts-using-wordpress-custom-meta-boxes-part-1--wp-22291

                             
                            $html .= '<input type="file" id="zbs_file_attachment" name="zbs_file_attachment" size="25" class="zbs-dc">';
                            
                            ?><tr class="wh-large"><th><label><?php esc_html_e('Add File',"zero-bs-crm");?>:</label><br />(<?php esc_html_e('Optional',"zero-bs-crm");?>)<br /><?php esc_html_e('Accepted File Types',"zero-bs-crm");?>:<br /><?php echo esc_html( zeroBS_acceptableFileTypeListStr() ); ?></th>
                                <td><?php
                            wp_nonce_field(plugin_basename(__FILE__), 'zbs_file_attachment_nonce');
                            echo $html;
                    ?></td></tr>

                
                </table>
                <?php

                   // PerfTest: zeroBSCRM_performanceTest_finishTimer('custmetabox');
                   // PerfTest: zeroBSCRM_performanceTest_debugOut();

                   ?>
                <script type="text/javascript">

                    var zbsCurrentlyDeleting = false;
                    var zbsMetaboxFilesLang = {

                        'error': '<?php echo esc_html( zeroBSCRM_slashOut(__('Error','zero-bs-crm')) ); ?>',
                        'unabletodelete': '<?php echo esc_html( zeroBSCRM_slashOut(__('Unable to delete this file.','zero-bs-crm')) ); ?>'
                    };

                    jQuery(function(){

                        jQuery('.zbsDelFile').on( 'click', function(){

                            if (!window.zbsCurrentlyDeleting){

                                // blocking
                                window.zbsCurrentlyDeleting = true;

                                var delUrl = jQuery(this).attr('data-delurl');
                                //var lineIDtoRemove = jQuery(this).closest('.zbsFileLine').attr('id');
                                var lineToRemove = jQuery(this).closest('tr');

                                if (typeof delUrl != "undefined" && delUrl != ''){



                                      // postbag!
                                      var data = {
                                        'action': 'delFile',
                                        'zbsfType': '<?php echo esc_html( $this->objType ); ?>',
                                        'zbsDel':  delUrl, // could be csv, never used though
                                        'zbsCID': <?php echo esc_html( $companyID ); ?>,
                                        'sec': window.zbscrmjs_secToken
                                      };

                                      // Send it Pat :D
                                      jQuery.ajax({
                                              type: "POST",
                                              url: ajaxurl, // admin side is just ajaxurl not wptbpAJAX.ajaxurl,
                                              "data": data,
                                              dataType: 'json',
                                              timeout: 20000,
                                              success: function(response) {

                                                var localLineToRemove = lineToRemove, localDelURL = delUrl;

                                                // visually remove
                                                //jQuery(this).closest('.zbsFileLine').remove();
                                                //jQuery('#' + lineIDtoRemove).remove();
                                                jQuery(localLineToRemove).remove();

                                                // update number
                                                var newNumber = jQuery('#zbsFilesTable tr').length-1;
                                                if (newNumber > 0)
                                                    jQuery('#wptbpMetaBoxMainItemFiles .zbsFilesTitle span').html();
                                                else
                                                    jQuery('#wptbpMetaBoxMainItemFiles .zbsFileDetails').remove();


                                                // remove any filled slots (with this file)
                                                jQuery('.zbsFileSlotTable').each(function(ind,ele){

                                                    if (jQuery(ele).attr('data-sloturl') == localDelURL){

                                                        jQuery('.zbsFileSlotWrap',jQuery(ele)).remove();
                                                
                                                    }

                                                });

                                                // file deletion errors, show msg:
                                                if (typeof response.errors != "undefined" && response.errors.length > 0){

                                                    jQuery.each(response.errors,function(ind,ele){

                                                        jQuery('#zerobs-company-files-box').append('<div class="ui warning message" style="margin-top:10px;">' + ele + '</div>');

                                                    });
                                                         

                                                }

                                              },
                                              error: function(response){

                                                jQuery('#zerobs-company-files-box').append('<div class="ui warning message" style="margin-top:10px;"><strong>' + window.zbsMetaboxFilesLang.error + ':</strong> ' + window.zbsMetaboxFilesLang.unabletodelete + '</div>');

                                              }

                                            });

                                }

                                window.zbsCurrentlyDeleting = false;

                            } // / blocking

                        });

                    });


                </script><?php

               // PerfTest: zeroBSCRM_performanceTest_finishTimer('other');


        }

        public function save_data( $companyID, $company ) {

            global $zbs, $zbsc_justUploadedFile;


            if(!empty($_FILES['zbs_file_attachment']['name']) && 
                (!isset($zbsc_justUploadedFile) ||
                    (isset($zbsc_justUploadedFile) && $zbsc_justUploadedFile != $_FILES['zbs_file_attachment']['name'])
                )
                ) {


                /* --- security verification --- */
                if(!wp_verify_nonce($_POST['zbs_file_attachment_nonce'], plugin_basename(__FILE__))) {
                  return $id;
                } // end if


                if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
                  return $id;
                } // end if
                   
                if (!zeroBSCRM_permsCustomers()){
                    return $companyID;
                }
                /* - end security verification - */

                #} Blocking repeat-upload bug
                $zbsc_justUploadedFile = $_FILES['zbs_file_attachment']['name'];

                // verify file extension and mime type
                if ( jpcrm_file_check_mime_extension( $_FILES['zbs_file_attachment'] ) ){

                    $company_dir_info = jpcrm_storage_dir_info_for_company( $companyID );
                    $upload           = jpcrm_save_admin_upload_to_folder( 'zbs_file_attachment', $company_dir_info['files'] );

                    if(isset($upload['error']) && $upload['error'] != 0) {
                        wp_die('There was an error uploading your file. The error is: ' . esc_html( $upload['error'] ));
                    } else {
                            // w mod - adds to array :)
                            $zbsCompanyFiles = zeroBSCRM_files_getFiles('company',$companyID);//zeroBSCRM_getCustomerFiles($companyID);

                            if (is_array($zbsCompanyFiles)){

                                //add it
                                $zbsCompanyFiles[] = $upload;

                            } else {

                                // first
                                $zbsCompanyFiles = array($upload);

                            }

                            // update
                            zeroBSCRM_files_updateFiles('company',$companyID,$zbsCompanyFiles);

                            // Fire any 'post-upload-processing' (e.g. CPP makes thumbnails of pdf, jpg, etc.)
                            do_action('zbs_post_upload_company',$upload);
                    }
                } else {
                    wp_die("The file type that you've uploaded is not an accepted file format.");
                }
            }

            return $company;
        }
    }


/* ======================================================
  / Attach files to company metabox
   ====================================================== */


/* ======================================================
    Company Actions Metabox Metabox
   ====================================================== */

    class zeroBS__Metabox_CompanyActions extends zeroBS__Metabox{ 

        private $coOrgLabel = '';

        public function __construct( $plugin_file ) {

            // oldschool.
            $this->coOrgLabel = jpcrm_label_company();

            // set these
            $this->objType = 'company';
            $this->metaboxID = 'zerobs-company-actions';
            $this->metaboxTitle = jpcrm_label_company().' '.__('Actions','zero-bs-crm'); // will be headless anyhow
            $this->headless = true;
            $this->metaboxScreen = 'zbs-add-edit-company-edit';
            $this->metaboxArea = 'side';
            $this->metaboxLocation = 'high';
            $this->saveOrder = 1;
            $this->capabilities = array(

                'can_hide'          => false, // can be hidden
                'areas'             => array('side'), // areas can be dragged to - normal side = only areas currently
                'can_accept_tabs'   => true,  // can/can't accept tabs onto it
                'can_become_tab'    => false, // can be added as tab
                'can_minimise'      => true, // can be minimised
                'can_move'          => true // can be moved

            );

            // call this 
            $this->initMetabox();

        }

        public function html( $company, $metabox ) {

            ?><div class="zbs-generic-save-wrap">

                    <div class="ui medium dividing header"><i class="save icon"></i> <?php echo esc_html( jpcrm_label_company() ); ?> <?php esc_html_e('Actions','zero-bs-crm'); ?></div>

            <?php

            // localise ID & content
            $companyID = -1; if (is_array($company) && isset($company['id'])) $companyID = (int)$company['id'];

                #} if a saved post...
                //if (isset($post->post_status) && $post->post_status != "auto-draft"){
                if ($companyID > 0){ // existing

                    ?>

                    <div class="zbs-company-actions-bottom zbs-objedit-actions-bottom">

								<button  class="ui button black" type="button" id="zbs-edit-save"><?php esc_html_e( 'Update', 'zero-bs-crm' ); ?> <?php echo esc_html( $this->coOrgLabel ); // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase ?></button>

                        <?php

                            // delete?

                         // for now just check if can modify, later better, granular perms.
                         if ( zeroBSCRM_permsQuotes() ) { 
                        ?><div id="zbs-company-actions-delete" class="zbs-objedit-actions-delete">
                             <a class="submitdelete deletion" href="<?php echo jpcrm_esc_link( 'delete', $companyID, 'company' ); ?>"><?php esc_html_e('Delete Permanently', "zero-bs-crm"); ?></a>
                        </div>
                        <?php } // can delete  ?>
                        
                        <div class='clear'></div>

                    </div>
                <?php


                } else {

                    // NEW quote ?>

                    <div class="zbs-company-actions-bottom zbs-objedit-actions-bottom">
                        
							<button class="ui button black" type="button" id="zbs-edit-save"><?php esc_html_e( 'Save', 'zero-bs-crm' ); ?> <?php echo esc_html( $this->coOrgLabel ); // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase ?></button>

                    </div>

                 <?php

                }

            ?></div><?php // / .zbs-generic-save-wrap
              
        } // html

        // saved via main metabox
    }


/* ======================================================
  / Company Actions Metabox
   ====================================================== */

/* ======================================================
  Company Activity Metabox
   ====================================================== */
class zeroBS__Metabox_Company_Activity extends zeroBS__Metabox {

    public function __construct( $plugin_file ) {
    
        $this->metaboxID = 'zbs-company-activity-metabox';
        $this->metaboxTitle = __('Activity', 'zero-bs-crm');
        $this->metaboxIcon = 'heartbeat';
        $this->metaboxScreen = 'zerobs_view_company'; // we can use anything here as is now using our func
        $this->metaboxArea = 'side';
        $this->metaboxLocation = 'high';

        // call this 
        $this->initMetabox();

    }

    public function html( $obj, $metabox ) {
            
            global $zbs; 
            
            $objid = -1; if (is_array($obj) && isset($obj['id'])) $objid = $obj['id'];
            
            // no need for this, $obj will already be same $zbsCustomer = zeroBS_getCustomer($objid, true,true,true);
            
            echo '<div class="zbs-activity">';
                echo '<div class="">';
                    $zbsCompanyActivity = zeroBSCRM_getCompanyLogs($objid,true,100,0,'',false);
                    zeroBSCRM_html_companyTimeline($objid,$zbsCompanyActivity,$obj);
                echo '</div>';
             echo '</div>';

    }

    // nothing to save here.
    public function save_data( $objID, $obj ) {
        return $obj;
    }
}


/* ======================================================
  Company Activity Metabox
   ====================================================== */
