<?php
/**
 * Page class
 * 
 * Povides methods related to page module
 * 
 * @package linea21\modules\page
 * @author $Author$ - Simon Georget <simon@linea21.com>
 * @version $Id$ 
 * @access public
 * @license http://opensource.org/licenses/gpl-3.0.html
 * Page Management
 */

class page {
  /* @param
   * */
  public $TDB_PAGE = T_PAGE; // nom de la table.
  public $ID;
  public $TITLE;
  public $HEADER;
  public $BODY;
  public $IS_HOMEPAGE;
  public $POSTED_BY;
  public $POST_DATE;
  public $PUBLISHED_DATE;
  public $STATUS;
  protected $dispatcher = null;


  public function __construct()
  {
    $this->dispatcher = $GLOBALS['dispatcher'];
  }

  public function __call($method, $arguments)
  {
    $event = $this->dispatcher->notifyUntil(new sfEvent($this, 'page.extensible_function', array(
      'method'    => $method,
      'arguments' => $arguments
    )));
    if (!$event->isProcessed())
    {
      throw new Exception(sprintf('Call to undefined method %s::%s.', get_class($this), $method));
    }

    return $event->getReturnValue();
  }


  /**
   * _getDate()
   * date courante et ajout
   *
   * @access private
   * @param int $m chiffre des mois
   * @param int $d chiffre des jours
   * @param int $y chiffre des années
   * @return string $format_date
   * @return
   */
  private function _getDate($m = 0, $d = 0, $y = 0)
  {
    $format_date = mktime(date("H"), date("i"), date("s"), date("m") + $m, date("d") , date("Y"));
    $format_date = strftime('%Y-%m-%d %H:%M:%S', $format_date);

    return $format_date;
  }


  /**
   * checkDataIntegrity()
   * Vérification intégrité des données
   *
   * @access public
   * @param array $array : contient les composants nécessaires d'une page
   * @return boolean true
   * si verifié, sinon string 'message d'erreur'
   */

  public function checkDataIntegrity($array)
  {

  	// Filter data event + return value
  	$r = $this->dispatcher->filter(new sfEvent($this, 'page.before_datacheck', array('data' => $array)), $array);
  	$array = $r->getReturnValue();

    if (strlen($array[0]) < 3) return _t('page','no_title');
    if (strlen($array[1]) < 3) return _t('page','no_header');
    if (strlen($array[2]) < 3) return _t('page','no_body');

    // Notify the beginning of the current method
  	$this->dispatcher->notify(new sfEvent($this, 'page.after_datacheck', array('data' => $array)));

    return true;
  }

  /**
   * addPage()
   * Ajout d'une page
   *
   * @access public
   * @param array $array : contient les composants d'une page
   * @param object $sql_object
   * @return integer $last_id
   */
  public function addPage($array, $sql_object)
  {

  	global $l21auth;
  	 
  	// Filter data event + return value
  	$r = $this->dispatcher->filter(new sfEvent($this, 'page.before_add', array('data' => $array)), $array);
  	$array = $r->getReturnValue();
  	
  	// image 64 encoded conversion if enabled before escaping content
  	$array[1] = convertBase64Images($array[1], 'page-');
  	$array[2] = convertBase64Images($array[2], 'page-');

    $array=$sql_object->DBescape($array);

    if ($array[0] != '') {
      $this->TITLE = strip_input(trim($array[0]), true);
    }
    if ($array[1] != '') {
      $this->HEADER = strip_input(trim($array[1]), true);
    }
    if ($array[2] != '') {
      $this->BODY = strip_input(trim($array[2]), true);
    }
    if (is_numeric($array[3])) {
      $this->POSTED_BY = $array[3];
    }
    if ($array[4] != '') {
      $this->STATUS = strtoupper($array[4]);
    }
    if ($array[5] != '') {
    	$this->IS_HOMEPAGE = $array[5];
    }
    if ($this->STATUS == 'P') {
      $this->PUBLISHED_DATE = $this->_getDate();
    } else {
      $this->PUBLISHED_DATE = '0001-01-01';
    }
    $q = "INSERT INTO " . $this->TDB_PAGE . " (page_parent_id, page_title, page_header, page_body, page_posted_by, page_published_date, page_status, page_date_crea) " . "VALUES(0, '" . $this->TITLE . "', '" . $this->HEADER . "', '" . $this->BODY . "', " . $this->POSTED_BY . ", '" . $this->PUBLISHED_DATE . "', '" . $this->STATUS . "', now());";

    $last_id = $sql_object->DBInsert ($q, 1);

    $this->ID = $last_id;
    
    // we log add action
    if(is_numeric($last_id))	logfile(LOG_MAINFILE, array('[action] add page', 'ID='.$last_id, 'by_id='.$l21auth->GetSessionElement('id'), 'by_login='.$l21auth->GetSessionElement('login')));

    $this->updateHomePage($sql_object);

    // Notify the end of the current method
    $this->dispatcher->notify(new sfEvent($this, 'page.after_add', array('data' => $array, 'id' => $last_id)));

    return $last_id;
  }

  /**
   * updateHomePage()
   * Met à jour la homepage
   *
   * @return boolean true
   */
  
  public function updateHomePage($sql_object)
  {

  	// Filter data event + return value
  	$r = $this->dispatcher->filter(new sfEvent($this, 'page.before_homepage_update', array('id' => $this->ID )), $this);
  	$array = $r->getReturnValue();
  	 

  	if($this->IS_HOMEPAGE == false)  {

  		// we update only the current record without modifying others
  		$q = "UPDATE " . $this->TDB_PAGE . " SET page_homepage = 'N' WHERE page_id = '" . $this->ID . "' ";
  		$sql_object->DBQuery($q);

  	}
  	 
  	if($this->IS_HOMEPAGE == true)  {

  		// first, we remove the current homepage
  		$q = "UPDATE " . $this->TDB_PAGE . " SET page_homepage = 'N'";
  		$r = $sql_object->DBQuery($q);

  		// and we set the new homepage with given ID
  		if($r) {
  			$q = "UPDATE " . $this->TDB_PAGE . " SET page_homepage = 'Y' WHERE page_id = '" . $this->ID . "' ";
  			$sql_object->DBQuery($q);
  		}
  	}

  	// Notify the beginning of the current method
  	$this->dispatcher->notify(new sfEvent($this, 'page.after_homepage_update', array('id' => $this->ID )));

  	return true;
  }


  /**
   * deletePage()
   * suppression d'une page
   *
   * @access public
   * @param int $ID : identifiant de la page
   * @param object $sql_object
   * @return bool $result
   */

  public function deletePage($ID, $sql_object)
  {
  	global $l21auth;
  	
  	// Notify the beginning of the current method
  	$this->dispatcher->notify(new sfEvent($this, 'page.delete', array('id' => $ID)));

    $this->ID = $ID;
    $q = "UPDATE  " . $this->TDB_PAGE . " set page_status='E', page_last_modify=NOW() WHERE page_id='" . $this->ID . "';";
    $result = $sql_object->DBQuery($q);
    
    // we log delete action
    if($result)	logfile(LOG_MAINFILE, array('[action] delete page', 'ID='.$ID, 'by_id='.$l21auth->GetSessionElement('id'), 'by_login='.$l21auth->GetSessionElement('login')));
     
    return $result;
  }

  /**
   * modifyPage()
   * modification d'une page
   *
   * @access public
   * @param integer $ID : identifiant de la page
   * @param object $sql_object
   * @param array $array : contient les composants d'une page
   * @return boolean $result
   */
  public function modifyPage($ID, $array, $sql_object)
  {

  	// Filter data event + return value
  	$r = $this->dispatcher->filter(new sfEvent($this, 'page.before_modify', array('data' => $array, 'id' => $ID)), $array);
  	$array = $r->getReturnValue();
  	
  	// image 64 encoded conversion if enabled before escaping content
  	$array[1] = convertBase64Images($array[1], 'page-');
  	$array[2] = convertBase64Images($array[2], 'page-');

    $array=$sql_object->DBescape($array);
    
    if (is_numeric($ID)) {
      $this->ID = $ID;
    }
    if ($array[0] != '') {
      $this->TITLE = strip_input(trim($array[0]), true);
    }
    if ($array[1] != '') {
      $this->HEADER = strip_input(trim($array[1]), true);
    }
    if ($array[2] != '') {
      $this->BODY = strip_input(trim($array[2]), true);
    }
    if (is_numeric($array[3])) {
      $this->POSTED_BY = $array[3];
    }
    if ($array[4] != '') {
      $this->STATUS = $array[4];
    }

    $mask = $this->_HavePublishedDate($array[5]);

    if ($array[6] != '') {
    	$this->IS_HOMEPAGE = $array[6];
    }

    $q = "UPDATE  " . $this->TDB_PAGE . " set page_title='" . $this->TITLE . "', page_header='" . $this->HEADER . "', page_body='" . $this->BODY . "' , page_posted_by=" . $this->POSTED_BY . ", page_status ='" . $this->STATUS . "', page_last_modify=NOW() " . $mask . " WHERE page_id='" . $this->ID . "';";
    $result = $sql_object->DBQuery($q);

    // we update the homepage
    $this->updateHomePage($sql_object);

    // Notify the end of the current method
    $this->dispatcher->notify(new sfEvent($this, 'page.after_modify', array('data' => $array, 'id' => $this->ID)));

    return $result;
  }


  /**
   * homepage_exists()
   * check if homepage exists
   *
   * @access public
   * @return bool
   */
  
  public function homepage_exists()
  {
  	global $sql_object;
  	
  	// Notify the beginning of the current method
  	$this->dispatcher->notify(new sfEvent($this, 'page.homepage_exists'));
  	 

  	$q = "SELECT * FROM  " . $this->TDB_PAGE . " WHERE page_homepage = 'Y' AND page_status='P';";
  	$r = $sql_object->DBSelect($q);

  	if(isset($r[0]))
  		return true;
  	else {
  		return false;
  	}
  	
  }

  /**
   * get_homepage_id()
   * return homepage_id
   *
   * @access public
   * @return int $ID : identifiant de la page
   */
  
  public function get_homepage_id()
  {
  	global $sql_object;
  
  	$q = "SELECT * FROM  " . $this->TDB_PAGE . " WHERE page_homepage = 'Y' AND page_status='P';";
  	$r = $sql_object->DBSelect($q);

  	if(isset($r[0])) return $r[0]['page_id'];

  	return false;  	
  }


  /**
   * _havePublishedDate()
   * Détermine la date de publication a inserer dans la bdd
   *
   * @access private
   * @param string $current_status : statut actuel de l'actualité
   * @return string $sql_mask
   */
  private function _havePublishedDate($current_status)
  {
    switch ($this->STATUS) {
      case 'P':
        if ($current_status == 'D') $sql_mask = ", page_published_date= NOW()";
        else $sql_mask = '';
        break;
      case 'D':
        $sql_mask = ", page_published_date= '0001-01-01'";
        break;
      default:
        $sql_mask = '';
    }
    return $sql_mask;
  }
}

?>