<?php
    
/**************************************/
/****     SuperSmash Framework     ****/
/****     Created By SuperSmash    ****/
/****     Started on: 25-04-2012   ****/
/**************************************/
use settings\settings;

if (!defined("SUPERSMASH_FRAMEWORK")){die("You cannot access this page directly!");}

    // This function will autoload the classes that are not yet included/loaded in the SuperSmash Framework
    function __autoload($className) 
    {
        // We will need to lowercase everything
        $parts = explode(DS, strtolower($className));

        // We need to remove the first part of the array (if the value is empty)  
        // (This can happen because you came from the root namespace)
        if (empty($parts[0]))
        { 
            array_shift($parts);
        };

        // Build the filePath
        
        $classPath = implode(DS, $parts);
        $classPath = str_replace('\\', DS, $classPath);        

        // We need to assign our filePath as the root (so php looks there when looking for files)
        $file = ROOT . DS . $classPath .'.php';

        $file = str_replace('supersmash', 'SuperSmash', $file);

        // If the file exists, then include it else show an error
        if (!file_exists($file))
        {
            // Failed to load the class we where looking for.
            showError('autoLoad', array(addslashes($className)), E_ERROR);
        }
        require_once($file);
    }

    // This function will handle all the errors that where given by PHP (this will be the default error handler)
    function errorHandler($errorNumber, $errorMessage, $errorFile, $errorLine) {
        if(!$errorNumber)
        {
            return;
        }
        
        // Get the debug instance
        $debug = loadClass('Debug');	
        
        // Trigger the error
        $debug->triggerError($errorNumber, $errorMessage, $errorFile, $errorLine, debug_backtrace());

        // Don't execute PHP internal error handler
        return true;
    }

    // This function will show the errorMessage
    function showError($errorMessage = 'none', $arguments = null, $level = E_ERROR) 
    {
        // Let get a backtrace for deep debugging
        $backtrace = debug_backtrace();
        $calling = $backtrace[0];
        
        $language = system\SuperSmash\SuperSmash::language();
        $message = $language->get($errorMessage);
        
        // Allow custom messages
        if(!$message) 
        {
            $message = $errorMessage;
        }
        
        // check if there are any arguments
        if(is_array($arguments)) 
        {
            // Add the arguments to the message
            $message = vsprintf($message, $arguments);
        }
        
        // Get the debug instance
        $debug = loadClass('Debug');

        // Add a break to the errorMessage
        $message = "<br>" . $message;

        // Trigger the error
        $debug->triggerError($level, $message, $calling['file'], $calling['line'], $backtrace);
    }

    // This function will show an 404 error page
    function show_404() 
    {
        // Get the debug instance
        $debug = loadClass('Debug');

        // Show the error
        $debug->showError(404);        
    }

    // This function will log a message to a specified filename log
    function logMessage($message, $filename = DEBUG) 
    {		
        // Get the debug instance
        $debug = loadClass('Debug');

        // Log the error
        $debug->log($message, $filename);
    }

    // This function returns an item of the configuration file
    function configuration($item, $type = 'SuperSmash') 
    {   
        // Get the config instance
        $configuration = loadClass('Configuration');

        // Return the specific item
        return $configuration->get($item, $type);
    }

    // This function will set an item in the configuration file
    function configurationSet($item, $value, $name = 'SuperSmash') 
    {
        // Get the config instance
        $configuration = loadClass('Configuration');	

         // Set the specific configuration item in the configuration file
        $configuration->set($item, $value, $name);
    }

    // This function will save a configuration to the configuration.php file
    function configurationSave($name) 
    {
        // Get the config instance
        $configuration = loadClass('Configuration');	
        
        // Save the configuration to the configuration.php file
        return $configuration->save($name);
    }

    // This function will load the specific configuration in the configuration.php
    function configurationLoad($file, $name, $array = false) 
    {	
        $configuration = loadClass('Configuration');
        $configuration->load($file, $name, $array);
    }

    // This function will get an instance of the controller
    function getInstance()
    {
        if (class_exists('application\\SuperSmash\\Controller', false)) 
        {
            return application\SuperSmash\Controller::getInstance();
        } 
        elseif (class_exists('system\\SuperSmash\\Controller', false)) 
        {
            return system\SuperSmash\Controller::getInstance();
        } 
        else 
        {
            return false;
        }
    }
    
    // This function will return the website URL and the URL information
    function getUrlInformation() 
    {
        return loadClass('Router')->getUrlInformation();
    }

    // This function will load a specific className
    function loadClass($className, $type = 'SuperSmash', $parameters = array()) 
    {
        // We need to create a className path for the correct class
        if(strpos($className, '\\') === false) 
        {
            $className = $type . DS . $className;
        }

        // We will need to lowercase everything
        $class = strtolower($className);

        // We will need to change the SuperSmash directory to its capital case
        $class = str_replace('supersmash', 'SuperSmash', $class);
        
        // Create a storageName for the class
        $store_name = str_replace('\\', '_', $class);

        // Check if the class exists in the registry
        $loaded = \system\SuperSmash\Registry::singleton()->load($store_name);
        if($loaded !== null) 
        {
            return $loaded;
        }

        // The class was not found in the registry so we need to look for the classFile ourself
        // Split the class path in parts
        $parts = explode('\\', $class);
        // Build our filepath
        $file = str_replace('\\', DS, implode('\\', $parts));

        // If we dont have the full path, we need to create it
        if($parts[0] !== 'system' && $parts[0] !== 'application') 
        {
            // Check for needed classes in the Application library folder
            if(file_exists(settings::getFilePath() . DS . settings::getApp() . DS . $file . '.php')) 
            {
                $file = settings::getFilePath() . DS . settings::getApp() . DS . $file .'.php';
                $className = DS . 'application' . DS .  $className;
            } 
            else 
            {
                $file = SYSTEM . DS . $file .'.php';
                $className = DS .'system' . DS . $className;
            }
        }
        else 
        {
            $file = ROOT . $file .'.php';
        }

        require_once ($file);

        if (!class_exists($className))
        {
            // We only want the className and dont need the parent paths
            if (strlen(strstr($className, DS . "system" . DS . "SuperSmash" . DS))>0) $className = str_replace(DS . "system" . DS . "SuperSmash" . DS, "", $className);                    

            // Check if the class needs parameters
            if (!empty($parameters))
            {
                try
                {
                    $newClass = new ReflectionClass($className);
                    $newClass = $newClass->newInstanceArgs($parameters);
                } 
                catch (Exception $exception)
                {
                    die("The class $className could not be loaded >>> <br/><br/> $exception");
                }           
            } 
            else 
            {
                    // Create an object of the new class
                    $newClass = '\system\\SuperSmash\\' . $className;
                    $newClass = new $newClass;
            }
        }

        // Store the new object in the registry
        \system\SuperSmash\Registry::singleton()->store($store_name, $newClass); 

        // return the new class.
        return $newClass;
    }

    // This function will redirect you to a specified URL after a specified waiting time
    function redirect($url, $wait = 0) 
    {
        // Check if the URL is valid. If not then add our current websiteURL to it.
        if(!preg_match('@^(mailto|ftp|http(s)?)://@i', $url)) 
        {
            $websiteURL = getUrlInformation();
            $url = $websiteURL['websiteURL'] .'/'. $url;
        }

        // Check if we need to wait a few seconds before we can redirect the user
        if($wait >= 1) 
        {
            header("Refresh:". $wait .";url=". $url);
        } 
        else 
        {
            header("Location: ".$url);
            die();
        }
    }
?>