<?php

    set_include_path( get_include_path() . PATH_SEPARATOR
            . $_SERVER['DOCUMENT_ROOT'] . PATH_SEPARATOR
            . $_SERVER['DOCUMENT_ROOT'] . "/classes/" . PATH_SEPARATOR
            . $_SERVER['DOCUMENT_ROOT'] . "/libs/" );

    require_once 'Zend/Loader/Autoloader.php';
    $autoloader = Zend_Loader_Autoloader::getInstance();

    $autoloader->registerNamespace('Gd_');
    $autoloader->pushAutoloader( new Gd_Loader() );

    // Чтение конфигурации
    require_once "Gd/Config.php";
    $Config = Gd_Config::getInstance();
    $Config->addValuesFromFile( 'config/config.ini' );
    $Config->addValuesFromFile( 'config/config_main.ini' );

    require_once('Zend/Session.php');
    Zend_Session::start();

    setlocale( LC_ALL, "ru_RU.UTF-8" );
    ini_set('mbstring.internal_encoding', 'UTF-8');
    ini_set('mbstring.http_input', 'auto');

    // Инициализация обработчика ошибок
    require_once "Gd/Error.php";

    // Шаблонизатор
    require_once 'Gd/Template.php';
    $Template = Gd_Template::getInstance();
    $Template->assign('_config', $Config['firm']);

    try
    {
        // Парсинг строки запроса
        require_once 'Gd/Router.php';
        $Router = Gd_Router::getInstance();

        // Подключение к базе данных
        require_once "Gd/Dbsql.php";

        Gd_Dbsql::setConnection( $Config['db']['server'], $Config['db']['user'], $Config['db']['password'], $Config['db']['name']);

        if ( isset($Config['db']['prefix_table']) )
        {
            Gd_Dbsql::setTablePrefix($Config['db']['prefix_table']);
        }

        // Включение лога ошибок
        require_once 'Gd/Logger.php';
        Gd_Logger::setFilename( 'media/logs/log.txt' );
        Gd_Dbsql::getInstance()->setLogging( true );

        // Путь хранения изображений в свободном доступе
        require_once 'Gd/Images.php';
        Gd_Images::setDefaultPathToFiles( $Config['path']['picture'], $Config['path']['small_picture']);

        // Дополнительные модули
        require_once "Gd/Path.php";
        require_once "Gd/Meta.php";

        // Подготовка данных
        $filename = $Router->getCurrentFile();

        if ( $filename !== false )
        {
            include $filename;
        }

        // Проверка запроса на наличие статичной страницы
        else
        {
            if ( $Router->getModule() == $Router->getDefaultModule() )
            {
                $filename = $Router->getCurrentFile( null, 'static', 'index', 'inc' );

                if ($filename) include $filename;
                else throw new Gd_Exception_Nopage();
            }
            else
                throw new Gd_Exception_Nopage();
        }
    }

    // Страница не найдена
    catch (Gd_Exception_Nopage $e)
    {
        include ( Gd_Router::MODULES_DIR . DIRECTORY_SEPARATOR
                . $Router->getDefaultModule() . DIRECTORY_SEPARATOR
                . Gd_Router::CONTROLLERS_DIR . DIRECTORY_SEPARATOR
                . 'error' . DIRECTORY_SEPARATOR . '404.php');

    }

    // Отсутсвует соединение с БД
    catch (Gd_Exception_Nodbconnection $e)
    {
        include ( Gd_Router::MODULES_DIR . DIRECTORY_SEPARATOR
                . $Router->getDefaultModule() . DIRECTORY_SEPARATOR
                . Gd_Router::CONTROLLERS_DIR . DIRECTORY_SEPARATOR
                . 'error' . DIRECTORY_SEPARATOR . 'nodbconn.inc');
    }

    // Отсутсвует БД
    catch (Gd_Exception_Nodbtable $e)
    {
        include ( Gd_Router::MODULES_DIR . DIRECTORY_SEPARATOR
                . $Router->getDefaultModule() . DIRECTORY_SEPARATOR
                . Gd_Router::CONTROLLERS_DIR . DIRECTORY_SEPARATOR
                . 'error' . DIRECTORY_SEPARATOR . 'nodbtable.inc');
    }

    // Системная ошибка
    catch (Gd_Exception_System $e)
    {
        $Logger = Gd_Logger::getInstance();
        $Logger->addMessage(
            sprintf("%s - %d: %s (%s)", $e->getFile(), $e->getLine(),
                                        $e->getMessage(), $e->getTraceAsString() )
        );
    }

    // Вывод содержимого страницы
    $Template->render();