<?php 
/**
* @version		$Id: api.php 2493 2023-04-23 07:50:28Z IOS $
* @package		Elxis
* @subpackage	Component Translator
* @copyright	Copyright (c) 2006-2023 Elxis CMS (https://www.elxis.org). All rights reserved.
* @license		Elxis Public License ( https://www.elxis.org/elxis-public-license.html )
* @author		Elxis Team ( https://www.elxis.org )
* @description 	Elxis CMS is free software. Read the license for copyright notices and details
*/

defined('_ELXIS_') or die ('Direct access to this location is not allowed');


class apiEtranslatorController extends etranslatorController {

	/*********************/
	/* MAGIC CONSTRUCTOR */
	/*********************/
	public function __construct($view=null, $task='', $model=null) {
		parent::__construct($view, $task, $model);
	}


	/*****************************/
	/* LOAD TRANSLATION (STRING) */
	/*****************************/
	public function loadtranslation() {
		$elxis = eFactory::getElxis();

		$pat = '#[^a-zA-Z0-9\_\-]#';
		$options = array();
		$options['category'] = $elxis->sanitizeInput('category', INPUT_POST);
		$options['category'] = preg_replace($pat, '', $options['category']);
		$options['element'] = $elxis->sanitizeInput('element', INPUT_POST);
		$options['element'] = preg_replace($pat, '', $options['element']);
		$options['elid'] = (isset($_POST['elid'])) ? (int)$_POST['elid'] : 0;
		if ($options['elid'] < 0) { $options['elid'] = 0; }
		$options['language'] = $elxis->sanitizeInput('language', INPUT_POST);
		$options['language'] = preg_replace($pat, '', $options['language']);
		if ($options['language'] != '') {
			if (!file_exists(ELXIS_PATH.'/language/'.$options['language'].'/'.$options['language'].'.php')) { $options['language'] = ''; }
		}

		if (($options['category'] == '') || ($options['category'] != $_POST['category'])) {
			$this->view->apiError('Translation element Category is invalid!');
			return;
		}
		if (($options['element'] == '') || ($options['element'] != $_POST['element'])) {
			$this->view->apiError('Translation element Element is invalid!');
			return;
		}
		if ($options['elid'] == 0) {
			$this->view->apiError('To add a translation first save the original item!');
			return;
		}
		if (($options['language'] == '') || ($options['language'] != $_POST['language'])) {
			$this->view->apiError('Translation element Language is invalid!');
			return;
		}

		$row = $this->model->getTranslation($options['category'], $options['element'], $options['elid'], $options['language']);

		$this->view->loadResponse($options, $row);
	}


	/********************/
	/* SAVE TRANSLATION */
	/********************/
	public function savetrans() {//ELXIS 5.x
		$elxis = eFactory::getElxis();
		$eLang = eFactory::getLang();

		$response = array('success' => 0, 'message' => '', 'trid' => 0);

		$pat = '#[^a-zA-Z0-9\_\-]#';
		$longtext = isset($_POST['longtext']) ? (int)$_POST['longtext'] : 0;
		$trid = isset($_POST['trid']) ? (int)$_POST['trid'] : 0;
		$elid = isset($_POST['elid']) ? (int)$_POST['elid'] : 0;
		$category = $elxis->sanitizeInput('category', INPUT_POST);
		$category = preg_replace($pat, '', $category);
		$element = $elxis->sanitizeInput('element', INPUT_POST);
		$element = preg_replace($pat, '', $element);
		$language = $elxis->sanitizeInput('language', INPUT_POST);
		$language = preg_replace($pat, '', $language);
		if ($language != '') {
			if (!file_exists(ELXIS_PATH.'/language/'.$language.'/'.$language.'.php')) { $language = ''; }
		}

		if ($longtext == 1) {
			$translation = filter_input(INPUT_POST, 'translation', FILTER_UNSAFE_RAW);
		} else {
			$translation = eUTF::trim($elxis->sanitizeInput('translation', INPUT_POST, true, false));
		}

		$row = new translationsDbTable();
		if ($trid > 0) {
			if (!$row->load($trid)) {
				$response['message'] = $eLang->get('TRANS_NOT_FOUND');
				$this->ajaxHeaders('application/json');
				echo json_encode($response);
				exit;
			}
		}

		if ($category == '') {
			$response['message'] = 'Translation element Category is invalid!';
		} else if ($element == '') {
			$response['message'] = 'Translation element Element is invalid!';
		} else if ($elid < 1) {
			$response['message'] = $eLang->get('FIRST_SAVE_ORIG');
		} else if ($language == '') {
			$response['message'] = 'Translation element Language is invalid!';
		} else if ($translation == '') {
			$response['message'] = $eLang->get('PROVIDE_TRANS');
		}

		if ($response['message'] != '') {
			$this->ajaxHeaders('application/json');
			echo json_encode($response);
			exit;
		}

		if ($trid > 0) {
			if (($category != $row->category) || ($element != $row->element) || ($language != $row->language) || ($elid != $row->elid)) {
				$response['message'] = 'Saved translation data do not match the provided ones!';
				$this->ajaxHeaders('application/json');
				echo json_encode($response);
				exit;
			}
		} else {
			$row->category = $category;
			$row->element = $element;
			$row->language = $language;
			$row->elid = $elid;
		}

		$row->translation = $translation;

		if (preg_match('/^(com\_)/i', $category)) {
			$component = strtolower($category);
			if ($elxis->acl()->check('component', $component, 'manage') < 1) {
				$response['message'] = 'You are not allowed to manage component '.$component;
				$this->ajaxHeaders('application/json');
				echo json_encode($response);
				exit;
			}
		}

		if ($category == 'module') {
			if (preg_match('/^(mod\_)/i', $element)) {
				$module = strtolower($element);
				if ($elxis->acl()->check('module', $module, 'manage', $elid) < 1) {
					$response['message'] = 'You are not allowed to edit '.$module.' with instance '.$elid.'!';
					$this->ajaxHeaders('application/json');
					echo json_encode($response);
					exit;
				}
			}
		}

		if (!$row->store()) {
			$response['message'] = $eLang->get('TRANS_CNOT_SAVE');
			return;
		} else {
			$response['trid'] = $row->trid;
			$response['success'] = 1;
		}

		$this->ajaxHeaders('application/json');
		echo json_encode($response);
		exit;
	}


	/*************************************/
	/* SAVE ALL TRANSLATIONS (ELXIS 5.X) */
	/*************************************/
	public function savealltrans() {
		$eLang = eFactory::getLang();
		$elxis = eFactory::getElxis();

		$pat = '#[^a-zA-Z0-9\_\-]#';

		$category = $elxis->sanitizeInput('category', INPUT_POST);
		$category = preg_replace($pat, '', $category);
		$element = $elxis->sanitizeInput('element', INPUT_POST);
		$element = preg_replace($pat, '', $element);
		$elid = (isset($_POST['elid'])) ? (int)$_POST['elid'] : 0;
		if ($elid < 0) { $elid = 0; }

		if (($category == '') || ($category != $_POST['category'])) {
			echo '<div class="elx5_error">Translation element Category is invalid!</div>';
			return;
		}
		if (($element == '') || ($element != $_POST['element'])) {
			echo '<div class="elx5_error">Translation element Element is invalid!</div>';
			return;
		}
		if ($elid == 0) {
			echo '<div class="elx5_error">'.$eLang->get('FIRST_SAVE_ORIG').'</div>';
			return;
		}

		if (preg_match('/^(com\_)/i', $category)) {
			$component = strtolower($category);
			if ($elxis->acl()->check('component', $component, 'manage') < 1) {
				echo '<div class="elx5_error">You are not allowed to manage component '.$component.'</div>';
				return;
			}
		}

		if ($category == 'module') {
			if (preg_match('/^(mod\_)/i', $element)) {
				$module = strtolower($element);
				if ($elxis->acl()->check('module', $module, 'manage', $elid) < 1) {
					echo '<div class="elx5_error">You are not allowed to edit '.$module.' with instance '.$elid.'!</div>';
					return;
				}
			}
		}

		//save translations
		$sitelangs = $eLang->getSiteLangs(false);
		$translations = array('translation' => array());
		foreach ($sitelangs as $lng) {
			if ($lng == $elxis->getConfig('LANG')) { continue; }
			$idx = 'translation_'.$lng;
			//if ($is_text) {
			//	$translations['translation'][$lng] = filter_input(INPUT_POST, $idx, FILTER_UNSAFE_RAW);
			//} else {
				$translations['translation'][$lng] = eUTF::trim($elxis->sanitizeInput($idx, INPUT_POST, true, false));
			//}
		}

		$elxis->obj('translations')->saveElementTranslations($category, $element, $elid, $translations['translation']);

		echo '<div class="elx5_info">'.$eLang->get('TRANS_SAVED').'</div>';
	}


	/********************/
	/* SAVE TRANSLATION */
	/********************/
	public function savetranslation($is_text=false) {//Elxis 4.x compatibility
		$eLang = eFactory::getLang();
		$elxis = eFactory::getElxis();

		$trid = isset($_POST['trid']) ? (int)$_POST['trid'] : 0;
		if ($trid < 0) { $trid = 0; }
		
		$row = new translationsDbTable();
		if ($trid > 0) {
			if (!$row->load($trid)) {
				$this->view->apiError($eLang->get('TRANS_NOT_FOUND'));
				return;
			}
		}

		$pat = '#[^a-zA-Z0-9\_\-]#';
		$category = $elxis->sanitizeInput('category', INPUT_POST);
		$category = preg_replace($pat, '', $category);
		$element = $elxis->sanitizeInput('element', INPUT_POST);
		$element = preg_replace($pat, '', $element);
		$elid = (isset($_POST['elid'])) ? (int)$_POST['elid'] : 0;
		if ($elid < 0) { $elid = 0; }
		$language = $elxis->sanitizeInput('language', INPUT_POST);
		$language = preg_replace($pat, '', $language);
		if ($language != '') {
			if (!file_exists(ELXIS_PATH.'/language/'.$language.'/'.$language.'.php')) { $language = ''; }
		}

		if (($category == '') || ($category != $_POST['category'])) {
			$this->view->apiError('Translation element Category is invalid!');
			return;
		}
		if (($element == '') || ($element != $_POST['element'])) {
			$this->view->apiError('Translation element Element is invalid!');
			return;
		}
		if ($elid == 0) {
			$this->view->apiError($eLang->get('FIRST_SAVE_ORIG'));
			return;
		}
		if (($language == '') || ($language != $_POST['language'])) {
			$this->view->apiError('Translation element Language is invalid!');
			return;
		}

		if ($is_text) {
			$translation = filter_input(INPUT_POST, 'translation', FILTER_UNSAFE_RAW);
		} else {
			$translation = eUTF::trim($elxis->sanitizeInput('translation', INPUT_POST, true, false));
		}
		if ($translation == '') {
			$this->view->apiError($eLang->get('PROVIDE_TRANS'));
			return;
		}

		if ($trid > 0) {
			if (($category != $row->category) || ($element != $row->element) || ($language != $row->language) || ($elid != $row->elid)) {
				$this->view->apiError('Saved translation data do not match the provided ones!');
				return;
			}
		} else {
			$row->category = $category;
			$row->element = $element;
			$row->language = $language;
			$row->elid = $elid;
		}

		$row->translation = $translation;

		if (preg_match('/^(com\_)/i', $category)) {
			$component = strtolower($category);
			if ($elxis->acl()->check('component', $component, 'manage') < 1) {
				$this->view->apiError('You are not allowed to manage component '.$component);
				return;
			}
		}

		if ($category == 'module') {
			if (preg_match('/^(mod\_)/i', $element)) {
				$module = strtolower($element);
				if ($elxis->acl()->check('module', $module, 'manage', $elid) < 1) {
					$this->view->apiError('You are not allowed to edit '.$module.' with instance '.$elid.'!');
					return;
				}
			}
		}

		if (!$row->store()) {
			$this->view->apiError($eLang->get('TRANS_CNOT_SAVE'));
			return;
		}

		$this->view->saveResponse($row->trid, $eLang->get('TRANS_SAVED'));
	}


	/******************************/
	/* SAVE LONG TEXT TRANSLATION */
	/******************************/
	public function savettranslation() {//Elxis 4.x compatibility
		$this->savetranslation(true);
	}


	/**********************/
	/* DELETE TRANSLATION */
	/**********************/
	public function deletetranslation() {//Elxis 4.x compatibility
		$elxis = eFactory::getElxis();
		$eLang = eFactory::getLang();

		$trid = isset($_POST['trid']) ? (int)$_POST['trid'] : 0;
		if ($trid < 0) { $trid = 0; }
		if ($trid == 0) {
			$this->view->deleteResponse($eLang->get('TRANS_DELETED'));
			return;
		}

		$row = new translationsDbTable();
		if (!$row->load($trid)) {
			$this->view->apiError($eLang->get('TRANS_NOT_FOUND'));
			return;
		}

		$category = $elxis->sanitizeInput('category', INPUT_POST);
		$element = $elxis->sanitizeInput('element', INPUT_POST);
		$elid = (isset($_POST['elid'])) ? (int)$_POST['elid'] : 0;
		$language = $elxis->sanitizeInput('language', INPUT_POST);
		if ($category != $row->category) {
			$this->view->apiError('Option category does not match the saved one!');
			return;
		}
		if ($element != $row->element) {
			$this->view->apiError('Option element does not match the saved one!');
			return;
		}
		if ($elid != $row->elid) {
			$this->view->apiError('Option elid does not match the saved one!');
			return;
		}
		if ($language != $row->language) {
			$this->view->apiError('Option language does not match the saved one!');
			return;
		}

		if (preg_match('/^(com\_)/i', $row->category)) {
			$component = strtolower($row->category);
			if ($elxis->acl()->check('component', $component, 'manage') < 1) {
				$this->view->apiError('You are not allowed to manage component '.$component);
				return;
			}
		}

		if ($row->category == 'module') {
			if (preg_match('/^(mod\_)/i', $row->element)) {
				$module = strtolower($row->element);
				if ($elxis->acl()->check('module', $module, 'manage', $row->elid) < 1) {
					$this->view->apiError('You are not allowed to edit '.$module.' with instance '.$row->elid.'!');
					return;
				}
			}
		}

		if (!$row->delete()) {
			$this->view->apiError($eLang->get('ACTION_FAILED'));
			return;
		}

		$this->view->deleteResponse($eLang->get('TRANS_DELETED'));
	}


	/***************/
	/* BAD REQUEST */
	/***************/
	public function badrequest() {
		$this->view->apiError('Bad request!');
	}

}
	
?>