/**
     * @param MMApplicationLibrary $app
     * @param string $path
     * @return MMApplicationLibrary
     */
    public static function initFull( $app, $path )
    {
        $applicationNameFull   = substr($path, 1);
        $applicationLocalized  = CacheApplicationTool::buildLocalizedApplication($applicationNameFull);

        if ( !($applicationLocalized instanceof ApplicationLocalized) )
        {
            $errorUri = '/error';
            return ApplicationFactory::fetchByUri( $errorUri );
        }

        $app->_applicationFull = $applicationLocalized->applicationObject();

        if($app->_applicationFull)
            $app->isFull = true;

        return $app;
    }
    /**
     * @return string
     */
    public function backUrl()
    {
        $baseUrl    = eZINI::instance()->variable( 'SiteAccessSettings', 'BaseUrl' );
        $serverUrl  = $this->domain();
        $backUrl    = $serverUrl.$baseUrl;

        if( isset( $_SERVER['HTTP_REFERER'] ) && $this->checkRedirectUrl( $_SERVER['HTTP_REFERER'] ) )
        {
            $skipPage   = false;
            $noFullView = false;

            //if we are redirecting to an app we need to check app url if it is external page skipping exit page.
            $appUrl = str_replace($backUrl, '', $_SERVER['HTTP_REFERER']);
            $firstSlashPos = strpos($appUrl, '/');
            if ( $firstSlashPos )
            {
                $appUrl = substr($appUrl, 0, $firstSlashPos);
            }
            $localApp = CacheApplicationTool::buildLocalizedApplication($appUrl);
            if ( $localApp instanceof ApplicationLocalized )
            {
                $skipPage   = $localApp->getCustomParameter( 'SkipExitPage' );
                $noFullView = $localApp->getCustomParameter( 'NoFullView' );
            }

            if ( $skipPage && !$noFullView )
            {
                $backUrl .= 'external/' . $appUrl;
            }
            elseif(!$noFullView)
            {
                $backUrl = $_SERVER['HTTP_REFERER'];
            }
        }

        return $backUrl;
    }
    /**
     * @return eZTemplate
     */
    public function tpl()
    {
        if(is_null($this->_tpl))
        {
            eZTemplate::resetInstance();
            $this->_tpl = eZTemplate::factory();

            if (SolrSafeOperatorHelper::featureIsActive('showMedicalNewsDemo') && SolrSafeOperatorHelper::feature('ShowMedicalNewsDemo', 'showDemo')){
                $showMedicalNewsDemo = true;
                
            }else {
                $showMedicalNewsDemo = false;
            }
            
            $this->_tpl->setVariable('showMedicalNewsDemo',$showMedicalNewsDemo);
            
            $this->_tpl->setVariable('language'          , LocaleTool::languageISO639Code());
            $this->_tpl->setVariable('application_class' , get_class($this) );
            $this->_tpl->setVariable('view_parameters'   , $this->_params['UserParameters']);
            $this->_tpl->setVariable('cluster_identifier', ClusterTool::clusterIdentifier());
            $this->_tpl->setVariable('application_url'   , $this->applicationName());
            $this->_tpl->setVariable('consult'           , $this->isConsult);
            $this->_tpl->setVariable('httpcontext'       , array(
                'host'  => ContextTool::instance()->domain(),
            ));

            $environment = new MMEnvironment();
            $this->_tpl->setVariable('environment'       , $environment->env);

            $applicationLocalized = CacheApplicationTool::buildLocalizedApplication($this->applicationName());

            if (empty($applicationLocalized))
                $this->_tpl->setVariable('application_name'  , $this->applicationName());
            else
            {
                $applicationIdentifier = $applicationLocalized->applicationObject->attribute('identifier');

                $this->_tpl->setVariable('application_name' , $applicationIdentifier );
                $this->_tpl->setVariable('current_localized' , $applicationLocalized );
                $this->_tpl->setVariable('current_application' , $applicationLocalized->applicationObject );
            }
        }

        return $this->_tpl;
    }
    /**
     * @param array $params
     * @param string $outputType
     * @param string $blockName
     * @param string $applicationName
     * @return ApplicationDefault
     */
    static public function extendedFactory( $params, $outputType, $blockName, $applicationName )
    {
        $applicationClasses   = self::getApplicationClasses();
        $applicationType      = false;
        $applicationObject    = false;
        $applicationLocalized = false;

        if ( !is_null($applicationName) )
        {
            if ( $applicationName == 'page' )
            {
                // Fetches page name as well
                $applicationUrl       = $applicationName . '/' . $params['Parameters'][2];
                $applicationLocalized = CacheApplicationTool::buildLocalizedApplication($applicationUrl);

                if ( !$applicationLocalized instanceof applicationLocalized )
                    $applicationLocalized = CacheApplicationTool::buildLocalizedApplication($applicationName);
            }
            else
                $applicationLocalized = CacheApplicationTool::buildLocalizedApplication($applicationName);

            $applicationObject = $applicationLocalized instanceof applicationLocalized ? $applicationLocalized->applicationObject : null;

            if ( !is_null($applicationObject) )
                $applicationType = $applicationObject->applicationType->attribute('type_identifier');
        }

        if ( is_null($applicationName) || !$applicationType )
        {
            $errorUri = '/error';
            $app      = self::fetchByUri( $errorUri );

            return $app;
        }

        $className = $applicationClasses[$applicationType];

        /* @var $app ApplicationDefault */
        $app          = new $className( $params, $outputType, $blockName, $applicationName, $applicationObject, $applicationLocalized );
        $regexPattern = '#^/'.$params['ModuleName'].'/'.$params['FunctionName'].'/'.$blockName.'/'.$applicationName.'(?<path>/[^?]+)#';

        /* @type $app ApplicationDefault */
        if( $applicationName != 'default' && preg_match( $regexPattern , $_SERVER['REQUEST_URI'], $m ) )
            $app = $className::initFull($app, $m['path']);
        elseif ( $applicationName != 'default' )
        {
            if ( $app->hasHomepage($app) )
                $app->setStatus('homepage');
            else
                $app->setStatus('list');
        }

        if($app->node)
        {
            header('x-ez-node: ' . 'P' . $app->node->attribute('node_id') . 'P');
        }
        elseif( isset($app->rootNodeIds) && is_array($app->rootNodeIds) && count($app->rootNodeIds) > 0 )
        {
            $rootNodeIds = $app->rootNodeIds;
            if ( isset( $app->rootNodeIds[0] ) && is_array( $app->rootNodeIds[0] ) ) {
                $rootNodeIds = $app->rootNodeIds[0];
            }
            header('x-ez-node: ' . 'P'.implode('PP', $rootNodeIds).'P');
        }

        ApplicationDefault::setInstance($app);

        return $app;
    }