<?php
/**
 * @package    RSForm! Pro
 * @copyright  (c) 2007-2019 www.rsjoomla.com
 * @link       https://www.rsjoomla.com
 * @license    GNU General Public License http://www.gnu.org/licenses/gpl-3.0.en.html
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;

class RSFormProQuickFields
{
	public static function getFieldNames($type = 'all')
	{
		static $done;
		static $fieldsets	= array();
		static $all	  		= array();
		static $required 	= array();
		static $hidden	  	= array();
		static $pages		= array();

		if (!$done) {
			// Get field properties first
			$mainframe = Factory::getApplication();
			$formId = Factory::getApplication()->input->getInt('formId');
			$db 	= Factory::getDbo();
			$query	= $db->getQuery(true);
			$query->select($db->qn('c.ComponentId'))
			      ->select($db->qn('c.ComponentTypeId'))
			      ->select($db->qn('ct.ComponentTypeName'))
			      ->from($db->qn('#__rsform_components', 'c'))
			      ->join('LEFT', $db->qn('#__rsform_component_types', 'ct') .'ON ('.$db->qn('ct.ComponentTypeId').'='.$db->qn('c.ComponentTypeId').')')
			      ->where($db->qn('c.FormId').'='.$db->q($formId))
			      ->where($db->qn('c.Published').'='.$db->q(1))
			      ->order($db->qn('c.Order').' '.$db->escape('asc'));

			if ($components = $db->setQuery($query)->loadObjectList()) {
				$data = RSFormProHelper::getComponentProperties($components);

				$i = 0;
				foreach ($components as $component) {
					if (!empty($data[$component->ComponentId])) {
						$properties =& $data[$component->ComponentId];
						if (isset($properties['NAME'])) {
							// Populate the 'all' array
							$componentPlaceholders = array(
								'name' => $properties['NAME'],
								'id'   => $component->ComponentTypeId,
								'generate' => array(),
								'display'  => array()
							);
							
							// Add caption placeholders only if captions exist.
							if (isset($properties['CAPTION']))
							{
								$componentPlaceholders['generate'][] = '{' . $properties['NAME'] . ':caption}';
								$componentPlaceholders['display'][] = '{' . $properties['NAME'] . ':caption}';
							}

							// Body placeholder
							$componentPlaceholders['generate'][] = '{' . $properties['NAME'] . ':body}';

							// Add description placeholders only if a description exists.
							if (isset($properties['DESCRIPTION']))
							{
								$componentPlaceholders['generate'][] = '{' . $properties['NAME'] . ':description}';
								$componentPlaceholders['generate'][] = '{' . $properties['NAME'] . ':descriptionhtml}';
							}
							
							// Validation placeholder
							$componentPlaceholders['generate'][] = '{' . $properties['NAME'] . ':validation}';
							$componentPlaceholders['generate'][] = '{' . $properties['NAME'] . ':errorClass}';

							// Value placeholder
							$componentPlaceholders['display'][] = '{' . $properties['NAME'] . ':value}';

							if ($component->ComponentTypeId == RSFORM_FIELD_FILEUPLOAD) {
								$componentPlaceholders['display'][] = '{' . $properties['NAME'] . ':path}';
								$componentPlaceholders['display'][] = '{' . $properties['NAME'] . ':localpath}';
								$componentPlaceholders['display'][] = '{' . $properties['NAME'] . ':filename}';
								$componentPlaceholders['display'][] = '{' . $properties['NAME'] . ':image}';
								$componentPlaceholders['display'][] = '{' . $properties['NAME'] . ':localimage}';
								$componentPlaceholders['display'][] = '{' . $properties['NAME'] . ':count}';
							}

							if ($component->ComponentTypeId == RSFORM_FIELD_GMAPS) {
								$componentPlaceholders['display'][] = '{' . $properties['NAME'] . ':map}';
							}

							if (isset($properties['ITEMS'])) {
								$componentPlaceholders['display'][] = '{' . $properties['NAME'] . ':text}';
								if (strpos($properties['ITEMS'], '[p') !== false) {
									$componentPlaceholders['display'][] = '{' . $properties['NAME'] . ':price}';
								}
							}

							$mainframe->triggerEvent('onRsformAfterCreateQuickAddPlaceholders', array(&$componentPlaceholders, $component->ComponentTypeId));

							$all[] = $componentPlaceholders;

							// check if the field is required
							$isRequired = false;
							$propRequired  = self::getProperty($properties, 'REQUIRED');
							$propImagetype = self::getProperty($properties, 'IMAGETYPE');
							if ($propRequired || // Add required fields
							    (!is_null($propImagetype) && $propImagetype != 'INVISIBLE') || // Add CAPTCHA fields
							    (in_array($component->ComponentTypeId, RSFormProHelper::$captchaFields)) // Add ReCAPTCHA fields
							) {
								$isRequired = true;

								// Populate the 'required' array
								$required[] = $properties['NAME'];
							}

							// Populate the 'hidden' array
							if (isset($properties['LAYOUTHIDDEN']) && $properties['LAYOUTHIDDEN'] == 'YES') {
								$hidden[] = $properties['NAME'];
							}

							// check if the field is a pagebreak
							$pagebreak = false;
							if ($component->ComponentTypeId == RSFORM_FIELD_PAGEBREAK) {
								$pagebreak = true;
							}

							$fieldsets[$i][(($component->ComponentTypeName == 'hidden' || $component->ComponentTypeName == 'ticket') ? 'hidden':'visible')][] = array('data' => $properties, 'required' => $isRequired, 'pagebreak' => $pagebreak);
						}
						if ($component->ComponentTypeId == RSFORM_FIELD_PAGEBREAK) {
							// Populate the 'pages' array
							$pages[] = $properties['NAME'];
							$i++;
						}
					}
				}
			}

			$done = true;
		}

		return $$type;
	}

	public static function getProperty($fieldData, $prop, $default=null)
	{
		// Special case, we no longer use == 'YES' or == 'NO'
		if (isset($fieldData[$prop])) {
			if ($fieldData[$prop] === 'YES') {
				return true;
			} else if ($fieldData[$prop] === 'NO') {
				return false;
			} else {
				return $fieldData[$prop];
			}
		}

		if ($default === 'YES') {
			return true;
		} elseif ($default === 'NO') {
			return false;
		} else {
			return $default;
		}
	}
}