<?php
class Library_Controller extends Zend_Controller_Action {
	/**
	 * Reprezentace tabulky uzivatelu
	 * @var Application_Model_Users
	 */
	protected $_tableUsers;
	
	/**
	 * Zaznam o uzivateli v databazi
	 * @var Zend_Db_Table_Row_Abstract
	 */
	protected $_user;
	
	public function init() {
		//vytvoreni tabulky uzivatelu
		$this->_tableUsers = new Application_Model_Users();
		
		//vytvoreni instance session
		$session = new Zend_Session_Namespace("system");
		
		//kontorla jestli uzivatel existuje, pokud ne, zavede se neprihlaseny
		if (!isset($session->user) && !isset($_COOKIE["_mlc"])) {
			//uzivatel neexistuje
			$this->_initUnsignedUser($session);
		} elseif (isset($_COOKIE["_mlc"])) {
			$user = $this->_tableUsers->fetchRow($this->_tableUsers->getAdapter()->quoteInto("cookie like ?", $_COOKIE["_mlc"]));
			
			if (!$user) {
				$this->_initUnsignedUser($session);
			} else {
				$session->user = $user;
			}
		}
		
		//zapsani a oziveni zaznamu
		$this->_user = $session->user;
		$this->_user->setTable($this->_tableUsers);
		
		//kontorla cookie
		if (strcmp($this->_user->cookie, $_COOKIE["_mlc"])) {
			$this->_redirect("/index/index");
			return;
		}
		
		//definovani konstanty pristupu k obsahum souboru
		if (!defined("CONTENT_PATH"))
			define("CONTENT_PATH", APPLICATION_PATH . "/../contents");
		
		Zend_Registry::set("_user", $this->_user);
	}
	
	/**
	 * nacte neprihlaseneho uzivatele do session
	 * @param Zend_Session_Namespace $session objekt session
	 */
	private function _initUnsignedUser(Zend_Session_Namespace $session) {
		$guest = $this->_tableUsers->find(2)->current();
		
		if (!$guest) {
			//informace o neprihlasenem uzivateli nebyla nalezena, vyhodi se vyjimka
			throw new Exception("The guest user not found in table of users");
		}
		
		$session->user = $guest;
	}
	
	/**
	 * naprasuje pozadavek na objekt
	 * @param string $actionName retezec jmena akce ze Zend aplikace
	 * @return array
	 */
	protected function _parseActionName($actionName) {
		$response = array(
			"id" => "",
			"objectName" => "",
			"format" => ""
		);
		
		//kontorla jeslti se jedna skutecne o akci
		if ('Action' != substr($actionName, -6)) {
			//jmeno akce nekonci na Action, nejedna se tedy o akci
			return $response;
		}
		
		//prochazeni retezcem jmena akce a hledani velkych pismen nebo podtrzitka
		$i = -1;
		$length = strlen($actionName);
		$found = false;
		
		//odstraneni akce a odebrani sesti pozic
		$actionName = substr($actionName, 0, $length - 6);
		
		$length -= 6;
		
		do {
			//inkrementace iteratoru
			$i++;
			
			//konotrla na velke pismenu a na podtrzitko
			$ord = ord($actionName[$i]);
			
			$found = ($ord > 64) && ($ord < 91) || ($ord == 95);
		} while (($i + 1) < $length && !$found);
		
		//kontorla $found
		if (!$found) {
			//zadny hledany znak nebyl nazelen, akce obsahuje pouze id objektu
			$response["id"] = $actionName;
			
			return $response;
		}
		
		//zapsani id objketu
		$response["id"] = substr($actionName, 0, $i);
		
		//vyhodnoceni nalezeneho znaku
		if ($ord == 95) {
			//nalezeny znak je podtrzitko, probehne hledani prvniho velkeho pismene
			$start = $i + 1;
			$found = false;
			
			do {
				//inkrementace iteratoru
				$i++;
				
				//konotrla na velke pismeno
				$ord = ord($actionName[$i]);
				
				$found = ($ord > 64) && ($ord < 91);
			} while (($i + 1) < $length && !$found);
			
			//kontrola jeslti bylo velke pismeno nalezeno
			if (!$found) {
				//velke pismeno nebylo nalezeno, zapise se jmeno objketu a vrati se vysledek
				$response["objectName"] = substr($actionName, $start);
				
				return $response;
			}
			
			//velke pismeno bylo nalezeno, zapise se jmeno objektu a formatu
			$response["objectName"] = substr($actionName, $start, $i - $start);
		}
		
		$response["format"] = strtolower(substr($actionName, $i));
		
		return $response;
	}
	
	protected function _sendToRender(Library_Response $response, $format, $baseName) {
		//zapsani do view
		$this->view->response = $response;
		$response->sendHeader();
		
		if ($format != "html") {
			$this->_helper->layout()->disableLayout();
		}
		
		//vyhodnoceni formatu
		switch ($format) {
			case "html":
				$this->_helper->viewRenderer($baseName . "-html");
				break;
			
			case "json":
			
			default:
				$this->_helper->viewRenderer($baseName . "-json");
		}
	}
}
?>
