<?php
/**
* This file is part of the easy-CMS project.
* easy-CMS is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* 
* easy-CMS is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
* 
* You should have received a copy of the GNU General Public License
* along with easy-CMS; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/
	
include_once('classes/core/parser/tags/Tag.class.php');
include_once('classes/core/Site.class.php');

/**
* Tag element.
*
* @access   public
* @author	Cedric Francoys <cedric.francoys@easy-cms.org>
* @version	ContainerControlsTag.class, Mon Jan 03 22:36:25 CET 2005
* @package	Tags
*/
class ContainerControlsTag extends Tag {

	/**
	* Constructor
	*
	* @access   public
 	* @param    string  The complete tag syntax (i.e. : <tagname attr1="value1" attr2="value2">, <br />, </a>, ...)
 	* @param    integer The position of the tag in the xml document
 	* @return   void
	*/
	function ContainerControlsTag($tagString, $name, $type, $offset, $length){
		parent::Tag($tagString, $name, $type, $offset, $length);
	}

	/**
	* Performs actions specific to the tag
	*
	* @access   public
 	* @return   bool Returns the HTML part corresponding to the container.
	*/
	function evaluate(){
		$frameId = &$this->page->getPageFrameId();

		$dbManipulator = &$this->site->getDBManipulator();

		$templatesManager  = &$this->site->getTemplatesManager();
		$containersManager = &$this->site->getContainersManager();

		$isStatic           = $this->getAttribute('static', 0);
		$containerSortField	= $this->getAttribute('sortfield', 'index');
		$frameContainerName	= $this->getAttribute('id');
		$containerTemplate	= $this->getAttribute('template');
		$containerType			= $this->getAttribute('type');
		
    if($frameContainerName == null || $containerTemplate == null || $containerType == null) {
      return '';
    }

		$langId = $this->site->getPersistentVar('lid', $this->site->getDefaultLangId());

		if ($isStatic == null || $isStatic == '0' || $isStatic == 'no' || $isStatic == 'NO') {
			$isStatic = false;
		}
		else {
			$isStatic = true;
		}

		$pageId = $this->page->getPageId();

		$cond  = '`container_name`='.$dbManipulator->quoteSmart($frameContainerName);
		$cond .= ' and `page_id`='.$dbManipulator->quoteSmart($this->page->getPageId());

		$res = $dbManipulator->getRecord(FRAME_CONTAINERS_TABLE, $frameId, $cond, 'frame_id');

		if (!$res) {
			$this->debug('ContainerControlsTag::evaluate, error : unable to read database for Frame(id='.$frameId.')', 3);
			return '';
		}

    $needReload = true;
    
    if (($row = $dbManipulator->fetchArray($res))) {
    	$containerId = $row['container_id'];
      if(is_null($container = &$containersManager->getContainer($containerId))) {
        // remove container_id from frame list
        $dbManipulator->removeFrameContainer($frameId, $this->page->getPageId(), $containerId, $frameContainerName);
      }
      else {
        $needReload = false;
      }
    }
    else {
      $container = null;
    }

    if (!$container) {
    	//container does not exist
    	//either a static container or a new one
      	$this->debug("Frame.getHTML, notice : non-existent container.", 5);

      	if($isStatic){
        	$this->debug("Frame.getHTML, notice : static container, trying to obtain reference to a previously created container.", 5);
        	// search for a container id of any page of the same frame with identical name
					if(($cloneId = $dbManipulator->getStaticContainerId($frameId, $frameContainerName)) <= 0){
            $cloneId = 0;
						$this->debug("Frame.getHTML, warning : unable to get any static container '$frameContainerName' for frame '".$frameId." : requesting a new container'.", 3);
					}
      	}

    		$this->debug("ContainerTag.evaluate, notice : creating a new container.", 5);
				// create a new container
				$containerId = 0;
				$typeName = $containerType;
				$sortField = $containerSortField;
				$templateId = $dbManipulator->getTemplateId($containerTemplate, $typeName);
				$aclId = $this->page->getPageAclId();
				$container = &$containersManager->getNewContainer($aclId);
				$container->setContainerName($frameContainerName, $langId);
				$container->setContainerTypeName($containerType);
				$container->setContainerSortField($sortField);
				$container->setContainerTemplateId($templateId);
				$container->setContainerCloneId($cloneId);
				$containersManager->addContainer($container);
				$containersManager->loadContainerTemplate($containerId);
				$containersManager->loadContainerAcl($containerId);
				$containerId = $containersManager->storeContainer($containerId);
				$dbManipulator->addFrameContainer($frameId, $this->page->getPageId(), $containerId, $frameContainerName);
    }
    
    if (is_null(($container = $containersManager->getContainer($containerId, true, $needReload)))) {
    	$this->debug("Frame.getHTML, error : unable to get container '$frameContainerName' for frame '$frameId'.", 2);
			return '';
    }

		$this->debug('ContainerTag::evaluate, success : Container(id='.$containerId.') evaluated', 10);
		return $container->getControls($this->user, $this->mode);
	}
}
?>