protected function _parser($shortcode)
 {
     EE_Registry::instance()->load_helper('Template');
     $this->_ticket = $this->_data instanceof EE_Ticket ? $this->_data : null;
     $aee = $this->_data instanceof EE_Messages_Addressee ? $this->_data : null;
     $aee = !$aee instanceof EE_Messages_Addressee && is_array($this->_extra_data) && isset($this->_extra_data['data']) && $this->_extra_data['data'] instanceof EE_Messages_Addressee ? $this->_extra_data['data'] : $aee;
     //possible EE_Line_Item may be incoming data
     $this->_ticket = empty($this->_ticket) && $this->_data instanceof EE_Line_Item && $aee instanceof EE_Messages_Addressee && !empty($aee->line_items_with_children[$this->_data->ID()]['EE_Ticket']) && $aee->line_items_with_children[$this->_data->ID()]['EE_Ticket'] instanceof EE_Ticket ? $aee->line_items_with_children[$this->_data->ID()]['EE_Ticket'] : $this->_ticket;
     //if still no ticket, then let's see if there is a reg_obj.  If there IS, then we'll try and grab the ticket from the reg_obj instead.
     if (empty($this->_ticket)) {
         $this->_ticket = $aee instanceof EE_Messages_Addressee && $aee->reg_obj instanceof EE_Registration ? $aee->reg_obj->ticket() : NULL;
     }
     //If there is no event object by now then get out.
     if (!$this->_ticket instanceof EE_Ticket) {
         return '';
     }
     switch ($shortcode) {
         case '[TICKET_ID]':
             return $this->_ticket->ID();
             break;
         case '[TICKET_NAME]':
             return $this->_ticket->get('TKT_name');
             break;
         case '[TICKET_DESCRIPTION]':
             return $this->_ticket->get('TKT_description');
             break;
         case '[TICKET_PRICE]':
             return EEH_Template::format_currency($this->_ticket->get('TKT_price'));
             break;
         case '[TICKET_PRICE_WITH_TAXES]':
             return EEH_Template::format_currency($this->_ticket->get_ticket_total_with_taxes());
             break;
         case '[TKT_QTY_PURCHASED]':
             return $aee instanceof EE_Messages_Addressee ? $aee->tickets[$this->_ticket->ID()]['count'] : '';
             break;
     }
     if (strpos($shortcode, '[TKT_USES_*') !== FALSE) {
         $attrs = $this->_get_shortcode_attrs($shortcode);
         $schema = empty($attrs['schema']) ? null : $attrs['schema'];
         return $this->_ticket->get_pretty('TKT_uses', $schema);
     }
     return '';
 }
 /**
  * Setup an individual ticket form for the decaf event editor page
  *
  * @access private
  * @param  EE_Ticket $ticket   the ticket object
  * @param  boolean   $skeleton whether we're generating a skeleton for js manipulation
  * @param int        $row
  * @return string generated html for the ticket row.
  */
 private function _get_ticket_row($ticket, $skeleton = FALSE, $row = 0)
 {
     $template_args = array('tkt_status_class' => ' tkt-status-' . $ticket->ticket_status(), 'tkt_archive_class' => $ticket->ticket_status() === EE_Ticket::archived && !$skeleton ? ' tkt-archived' : '', 'ticketrow' => $skeleton ? 'TICKETNUM' : $row, 'TKT_ID' => $ticket->get('TKT_ID'), 'TKT_name' => $ticket->get('TKT_name'), 'TKT_start_date' => $skeleton ? '' : $ticket->get_date('TKT_start_date', 'Y-m-d h:i a'), 'TKT_end_date' => $skeleton ? '' : $ticket->get_date('TKT_end_date', 'Y-m-d h:i a'), 'TKT_is_default' => $ticket->get('TKT_is_default'), 'TKT_qty' => $ticket->get_pretty('TKT_qty', 'input'), 'edit_ticketrow_name' => $skeleton ? 'TICKETNAMEATTR' : 'edit_tickets', 'TKT_sold' => $skeleton ? 0 : $ticket->get('TKT_sold'), 'trash_icon' => ($skeleton || !empty($ticket) && !$ticket->get('TKT_deleted')) && (!empty($ticket) && $ticket->get('TKT_sold') === 0) ? 'trash-icon dashicons dashicons-post-trash clickable' : 'ee-lock-icon', 'disabled' => $skeleton || !empty($ticket) && !$ticket->get('TKT_deleted') ? '' : ' disabled=disabled');
     $price = $ticket->ID() !== 0 ? $ticket->get_first_related('Price', array('default_where_conditions' => 'none')) : EE_Registry::instance()->load_model('Price')->create_default_object();
     $price_args = array('price_currency_symbol' => EE_Registry::instance()->CFG->currency->sign, 'PRC_amount' => $price->get('PRC_amount'), 'PRT_ID' => $price->get('PRT_ID'), 'PRC_ID' => $price->get('PRC_ID'), 'PRC_is_default' => $price->get('PRC_is_default'));
     //make sure we have default start and end dates if skeleton
     //handle rows that should NOT be empty
     if (empty($template_args['TKT_start_date'])) {
         //if empty then the start date will be now.
         $template_args['TKT_start_date'] = date('Y-m-d h:i a', current_time('timestamp'));
     }
     if (empty($template_args['TKT_end_date'])) {
         //get the earliest datetime (if present);
         $earliest_dtt = $this->_cpt_model_obj->ID() > 0 ? $this->_cpt_model_obj->get_first_related('Datetime', array('order_by' => array('DTT_EVT_start' => 'ASC'))) : NULL;
         if (!empty($earliest_dtt)) {
             $template_args['TKT_end_date'] = $earliest_dtt->get_datetime('DTT_EVT_start', 'Y-m-d', 'h:i a');
         } else {
             $template_args['TKT_end_date'] = date('Y-m-d h:i a', mktime(0, 0, 0, date("m"), date("d") + 7, date("Y")));
         }
     }
     $template_args = array_merge($template_args, $price_args);
     $template = apply_filters('FHEE__Events_Admin_Page__get_ticket_row__template', EVENTS_TEMPLATE_PATH . 'event_tickets_metabox_ticket_row.template.php', $ticket);
     return EEH_Template::display_template($template, $template_args, TRUE);
 }