Your IP : 216.73.216.85


Current Path : /home/smartconb/www/armencom33/administrator/components/com_falang/models/
Upload File :
Current File : /home/smartconb/www/armencom33/administrator/components/com_falang/models/ContentObject.php

<?php
/**
 * @package     Falang for Joomla!
 * @author      Stéphane Bouey <stephane.bouey@faboba.com> - http://www.faboba.com
 * @license     GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 * @copyright   Copyright (C) 2010-2023. Faboba.com All rights reserved.
 */

// No direct access to this file
defined('_JEXEC') or die;

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Filter\OutputFilter;
use Joomla\Registry\Registry;
use Joomla\CMS\Table\Table;
use Joomla\String\StringHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;

include_once(dirname(__FILE__) . DS . "FalangContent.php");

class ContentObject
{
	/** @var _contentElement Reference to the ContentElement definition of the instance */
	var $_contentElement;

	/** @var id ID of the based content */
	var $id;

	/** @var translation_id    translation id value */
	var $translation_id = 0;

	/** @var checked_out User who checked out this content if any */
	var $checked_out;

	/** @var title Title of the object; used from the field configured as titletext */
	var $title;

	/** @var titleTranslation the actual translation of the title */
	var $titleTranslation;

	/** @var language_id language for the translation */
	var $language_id;

	/** @var language Language name of the content */
	var $language;

	/** @var lastchanged Date when the translation was last modified */
	var $lastchanged;

	/** @var modified_date Date of the last modification of the content - if existing */
	var $modified_date;

	/** @var state State of the translation
	 * -1 := for at least one field of the content the translation is missing
	 *  0 := the translation exists but the original content was changed
	 *  1 := the translation is valid
	 */
	var $state = -1;

	/** @var int Number of changed fields */
	var $_numChangedFields = 0;
	/** @var int Number of new fields, with an original other than NULL */
	var $_numNewAndNotNullFields = 0;
	/** @var int Number for fields unchanged */
	var $_numUnchangedFields = 0;

	/** published Flag if the translation is published or not */
	var $published = false;

    /** Standard constructor
	 *
	 * @param    languageID        ID of the associated language
	 * @param    elementTable      Reference to the ContentElementTable object
	 */
	public function __construct($languageID, & $contentElement, $id = -1)
	{
		$db = Factory::getDBO();

		if ($id > 0) $this->id = $id;
		$this->language_id = $languageID;
		// active languages are cached in FalangManager - use these if possible
		$jfManager = FalangManager::getInstance();
		if (isset($jfManager) && $jfManager->activeLanguagesCacheByID && array_key_exists($languageID, $jfManager->activeLanguagesCacheByID))
		{
			$lang = $jfManager->activeLanguagesCacheByID[$languageID];
		}
		else
		{
			$lang = new TableJFLanguage($db);
			$lang->load($languageID);
		}
		$this->language        = $lang->title;
		$this->_contentElement = $contentElement;
	}

	/** Loads the information based on a certain content ID
	 *   return true if loaded
	 */
	function loadFromContentID($id = null)
	{
		$db = Factory::getDBO();
		if ($id != null && isset($this->_contentElement) && $this->_contentElement !== false)
		{
			$db->setQuery($this->_contentElement->createContentSQL($this->language_id, $id));
			$row      = null;
			$row      = $db->loadObject();
			$this->id = $id;
			//fix bug in quickjump when item in joomla is set to a specific language and not all
			if (isset($row))
			{
				$this->readFromRow($row);

				return true;
			}

			return false;
		}

		return false;
	}

	/** Reads the information from the values of the form
	 * The content element will be loaded first and then the values of the override
	 * what is actually in the element
     *
     * @update 4.0.4 published switcher send on
     * @update 4.8 add $skip_params
	 *
	 * @param    array      The values which should be bound to the object
	 * @param    string     The field prefix
	 * @param    string     An optional field
	 * @param    boolean    try to bind the values to the object
	 * @param    boolean    store original values too
     * @skip_params    boolean    don't save param's
     *
	 */
	function bind($formArray, $prefix = "", $suffix = "", $tryBind = true, $storeOriginalText = false, $skip_params = false)
	{
		$user   = Factory::getUser();
		$db     = Factory::getDBO();
		$jinput = Factory::getApplication()->input;

		if ($tryBind)
		{
			$this->_jfBindArrayToObject($formArray, $this);
		}
        //since 4.0.4 use a checkbox (no more radio)//value on is forced in the edit page
        $this->published = $this->published == "on" ?1:0;

		// Go thru all the fields of the element and try to copy the content values
		$elementTable = $this->_contentElement->getTable();

		for ($i = 0; $i < count($elementTable->Fields); $i++)
		{
			$field     = $elementTable->Fields[$i];
			$fieldName = $field->Name;
			if (isset($formArray[$prefix . "refField_" . $fieldName . $suffix]))
			{

				$formArray[$prefix . "refField_" . $fieldName . $suffix] = $jinput->post->get($prefix . "refField_" . $fieldName . $suffix, '', 'RAW');
				$formArray[$prefix . "origText_" . $fieldName . $suffix] = $jinput->post->get($prefix . "origText_" . $fieldName . $suffix, '', 'RAW');

				$translationValue = $formArray[$prefix . "refField_" . $fieldName . $suffix];
				$fieldContent     = new falangContent($db);

				// code cleaner for xhtml transitional compliance
				if ($field->Type == 'titletext' || $field->Type == 'text')
				{
					jimport('joomla.filter.output');
					//$translationValue = JFilterOutput::ampReplace( $translationValue );
				}
				if ($field->Type == 'htmltext')
				{
					$translationValue = str_replace('<br>', '<br />', $translationValue);

					// remove <br /> take being automatically added to empty fulltext
					$length = strlen($translationValue) < 9;
					$search = strstr($translationValue, '<br />');
					if ($length && $search)
					{
						$translationValue = null;
					}
				}

				if ($field->posthandler != "")
				{
					if (method_exists($this, $field->posthandler))
					{
						$handler = $field->posthandler;
						$this->$handler($translationValue, $elementTable->Fields, $formArray, $prefix, $suffix, $storeOriginalText);
					}
				}

				$originalValue = $formArray[$prefix . "origValue_" . $fieldName . $suffix];
				$originalText  = ($storeOriginalText) ? $formArray[$prefix . "origText_" . $fieldName . $suffix] : "";
				//sbou4 quand content est vide on a "" et non 0 ou l'id pour une nouvelle traduction
				$fieldContent->id              = intval($formArray[$prefix . "id_" . $fieldName . $suffix]);
				$fieldContent->reference_id    = (intval($formArray[$prefix . "reference_id" . $suffix]) > 0) ? intval($formArray[$prefix . "reference_id" . $suffix]) : $this->id;
				$fieldContent->language_id     = $this->language_id;
				$fieldContent->reference_table = $db->escape($elementTable->Name);
				$fieldContent->reference_field = $db->escape($fieldName);
				$fieldContent->value           = $translationValue;
				// original value will be already md5 encoded - based on that any encoding isn't needed!
				$fieldContent->original_value = $originalValue;
				$fieldContent->original_text  = !is_null($originalText) ? $originalText : "";

				$fieldContent->modified = Factory::getDate()->toSql();

				$fieldContent->modified_by = $user->id;
				$fieldContent->published   = $this->published;
				$field->translationContent = $fieldContent;

			}
			else if ($field->Type == "params" && isset($formArray["jform"][$field->Name]))
			{
			    //don't store the param's if requested
			    if ($skip_params){
			        //get id of the param's field
                    $paramsid = intval($formArray[$prefix . "id_" . $fieldName . $suffix]);
                    //delete previous param's if exist
                    if (isset($paramsid)){
                        $fieldContent                  = new falangContent($db);
                        $fieldContent->delete($paramsid);
                    }
    		        continue;
			    }

				$translationValue = $formArray["jform"][$field->Name];

				if ($field->posthandler != "")
				{
					if (method_exists($this, $field->posthandler))
					{
						$handler = $field->posthandler;
						$this->$handler($translationValue, $elementTable->Fields, $formArray, $prefix, $suffix, $storeOriginalText);
					}
				}
				$originalValue = $formArray[$prefix . "origValue_" . $fieldName . $suffix];
				//v2.8.3 store orginal text is set in param's
				$originalText = ($storeOriginalText) ? $formArray[$prefix . "origText_" . $fieldName . $suffix] : "";

				$registry = new Registry();
				$registry->loadArray($translationValue);
				$translationValue = $registry->toString();

				$fieldContent                  = new falangContent($db);
				//sbou4
				$fieldContent->id              = intval($formArray[$prefix . "id_" . $fieldName . $suffix]);
				$fieldContent->reference_id    = (intval($formArray[$prefix . "reference_id" . $suffix]) > 0) ? intval($formArray[$prefix . "reference_id" . $suffix]) : $this->id;
				$fieldContent->language_id     = $this->language_id;
				$fieldContent->reference_table = $db->escape($elementTable->Name);
				$fieldContent->reference_field = $db->escape($fieldName);
				$fieldContent->value           = $translationValue;
				$fieldContent->original_value  = $originalValue;
				$fieldContent->original_text   = !is_null($originalText) ? $originalText : "";

				$fieldContent->modified = Factory::getDate()->toSql();

				$fieldContent->modified_by = $user->id;
				$fieldContent->published   = $this->published;
				$field->translationContent = $fieldContent;

			}
		}
	}

	public function saveMenuPath(&$path, $fields, $formArray, $prefix, $suffix, $storeOriginalText)
	{
		$pathfield = false;
		$alias     = false;
		$ref       = false;
		foreach ($fields as $field)
		{
			if ($field->Name == "path")
			{
				$pathfield = $field;
			}
			if ($field->Name == "alias")
			{
				$alias = $field;
			}
			if ($field->Name == "id")
			{
				$ref = $field;
			}
		}
		if (!$pathfield || !$ref || !$alias)
		{
			return;
		}
		//$path = $alias->translationContent->value;
		//return;

		$table = Table::getInstance("Menu");
		// TODO get this from the translation!
		$pk = (intval($formArray[$prefix . "reference_id" . $suffix]) > 0) ? intval($formArray[$prefix . "reference_id" . $suffix]) : $this->id;

		$table->load($pk);
		$langid = $alias->translationContent->language_id;
		// Get the path from the node to the root (translated)
		$db     = Factory::getDBO();
		$query  = $db->getQuery(true);
		$select = 'p.*, jfc.value as jfcvalue';
		$query->select($select);
		$query->from('#__menu AS n, #__menu AS p');
		$query->join('left', "#__falang_content as jfc ON jfc.reference_table='menu' AND jfc.reference_id=p.id AND jfc.language_id='$langid' and jfc.reference_field='alias' ");
		$query->where('n.lft BETWEEN p.lft AND p.rgt');
		$query->where('n.id = ' . (int) $pk);
		$query->where('p.client_id = 0');
		$query->order('p.lft');

		$db->setQuery($query);
		$sql       = (string) $db->getQuery();
		$pathNodes = $db->loadObjectList('', 'stdClass', false);

		$segments = array();
		foreach ($pathNodes as $node)
		{
			// Don't include root in path
			if ($node->alias != 'root')
			{
				//we don't use the alias stored for this translation only the alias posted.
				if (isset($node->jfcvalue) && ($node->id != $pk))
				{
					$segments[] = $node->jfcvalue;
				}
				else
				{
					//use the alias value from post directly and not the node alias if not empty
					if (($node->id == $pk) && !empty($alias->translationContent->value))
					{
						$segments[] = $alias->translationContent->value;
					}
					else
					{
						$segments[] = $node->alias;
					}
				}
			}
		}
		$newPath = trim(implode('/', $segments), ' /\\');
		$path    = $newPath;
	}

	function filterTitle(&$alias)
	{
		$app     = Factory::getApplication();
		$jinput = $app->input;
		if ($alias == "")
		{
			$alias = $jinput->get("refField_title", null, 'STR');
		}
		$version = new FalangVersion();
		if ($app->getCfg('unicodeslugs') == 1 && $version != 'free')
		{
			$alias = OutputFilter::stringURLUnicodeSlug($alias);
		}
		else
		{
			$alias = OutputFilter::stringURLSafe($alias);
		}
	}

    /*
     * @update 5.0 empty alias is no more null remove deprected
     * */
	function filterName(&$alias)
	{
		$app     = Factory::getApplication();
		$jinput = $app->input;
		if ($alias == "")
		{
			$alias = $jinput->get("refField_name",'','STR');
		}
		$version = new FalangVersion();
		if ($app->getCfg('unicodeslugs') == 1 && $version != 'free')
		{
			$alias = OutputFilter::stringURLUnicodeSlug($alias);
		}
		else
		{
			$alias = OutputFilter::stringURLSafe($alias);
		}
	}

	public function saveUrlParams(&$link, $fields, $formarray)
	{
		// Check for the special 'request' entry.
		$data = $formarray["jform"];
		if (isset($formarray['refField_link']) && isset($data['request']) && is_array($data['request']) && !empty($data['request']))
		{
			// Parse the submitted link arguments.
			$args = array();
			parse_str(parse_url($formarray['refField_link'], PHP_URL_QUERY), $args);

			// Merge in the user supplied request arguments.
			$args = array_merge($args, $data['request']);

			//2.9.0
			//remove args without value (See on CB)
			//2.9.6 exept for virtuemart
			foreach ($args as $key => $val)
			{
				if ($key == 'virtuemart_category_id')
				{
					continue;
				}
				if (empty($val))
				{
					unset($args[$key]);
				}
			}

			$link = 'index.php?' . urldecode(http_build_query($args, '', '&'));
		}

	}


	/**
	 * Special pre translation handler for content text to combine intro and full text
	 *
	 * @param unknown_type $row
	 */
	function fetchArticleText($row)
	{

		/*
		 * We need to unify the introtext and fulltext fields and have the
		 * fields separated by the {readmore} tag, so lets do that now.
		 */
		if (StringHelper::strlen($row->fulltext) > 1)
		{
			return $row->introtext . "<hr id=\"system-readmore\" />" . $row->fulltext;
		}
		else
		{
			return $row->introtext;
		}

	}

	/**
	 * Special pre translation handler for content text to combine intro and full text
	 *
	 * @param unknown_type $row
	 */
	function fetchArticleTranslation($field, &$translationFields)
	{

		if (is_null($translationFields)) return;
		/*
		 * We need to unify the introtext and fulltext fields and have the
		 * fields separated by the {readmore} tag, so lets do that now.
		 */
		if (array_key_exists("fulltext", $translationFields))
		{
			if (isset($translationFields["introtext"]))
			{
				$fulltext  = $translationFields["fulltext"]->value;
				$introtext = $translationFields["introtext"]->value;
			}
			else
			{
				$translationFields["introtext"]       = clone $translationFields["fulltext"];
				$translationFields["fulltext"]->value = "";
				$fulltext                             = "";
			}
			if (StringHelper::strlen($fulltext) > 1)
			{
				$translationFields["introtext"]->value = $introtext . "<hr id=\"system-readmore\" />" . $fulltext;
				$translationFields["fulltext"]->value  = "";
			}
		}

		//v2.8.3
		$contentParms = ComponentHelper::getParams('com_content');
		if ($contentParms->get('show_urls_images_backend', 0))
		{
			if (array_key_exists("images", $translationFields))
			{
				$registry = new Registry;
				$registry->loadString($translationFields['attribs']->value);
				$registry->loadString($translationFields['images']->value);
				$translationFields['attribs']->value = $registry->toString();
			}
			if (array_key_exists("urls", $translationFields))
			{
				$registry = new Registry;
				$registry->loadString($translationFields['attribs']->value);
				$registry->loadString($translationFields['urls']->value);
				$translationFields['attribs']->value = $registry->toString();
			}
		}

	}


	/**
	 * Special post translation handler for content text to split intro and full text
	 *
	 * @param unknown_type $row
	 */
	function saveArticleText(&$introtext, $fields, &$formArray, $prefix, $suffix, $storeOriginalText)
	{
		$app     = Factory::getApplication();
		$jinput = $app->input;

		// Search for the {readmore} tag and split the text up accordingly.
		$pattern = '#<hr\s+id=("|\')system-readmore("|\')\s*\/*>#i';
		$tagPos  = preg_match($pattern, $introtext);

		if ($tagPos > 0)
		{
			list($introtext, $fulltext) = preg_split($pattern, $introtext, 2);
			$jinput->post->set($prefix . "refField_fulltext" . $suffix, $fulltext);
			$formArray[$prefix . "refField_fulltext" . $suffix] = $fulltext;
		}
		else
		{
			$jinput->post->set($prefix . "refField_fulltext" . $suffix, "");
			$formArray[$prefix . "refField_fulltext" . $suffix] = "";
		}

	}

	function saveArticleImagesAndUrls(&$introtext, $fields, &$formArray, $prefix, $suffix, $storeOriginalText)
	{
		$app     = Factory::getApplication();
		$jinput = $app->input;
		//save images in hidden field
		if (isset($formArray["jform"]['images']))
		{
			$imagesValue = $formArray["jform"]['images'];
			$registry    = new Registry();
			$registry->loadArray($imagesValue);
			$translationImagesValue = $registry->toString();
			$jinput->post->set($prefix . "refField_images" . $suffix, $translationImagesValue);
		}

		//save url's in hidden field
		if (isset($formArray["jform"]['urls']))
		{
			$urlsValue = $formArray["jform"]['urls'];
			$registry  = new Registry();
			$registry->loadArray($urlsValue);
			$translationUrlsValue = $registry->toString();
			$jinput->post->set($prefix . "refField_urls" . $suffix, $translationUrlsValue);
		}
		//reset default value of attribs before save (remove image and link)
		// this allow a the state saved correctly
		if (isset($formArray["jform"]['attribs']))
		{
			//we can't use dta from $formArray["jform"]['attribs'] it's the modified data from falang translation.
			//use orginal and remvoe images and url if exit to strore the original attribs
			$attribsData = json_decode($formArray['origText_attribs'], true);
			if (isset($formArray['origText_images']))
			{
				$imagesData = json_decode($formArray['origText_images'], true);
				foreach ($imagesData as $key => $value)
				{
					if (array_key_exists($key, $attribsData))
					{
						unset($attribsData[$key]);
					}
				}
			}
			if (isset($formArray['origText_urls']))
			{
				$urlsData = json_decode($formArray['origText_urls'], true);
				foreach ($urlsData as $key => $value)
				{
					if (array_key_exists($key, $attribsData))
					{
						unset($attribsData[$key]);
					}
				}
			}
			//remove url
			$registry = new Registry;
			$registry->loadArray($attribsData);
			if ($storeOriginalText)
			{
				$formArray['origText_attribs'] = $registry->toString();
			}
			$formArray['origValue_attribs'] = md5($registry->toString());
		}
	}


	/** Reads the information out of an existing mosDBTable object into the contentObject.
	 *
	 * @param    object    instance of an mosDBTable object
	 */
	function updateMLContent(&$dbObject)
	{
		$db = Factory::getDBO();
		if ($dbObject === null) return;

		if ($this->published == "") $this->published = 0;

		// retriev the original untranslated object for references
		// this MUST be copied by value and not by reference!
		$origObject = clone($dbObject);
		$key        = $dbObject->get('_tbl_key');
		$db->setQuery("SELECT * FROM " . $dbObject->get('_tbl') . " WHERE " . $key . "='" . $dbObject->$key . "'");
		$origObject = $db->loadObject(false);

		$this->copyContentToTranslation($dbObject, $origObject);
	}

	/**
	 * This method copies a currect database object into the translations
	 * The original object might be the same kind of object and it is not required that
	 * both objects are of the type mosDBTable!
	 *
	 * @param object $dbObject   new values for the translation
	 * @param object $origObject original values based on the db for reference
	 */
	function copyContentToTranslation(&$dbObject, $origObject)
	{
		$user = Factory::getUser();

		// Go thru all the fields of the element and try to copy the content values
		$elementTable = $this->_contentElement->getTable();

		for ($i = 0; $i < count($elementTable->Fields); $i++)
		{
			$field     = $elementTable->Fields[$i];
			$fieldName = $field->Name;
			if (isset($dbObject->$fieldName) && $field->Translate)
			{
				$translationValue = $dbObject->$fieldName;
				$fieldContent     = $field->translationContent;

				$fieldContent->value = $translationValue;
				//change in 1.4.1
				//sbou : use for frontend edition not erase value modified
				//$dbObject->$fieldName = $origObject->$fieldName;
				//fin sbou
				$fieldContent->original_value = md5($origObject->$fieldName);
				// ToDo: Add handling of original text!

				$datenow                =& Factory::getDate();
				$fieldContent->modified = $datenow->toSql();

				$fieldContent->modified_by = $user->id;

				//v1.4.1
				// make sure reference_id is set if not already set
				if ((!isset($fieldContent->reference_id) || is_null($fieldContent->reference_id) || $fieldContent->reference_id == 0) && (isset($origObject->id) && $origObject->id > 0))
				{
					$fieldContent->reference_id = $origObject->id;
				}
			}
		}
	}

	/**
     *
     * @from 1.0
     * Reads some of the information from the overview row
	 */
	function readFromRow($row)
	{
		$db = Factory::getDBO();

		$this->id               = $row->id;
		$this->translation_id   = $row->jfc_id;
		$this->title            = $row->title;
		$this->titleTranslation = $row->titleTranslation;

		if (!isset($this->language_id) || $this->language_id == -1)
		{
			$this->language_id = $row->language_id;
			$this->language    = $row->language;
		}
		$this->lastchanged = $row->lastchanged;
		$this->published   = $row->published;
		if (isset($row->modified_date)) $this->modified_date = $row->modified_date;
		if (isset($row->checked_out)) $this->checked_out = $row->checked_out;

		// Go thru all the fields of the element and try to copy the content values
		$elementTable = $this->_contentElement->getTable();
		$fieldContent = new falangContent($db);
		for ($i = 0; $i < count($elementTable->Fields); $i++)
		{
			$field     = $elementTable->Fields[$i];
			$fieldName = $field->Name;
			if (isset($row->$fieldName))
			{
				$field->originalValue = $row->$fieldName;

				if ($field->prehandleroriginal != "")
				{
					if (method_exists($this, $field->prehandleroriginal))
					{
						$handler              = $field->prehandleroriginal;
						$field->originalValue = $this->$handler($row);
					}
				}

			}
		}


		$this->_loadContent();
	}

	/** Reads all translation information from the database
	 *
	 */
	function _loadContent()
	{
		$db  = Factory::getDBO();
		$app = Factory::getApplication();

		$elementTable = $this->getTable();
		$sql          = "select * "
			. "\n  from #__falang_content"
			. "\n where reference_id='" . $this->id . "'"
			. "\n   and reference_table='" . $elementTable->Name . "'";
		if (isset($this->language_id) && $this->language_id != "")
		{
			$sql .= "\n   and language_id=" . $this->language_id;
		}

		try
		{
			$db->setQuery($sql);
			$rows = $db->loadObjectList();
		}
		catch (Exception $e)
		{
			$app->enqueueMessage(Text::_($e->getMessage()), 'error');
		}
//		if($db->getErrorNum() != 0) {
//			JError::raiseWarning( 400,Text::_('No valid table information: ') .$db->getErrorMsg());
//		}

		$translationFields = null;
		if (count($rows) > 0)
		{
			foreach ($rows as $row)
			{
				$fieldContent = new falangContent($db);
				if (!$fieldContent->bind($row))
				{
					JError::raiseWarning(200, Text::_('Problems binding object to fields: ' . $fieldContent->getError()));
				}
				$translationFields[$fieldContent->reference_field] = $fieldContent;
			}
		}

		// Check fields and their state
		for ($i = 0; $i < count($elementTable->Fields); $i++)
		{
			$field = $elementTable->Fields[$i];

			if ($field->prehandlertranslation != "")
			{
				if (method_exists($this, $field->prehandlertranslation))
				{
					$handler = $field->prehandlertranslation;
					$this->$handler($field, $translationFields);
				}
			}

			if (isset($translationFields[$field->Name]))
			{
				$fieldContent = $translationFields[$field->Name];
			}
			else
			{
				$fieldContent = null;
			}

			if ($field->Translate)
			{

				if (isset($fieldContent))
				{
					$field->changed = (md5($field->originalValue) != $fieldContent->original_value);
					if ($field->changed)
					{
						$this->_numChangedFields++;
					}
					else $this->_numUnchangedFields++;
				}
				else
				{
					$fieldContent                  = new falangContent($db);
					$fieldContent->reference_id    = $this->id;
					$fieldContent->reference_table = $elementTable->Name;
					$fieldContent->reference_field = $field->Name;
					$fieldContent->language_id     = $this->language_id;

					$fieldContent->original_value = $field->originalValue;
					$field->changed               = false;
					if ($field->originalValue != '')
					{
						$this->_numNewAndNotNullFields++;
					}
				}
			}
			$field->translationContent = $fieldContent;
		}

		// Checking the record state based on the fields. If one field is changed the record is modifed
		if ($this->_numChangedFields == 0 && $this->_numNewAndNotNullFields == 0)
		{
			$this->state = 1;
		}
		elseif ($this->_numChangedFields == 0 && $this->_numNewAndNotNullFields > 0 && $this->_numUnchangedFields == 0)
		{
			$this->state = -1;
		}
		else
		{
			$this->state = 0;
		}
	}

	/** Returns the content element fields which are text and can be translated
	 *
	 * @param    boolean    onle translateable fields?
	 *
	 * @return    array    of fieldnames
	 */
	function getTextFields($translation = true)
	{
		$elementTable = $this->_contentElement->getTable();
		$textFields   = null;

		for ($i = 0; $i < count($elementTable->Fields); $i++)
		{
			$field     = $elementTable->Fields[$i];
			$fieldType = $field->Type;
			if ($field->Translate == $translation && ($fieldType == "htmltext" || $fieldType == "text"))
			{
				$textFields[] = $field->Name;
			}
		}

		return $textFields;
	}

	/**
	 * Returns the field type of a field
	 *
	 * @param string $fieldname
	 */
	function getFieldType($fieldname)
	{
		$elementTable = $this->_contentElement->getTable();
		$textFields   = null;

		for ($i = 0; $i < count($elementTable->Fields); $i++)
		{
			if ($elementTable->Fields[$i]->Name == $fieldname) return $elementTable->Fields[$i]->Type;
		}

		return "text";
	}

	/** Sets all fields of this content object to a certain published state
	 */
	function setPublished($published)
	{
		$elementTable = $this->_contentElement->getTable();
		for ($i = 0; $i < count($elementTable->Fields); $i++)
		{
			$field        = $elementTable->Fields[$i];
			$fieldContent = $field->translationContent;
			//s:sbou v1.4.5
			//$fieldContent->published = $published;
			if (isset($fieldContent))
			{
				$fieldContent->published = $published;
			}
			//e:sbou
		}
	}

	/** Updates the reference id of all included fields. This
	 * Happens e.g when the reference object was created new
	 *
	 * @param    referenceID        new reference id
	 */
	function updateReferenceID($referenceID)
	{
		if (intval($referenceID) <= 0) return;

		$elementTable = $this->_contentElement->getTable();
		for ($i = 0; $i < count($elementTable->Fields); $i++)
		{
			$field                      = $elementTable->Fields[$i];
			$fieldContent               = $field->translationContent;
			$fieldContent->reference_id = $referenceID;
		}
	}

	/** Stores all fields of the content element
	 */
	function store()
	{
		$elementTable = $this->_contentElement->getTable();
		for ($i = 0; $i < count($elementTable->Fields); $i++)
		{
			$field        = $elementTable->Fields[$i];
			$fieldContent = $field->translationContent;

			if ($field->Translate)
			{
				if (isset($fieldContent->reference_id))
				{
					if (isset($fieldContent->value) && $fieldContent->value != '')
					{
						$fieldContent->store(true);
					}
					// special case to handle readmore in original when there is none in the translation
					else if (isset($fieldContent->value) &&
						$fieldContent->reference_table == "content" &&
						($fieldContent->reference_field == "fulltext" || $fieldContent->reference_field == "introtext")
					)
					{
						$fieldContent->store(true);
					}
					else
					{
						//delete only if id key is set
						if (!empty($fieldContent->id))
							$fieldContent->delete();
					}
				}
			}
		}
	}

	/** Checkouts all fields of this content element
	 */
	function checkout($who, $oid = null)
	{
		$elementTable = $this->_contentElement->getTable();
		for ($i = 0; $i < count($elementTable->Fields); $i++)
		{
			$field        = $elementTable->Fields[$i];
			$fieldContent = $field->translationContent;

			if ($field->Translate)
			{
				if (isset($fieldContent->reference_id))
				{
					$fieldContent->checkout($who, $oid);
					JError::raiseWarning(200, Text::_('Problems binding object to fields: ' . $fieldContent->getError()));
				}
			}
		}
	}

	/** Checkouts all fields of this content element
	 */
	function checkin($oid = null)
	{
		$elementTable = $this->_contentElement->getTable();
		for ($i = 0; $i < count($elementTable->Fields); $i++)
		{
			$field        = $elementTable->Fields[$i];
			$fieldContent = $field->translationContent;

			if ($field->Translate)
			{
				if (isset($fieldContent->reference_id))
				{
					$fieldContent->checkin($oid);
					JError::raiseWarning(200, Text::_('Problems binding object to fields: ' . $fieldContent->getError()));
				}
			}
		}
	}

	/** Delets all translations (fields) of this content element
	 */
	function delete($oid = null)
	{
		$elementTable = $this->_contentElement->getTable();
		for ($i = 0; $i < count($elementTable->Fields); $i++)
		{
			$field        = $elementTable->Fields[$i];
			$fieldContent = $field->translationContent;
			if ($field->Translate)
			{
				if (isset($fieldContent->reference_id))
				{
					if (!$fieldContent->delete($oid))
					{
						echo $fieldContent->getError() . "<br />";
					}
				}
			}
		}
	}

	/** Returns the content element table this content is based on
	 */
	function getTable()
	{
		return $this->_contentElement->getTable();
	}


	/**
	 * Temporary legacy function copied from Joomla
	 *
	 * @param unknown_type $array
	 * @param unknown_type $obj
	 * @param unknown_type $ignore
	 * @param unknown_type $prefix
	 *
	 * @return unknown
	 */
	function _jfBindArrayToObject($array, &$obj, $ignore = '', $prefix = null)
	{
		if (!is_array($array) || !is_object($obj))
		{
			return (false);
		}

		foreach (get_object_vars($obj) as $k => $v)
		{
			if (substr($k, 0, 1) != '_')
			{
				// internal attributes of an object are ignored
				if (strpos($ignore, $k) === false)
				{
					if ($prefix)
					{
						$ak = $prefix . $k;
					}
					else
					{
						$ak = $k;
					}
					if (isset($array[$ak]))
					{
						$obj->$k = $array[$ak];
					}
				}
			}
		}

		return true;
	}

}