converted to unix-style eol
[www-register-wizard.git] / libraries / Loader.php
index da8d9e7..b58cc7d 100644 (file)
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
-/**\r
- * CodeIgniter\r
- *\r
- * An open source application development framework for PHP 4.3.2 or newer\r
- *\r
- * @package            CodeIgniter\r
- * @author             ExpressionEngine Dev Team\r
- * @copyright  Copyright (c) 2008, EllisLab, Inc.\r
- * @license            http://codeigniter.com/user_guide/license.html\r
- * @link               http://codeigniter.com\r
- * @since              Version 1.0\r
- * @filesource\r
- */\r
-\r
-// ------------------------------------------------------------------------\r
-\r
-/**\r
- * Loader Class\r
- *\r
- * Loads views and files\r
- *\r
- * @package            CodeIgniter\r
- * @subpackage Libraries\r
- * @author             ExpressionEngine Dev Team\r
- * @category   Loader\r
- * @link               http://codeigniter.com/user_guide/libraries/loader.html\r
- */\r
-class CI_Loader {\r
-\r
-       // All these are set automatically. Don't mess with them.\r
-       var $_ci_ob_level;\r
-       var $_ci_view_path              = '';\r
-       var $_ci_is_php5                = FALSE;\r
-       var $_ci_is_instance    = FALSE; // Whether we should use $this or $CI =& get_instance()\r
-       var $_ci_cached_vars    = array();\r
-       var $_ci_classes                = array();\r
-       var $_ci_loaded_files   = array();\r
-       var $_ci_models                 = array();\r
-       var $_ci_helpers                = array();\r
-       var $_ci_plugins                = array();\r
-       var $_ci_varmap                 = array('unit_test' => 'unit', 'user_agent' => 'agent');\r
-       \r
-\r
-       /**\r
-        * Constructor\r
-        *\r
-        * Sets the path to the view files and gets the initial output buffering level\r
-        *\r
-        * @access      public\r
-        */\r
-       function CI_Loader()\r
-       {       \r
-               $this->_ci_is_php5 = (floor(phpversion()) >= 5) ? TRUE : FALSE;\r
-               $this->_ci_view_path = APPPATH.'views/';\r
-               $this->_ci_ob_level  = ob_get_level();\r
-                               \r
-               log_message('debug', "Loader Class Initialized");\r
-       }\r
-       \r
-       // --------------------------------------------------------------------\r
-       \r
-       /**\r
-        * Class Loader\r
-        *\r
-        * This function lets users load and instantiate classes.\r
-        * It is designed to be called from a user's app controllers.\r
-        *\r
-        * @access      public\r
-        * @param       string  the name of the class\r
-        * @param       mixed   the optional parameters\r
-        * @param       string  an optional object name\r
-        * @return      void\r
-        */     \r
-       function library($library = '', $params = NULL, $object_name = NULL)\r
-       {\r
-               if ($library == '')\r
-               {\r
-                       return FALSE;\r
-               }\r
-\r
-               if ( ! is_null($params) AND ! is_array($params))\r
-               {\r
-                       $params = NULL;\r
-               }\r
-\r
-               if (is_array($library))\r
-               {\r
-                       foreach ($library as $class)\r
-                       {\r
-                               $this->_ci_load_class($class, $params, $object_name);\r
-                       }\r
-               }\r
-               else\r
-               {\r
-                       $this->_ci_load_class($library, $params, $object_name);\r
-               }\r
-               \r
-               $this->_ci_assign_to_models();\r
-       }\r
-\r
-       // --------------------------------------------------------------------\r
-       \r
-       /**\r
-        * Model Loader\r
-        *\r
-        * This function lets users load and instantiate models.\r
-        *\r
-        * @access      public\r
-        * @param       string  the name of the class\r
-        * @param       string  name for the model\r
-        * @param       bool    database connection\r
-        * @return      void\r
-        */     \r
-       function model($model, $name = '', $db_conn = FALSE)\r
-       {               \r
-               if (is_array($model))\r
-               {\r
-                       foreach($model as $babe)\r
-                       {\r
-                               $this->model($babe);    \r
-                       }\r
-                       return;\r
-               }\r
-\r
-               if ($model == '')\r
-               {\r
-                       return;\r
-               }\r
-       \r
-               // Is the model in a sub-folder? If so, parse out the filename and path.\r
-               if (strpos($model, '/') === FALSE)\r
-               {\r
-                       $path = '';\r
-               }\r
-               else\r
-               {\r
-                       $x = explode('/', $model);\r
-                       $model = end($x);                       \r
-                       unset($x[count($x)-1]);\r
-                       $path = implode('/', $x).'/';\r
-               }\r
-       \r
-               if ($name == '')\r
-               {\r
-                       $name = $model;\r
-               }\r
-               \r
-               if (in_array($name, $this->_ci_models, TRUE))\r
-               {\r
-                       return;\r
-               }\r
-               \r
-               $CI =& get_instance();\r
-               if (isset($CI->$name))\r
-               {\r
-                       show_error('The model name you are loading is the name of a resource that is already being used: '.$name);\r
-               }\r
-       \r
-               $model = strtolower($model);\r
-               \r
-               if ( ! file_exists(APPPATH.'models/'.$path.$model.EXT))\r
-               {\r
-                       show_error('Unable to locate the model you have specified: '.$model);\r
-               }\r
-                               \r
-               if ($db_conn !== FALSE AND ! class_exists('CI_DB'))\r
-               {\r
-                       if ($db_conn === TRUE)\r
-                               $db_conn = '';\r
-               \r
-                       $CI->load->database($db_conn, FALSE, TRUE);\r
-               }\r
-       \r
-               if ( ! class_exists('Model'))\r
-               {\r
-                       load_class('Model', FALSE);\r
-               }\r
-\r
-               require_once(APPPATH.'models/'.$path.$model.EXT);\r
-\r
-               $model = ucfirst($model);\r
-                               \r
-               $CI->$name = new $model();\r
-               $CI->$name->_assign_libraries();\r
-               \r
-               $this->_ci_models[] = $name;    \r
-       }\r
-               \r
-       // --------------------------------------------------------------------\r
-       \r
-       /**\r
-        * Database Loader\r
-        *\r
-        * @access      public\r
-        * @param       string  the DB credentials\r
-        * @param       bool    whether to return the DB object\r
-        * @param       bool    whether to enable active record (this allows us to override the config setting)\r
-        * @return      object\r
-        */     \r
-       function database($params = '', $return = FALSE, $active_record = FALSE)\r
-       {\r
-               // Grab the super object\r
-               $CI =& get_instance();\r
-               \r
-               // Do we even need to load the database class?\r
-               if (class_exists('CI_DB') AND $return == FALSE AND $active_record == FALSE AND isset($CI->db) AND is_object($CI->db))\r
-               {\r
-                       return FALSE;\r
-               }       \r
-       \r
-               require_once(BASEPATH.'database/DB'.EXT);\r
-\r
-               if ($return === TRUE)\r
-               {\r
-                       return DB($params, $active_record);\r
-               }\r
-               \r
-               // Initialize the db variable.  Needed to prevent   \r
-               // reference errors with some configurations\r
-               $CI->db = '';\r
-               \r
-               // Load the DB class\r
-               $CI->db =& DB($params, $active_record); \r
-               \r
-               // Assign the DB object to any existing models\r
-               $this->_ci_assign_to_models();\r
-       }\r
-       \r
-       // --------------------------------------------------------------------\r
-\r
-       /**\r
-        * Load the Utilities Class\r
-        *\r
-        * @access      public\r
-        * @return      string          \r
-        */             \r
-       function dbutil()\r
-       {\r
-               if ( ! class_exists('CI_DB'))\r
-               {\r
-                       $this->database();\r
-               }\r
-               \r
-               $CI =& get_instance();\r
-\r
-               // for backwards compatibility, load dbforge so we can extend dbutils off it\r
-               // this use is deprecated and strongly discouraged\r
-               $CI->load->dbforge();\r
-       \r
-               require_once(BASEPATH.'database/DB_utility'.EXT);\r
-               require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_utility'.EXT);\r
-               $class = 'CI_DB_'.$CI->db->dbdriver.'_utility';\r
-\r
-               $CI->dbutil =& new $class();\r
-\r
-               $CI->load->_ci_assign_to_models();\r
-       }\r
-       \r
-       // --------------------------------------------------------------------\r
-\r
-       /**\r
-        * Load the Database Forge Class\r
-        *\r
-        * @access      public\r
-        * @return      string          \r
-        */             \r
-       function dbforge()\r
-       {\r
-               if ( ! class_exists('CI_DB'))\r
-               {\r
-                       $this->database();\r
-               }\r
-               \r
-               $CI =& get_instance();\r
-       \r
-               require_once(BASEPATH.'database/DB_forge'.EXT);\r
-               require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_forge'.EXT);\r
-               $class = 'CI_DB_'.$CI->db->dbdriver.'_forge';\r
-\r
-               $CI->dbforge = new $class();\r
-               \r
-               $CI->load->_ci_assign_to_models();\r
-       }\r
-       \r
-       // --------------------------------------------------------------------\r
-       \r
-       /**\r
-        * Load View\r
-        *\r
-        * This function is used to load a "view" file.  It has three parameters:\r
-        *\r
-        * 1. The name of the "view" file to be included.\r
-        * 2. An associative array of data to be extracted for use in the view.\r
-        * 3. TRUE/FALSE - whether to return the data or load it.  In\r
-        * some cases it's advantageous to be able to return data so that\r
-        * a developer can process it in some way.\r
-        *\r
-        * @access      public\r
-        * @param       string\r
-        * @param       array\r
-        * @param       bool\r
-        * @return      void\r
-        */\r
-       function view($view, $vars = array(), $return = FALSE)\r
-       {\r
-               return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return));\r
-       }\r
-       \r
-       // --------------------------------------------------------------------\r
-       \r
-       /**\r
-        * Load File\r
-        *\r
-        * This is a generic file loader\r
-        *\r
-        * @access      public\r
-        * @param       string\r
-        * @param       bool\r
-        * @return      string\r
-        */\r
-       function file($path, $return = FALSE)\r
-       {\r
-               return $this->_ci_load(array('_ci_path' => $path, '_ci_return' => $return));\r
-       }\r
-       \r
-       // --------------------------------------------------------------------\r
-       \r
-       /**\r
-        * Set Variables\r
-        *\r
-        * Once variables are set they become available within\r
-        * the controller class and its "view" files.\r
-        *\r
-        * @access      public\r
-        * @param       array\r
-        * @return      void\r
-        */\r
-       function vars($vars = array(), $val = '')\r
-       {\r
-               if ($val != '' AND is_string($vars))\r
-               {\r
-                       $vars = array($vars => $val);\r
-               }\r
-       \r
-               $vars = $this->_ci_object_to_array($vars);\r
-       \r
-               if (is_array($vars) AND count($vars) > 0)\r
-               {\r
-                       foreach ($vars as $key => $val)\r
-                       {\r
-                               $this->_ci_cached_vars[$key] = $val;\r
-                       }\r
-               }\r
-       }\r
-       \r
-       // --------------------------------------------------------------------\r
-       \r
-       /**\r
-        * Load Helper\r
-        *\r
-        * This function loads the specified helper file.\r
-        *\r
-        * @access      public\r
-        * @param       mixed\r
-        * @return      void\r
-        */\r
-       function helper($helpers = array())\r
-       {\r
-               if ( ! is_array($helpers))\r
-               {\r
-                       $helpers = array($helpers);\r
-               }\r
-       \r
-               foreach ($helpers as $helper)\r
-               {               \r
-                       $helper = strtolower(str_replace(EXT, '', str_replace('_helper', '', $helper)).'_helper');\r
-\r
-                       if (isset($this->_ci_helpers[$helper]))\r
-                       {\r
-                               continue;\r
-                       }\r
-                       \r
-                       $ext_helper = APPPATH.'helpers/'.config_item('subclass_prefix').$helper.EXT;\r
-\r
-                       // Is this a helper extension request?                  \r
-                       if (file_exists($ext_helper))\r
-                       {\r
-                               $base_helper = BASEPATH.'helpers/'.$helper.EXT;\r
-                               \r
-                               if ( ! file_exists($base_helper))\r
-                               {\r
-                                       show_error('Unable to load the requested file: helpers/'.$helper.EXT);\r
-                               }\r
-                               \r
-                               include_once($ext_helper);\r
-                               include_once($base_helper);\r
-                       }\r
-                       elseif (file_exists(APPPATH.'helpers/'.$helper.EXT))\r
-                       { \r
-                               include_once(APPPATH.'helpers/'.$helper.EXT);\r
-                       }\r
-                       else\r
-                       {               \r
-                               if (file_exists(BASEPATH.'helpers/'.$helper.EXT))\r
-                               {\r
-                                       include_once(BASEPATH.'helpers/'.$helper.EXT);\r
-                               }\r
-                               else\r
-                               {\r
-                                       show_error('Unable to load the requested file: helpers/'.$helper.EXT);\r
-                               }\r
-                       }\r
-\r
-                       $this->_ci_helpers[$helper] = TRUE;\r
-                       log_message('debug', 'Helper loaded: '.$helper);        \r
-               }               \r
-       }\r
-       \r
-       // --------------------------------------------------------------------\r
-       \r
-       /**\r
-        * Load Helpers\r
-        *\r
-        * This is simply an alias to the above function in case the\r
-        * user has written the plural form of this function.\r
-        *\r
-        * @access      public\r
-        * @param       array\r
-        * @return      void\r
-        */\r
-       function helpers($helpers = array())\r
-       {\r
-               $this->helper($helpers);\r
-       }\r
-       \r
-       // --------------------------------------------------------------------\r
-       \r
-       /**\r
-        * Load Plugin\r
-        *\r
-        * This function loads the specified plugin.\r
-        *\r
-        * @access      public\r
-        * @param       array\r
-        * @return      void\r
-        */\r
-       function plugin($plugins = array())\r
-       {\r
-               if ( ! is_array($plugins))\r
-               {\r
-                       $plugins = array($plugins);\r
-               }\r
-       \r
-               foreach ($plugins as $plugin)\r
-               {       \r
-                       $plugin = strtolower(str_replace(EXT, '', str_replace('_pi', '', $plugin)).'_pi');              \r
-\r
-                       if (isset($this->_ci_plugins[$plugin]))\r
-                       {\r
-                               continue;\r
-                       }\r
-\r
-                       if (file_exists(APPPATH.'plugins/'.$plugin.EXT))\r
-                       {\r
-                               include_once(APPPATH.'plugins/'.$plugin.EXT);   \r
-                       }\r
-                       else\r
-                       {\r
-                               if (file_exists(BASEPATH.'plugins/'.$plugin.EXT))\r
-                               {\r
-                                       include_once(BASEPATH.'plugins/'.$plugin.EXT);  \r
-                               }\r
-                               else\r
-                               {\r
-                                       show_error('Unable to load the requested file: plugins/'.$plugin.EXT);\r
-                               }\r
-                       }\r
-                       \r
-                       $this->_ci_plugins[$plugin] = TRUE;\r
-                       log_message('debug', 'Plugin loaded: '.$plugin);\r
-               }               \r
-       }\r
-\r
-       // --------------------------------------------------------------------\r
-       \r
-       /**\r
-        * Load Plugins\r
-        *\r
-        * This is simply an alias to the above function in case the\r
-        * user has written the plural form of this function.\r
-        *\r
-        * @access      public\r
-        * @param       array\r
-        * @return      void\r
-        */\r
-       function plugins($plugins = array())\r
-       {\r
-               $this->plugin($plugins);\r
-       }\r
-               \r
-       // --------------------------------------------------------------------\r
-       \r
-       /**\r
-        * Loads a language file\r
-        *\r
-        * @access      public\r
-        * @param       array\r
-        * @param       string\r
-        * @return      void\r
-        */\r
-       function language($file = array(), $lang = '')\r
-       {\r
-               $CI =& get_instance();\r
-\r
-               if ( ! is_array($file))\r
-               {\r
-                       $file = array($file);\r
-               }\r
-\r
-               foreach ($file as $langfile)\r
-               {       \r
-                       $CI->lang->load($langfile, $lang);\r
-               }\r
-       }\r
-\r
-       /**\r
-        * Loads language files for scaffolding\r
-        *\r
-        * @access      public\r
-        * @param       string\r
-        * @return      arra\r
-        */\r
-       function scaffold_language($file = '', $lang = '', $return = FALSE)\r
-       {\r
-               $CI =& get_instance();\r
-               return $CI->lang->load($file, $lang, $return);\r
-       }\r
-       \r
-       // --------------------------------------------------------------------\r
-       \r
-       /**\r
-        * Loads a config file\r
-        *\r
-        * @access      public\r
-        * @param       string\r
-        * @return      void\r
-        */\r
-       function config($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)\r
-       {                       \r
-               $CI =& get_instance();\r
-               $CI->config->load($file, $use_sections, $fail_gracefully);\r
-       }\r
-\r
-       // --------------------------------------------------------------------\r
-       \r
-       /**\r
-        * Scaffolding Loader\r
-        *\r
-        * This initializing function works a bit different than the\r
-        * others. It doesn't load the class.  Instead, it simply\r
-        * sets a flag indicating that scaffolding is allowed to be\r
-        * used.  The actual scaffolding function below is\r
-        * called by the front controller based on whether the\r
-        * second segment of the URL matches the "secret" scaffolding\r
-        * word stored in the application/config/routes.php\r
-        *\r
-        * @access      public\r
-        * @param       string\r
-        * @return      void\r
-        */     \r
-       function scaffolding($table = '')\r
-       {               \r
-               if ($table === FALSE)\r
-               {\r
-                       show_error('You must include the name of the table you would like to access when you initialize scaffolding');\r
-               }\r
-               \r
-               $CI =& get_instance();\r
-               $CI->_ci_scaffolding = TRUE;\r
-               $CI->_ci_scaff_table = $table;\r
-       }\r
-\r
-       // --------------------------------------------------------------------\r
-               \r
-       /**\r
-        * Loader\r
-        *\r
-        * This function is used to load views and files.\r
-        * Variables are prefixed with _ci_ to avoid symbol collision with\r
-        * variables made available to view files\r
-        *\r
-        * @access      private\r
-        * @param       array\r
-        * @return      void\r
-        */\r
-       function _ci_load($_ci_data)\r
-       {\r
-               // Set the default data variables\r
-               foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val)\r
-               {\r
-                       $$_ci_val = ( ! isset($_ci_data[$_ci_val])) ? FALSE : $_ci_data[$_ci_val];\r
-               }\r
-\r
-               // Set the path to the requested file\r
-               if ($_ci_path == '')\r
-               {\r
-                       $_ci_ext = pathinfo($_ci_view, PATHINFO_EXTENSION);\r
-                       $_ci_file = ($_ci_ext == '') ? $_ci_view.EXT : $_ci_view;\r
-                       $_ci_path = $this->_ci_view_path.$_ci_file;\r
-               }\r
-               else\r
-               {\r
-                       $_ci_x = explode('/', $_ci_path);\r
-                       $_ci_file = end($_ci_x);\r
-               }\r
-               \r
-               if ( ! file_exists($_ci_path))\r
-               {\r
-                       show_error('Unable to load the requested file: '.$_ci_file);\r
-               }\r
-       \r
-               // This allows anything loaded using $this->load (views, files, etc.)\r
-               // to become accessible from within the Controller and Model functions.\r
-               // Only needed when running PHP 5\r
-               \r
-               if ($this->_ci_is_instance())\r
-               {\r
-                       $_ci_CI =& get_instance();\r
-                       foreach (get_object_vars($_ci_CI) as $_ci_key => $_ci_var)\r
-                       {\r
-                               if ( ! isset($this->$_ci_key))\r
-                               {\r
-                                       $this->$_ci_key =& $_ci_CI->$_ci_key;\r
-                               }\r
-                       }\r
-               }\r
-\r
-               /*\r
-                * Extract and cache variables\r
-                *\r
-                * You can either set variables using the dedicated $this->load_vars()\r
-                * function or via the second parameter of this function. We'll merge\r
-                * the two types and cache them so that views that are embedded within\r
-                * other views can have access to these variables.\r
-                */     \r
-               if (is_array($_ci_vars))\r
-               {\r
-                       $this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars);\r
-               }\r
-               extract($this->_ci_cached_vars);\r
-                               \r
-               /*\r
-                * Buffer the output\r
-                *\r
-                * We buffer the output for two reasons:\r
-                * 1. Speed. You get a significant speed boost.\r
-                * 2. So that the final rendered template can be\r
-                * post-processed by the output class.  Why do we\r
-                * need post processing?  For one thing, in order to\r
-                * show the elapsed page load time.  Unless we\r
-                * can intercept the content right before it's sent to\r
-                * the browser and then stop the timer it won't be accurate.\r
-                */\r
-               ob_start();\r
-                               \r
-               // If the PHP installation does not support short tags we'll\r
-               // do a little string replacement, changing the short tags\r
-               // to standard PHP echo statements.\r
-               \r
-               if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE)\r
-               {\r
-                       echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace('<?=', '<?php echo ', file_get_contents($_ci_path))));\r
-               }\r
-               else\r
-               {\r
-                       include($_ci_path); // include() vs include_once() allows for multiple views with the same name\r
-               }\r
-               \r
-               log_message('debug', 'File loaded: '.$_ci_path);\r
-               \r
-               // Return the file data if requested\r
-               if ($_ci_return === TRUE)\r
-               {               \r
-                       $buffer = ob_get_contents();\r
-                       @ob_end_clean();\r
-                       return $buffer;\r
-               }\r
-\r
-               /*\r
-                * Flush the buffer... or buff the flusher?\r
-                *\r
-                * In order to permit views to be nested within\r
-                * other views, we need to flush the content back out whenever\r
-                * we are beyond the first level of output buffering so that\r
-                * it can be seen and included properly by the first included\r
-                * template and any subsequent ones. Oy!\r
-                *\r
-                */     \r
-               if (ob_get_level() > $this->_ci_ob_level + 1)\r
-               {\r
-                       ob_end_flush();\r
-               }\r
-               else\r
-               {\r
-                       // PHP 4 requires that we use a global\r
-                       global $OUT;\r
-                       $OUT->append_output(ob_get_contents());\r
-                       @ob_end_clean();\r
-               }\r
-       }\r
-\r
-       // --------------------------------------------------------------------\r
-\r
-       /**\r
-        * Load class\r
-        *\r
-        * This function loads the requested class.\r
-        *\r
-        * @access      private\r
-        * @param       string  the item that is being loaded\r
-        * @param       mixed   any additional parameters\r
-        * @param       string  an optional object name\r
-        * @return      void\r
-        */\r
-       function _ci_load_class($class, $params = NULL, $object_name = NULL)\r
-       {       \r
-               // Get the class name, and while we're at it trim any slashes.  \r
-               // The directory path can be included as part of the class name, \r
-               // but we don't want a leading slash\r
-               $class = str_replace(EXT, '', trim($class, '/'));\r
-       \r
-               // Was the path included with the class name?\r
-               // We look for a slash to determine this\r
-               $subdir = '';\r
-               if (strpos($class, '/') !== FALSE)\r
-               {\r
-                       // explode the path so we can separate the filename from the path\r
-                       $x = explode('/', $class);      \r
-                       \r
-                       // Reset the $class variable now that we know the actual filename\r
-                       $class = end($x);\r
-                       \r
-                       // Kill the filename from the array\r
-                       unset($x[count($x)-1]);\r
-                       \r
-                       // Glue the path back together, sans filename\r
-                       $subdir = implode($x, '/').'/';\r
-               }\r
-\r
-               // We'll test for both lowercase and capitalized versions of the file name\r
-               foreach (array(ucfirst($class), strtolower($class)) as $class)\r
-               {\r
-                       $subclass = APPPATH.'libraries/'.$subdir.config_item('subclass_prefix').$class.EXT;\r
-\r
-                       // Is this a class extension request?                   \r
-                       if (file_exists($subclass))\r
-                       {\r
-                               $baseclass = BASEPATH.'libraries/'.ucfirst($class).EXT;\r
-                               \r
-                               if ( ! file_exists($baseclass))\r
-                               {\r
-                                       log_message('error', "Unable to load the requested class: ".$class);\r
-                                       show_error("Unable to load the requested class: ".$class);\r
-                               }\r
-\r
-                               // Safety:  Was the class already loaded by a previous call?\r
-                               if (in_array($subclass, $this->_ci_loaded_files))\r
-                               {\r
-                                       // Before we deem this to be a duplicate request, let's see\r
-                                       // if a custom object name is being supplied.  If so, we'll\r
-                                       // return a new instance of the object\r
-                                       if ( ! is_null($object_name))\r
-                                       {\r
-                                               $CI =& get_instance();\r
-                                               if ( ! isset($CI->$object_name))\r
-                                               {\r
-                                                       return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name);                    \r
-                                               }\r
-                                       }\r
-                                       \r
-                                       $is_duplicate = TRUE;\r
-                                       log_message('debug', $class." class already loaded. Second attempt ignored.");\r
-                                       return;\r
-                               }\r
-       \r
-                               include_once($baseclass);                               \r
-                               include_once($subclass);\r
-                               $this->_ci_loaded_files[] = $subclass;\r
-       \r
-                               return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name);                    \r
-                       }\r
-               \r
-                       // Lets search for the requested library file and load it.\r
-                       $is_duplicate = FALSE;          \r
-                       for ($i = 1; $i < 3; $i++)\r
-                       {\r
-                               $path = ($i % 2) ? APPPATH : BASEPATH;  \r
-                               $filepath = $path.'libraries/'.$subdir.$class.EXT;\r
-                               \r
-                               // Does the file exist?  No?  Bummer...\r
-                               if ( ! file_exists($filepath))\r
-                               {\r
-                                       continue;\r
-                               }\r
-                               \r
-                               // Safety:  Was the class already loaded by a previous call?\r
-                               if (in_array($filepath, $this->_ci_loaded_files))\r
-                               {\r
-                                       // Before we deem this to be a duplicate request, let's see\r
-                                       // if a custom object name is being supplied.  If so, we'll\r
-                                       // return a new instance of the object\r
-                                       if ( ! is_null($object_name))\r
-                                       {\r
-                                               $CI =& get_instance();\r
-                                               if ( ! isset($CI->$object_name))\r
-                                               {\r
-                                                       return $this->_ci_init_class($class, '', $params, $object_name);\r
-                                               }\r
-                                       }\r
-                               \r
-                                       $is_duplicate = TRUE;\r
-                                       log_message('debug', $class." class already loaded. Second attempt ignored.");\r
-                                       return;\r
-                               }\r
-                               \r
-                               include_once($filepath);\r
-                               $this->_ci_loaded_files[] = $filepath;\r
-                               return $this->_ci_init_class($class, '', $params, $object_name);\r
-                       }\r
-               } // END FOREACH\r
-\r
-               // One last attempt.  Maybe the library is in a subdirectory, but it wasn't specified?\r
-               if ($subdir == '')\r
-               {\r
-                       $path = strtolower($class).'/'.$class;\r
-                       return $this->_ci_load_class($path, $params);\r
-               }\r
-               \r
-               // If we got this far we were unable to find the requested class.\r
-               // We do not issue errors if the load call failed due to a duplicate request\r
-               if ($is_duplicate == FALSE)\r
-               {\r
-                       log_message('error', "Unable to load the requested class: ".$class);\r
-                       show_error("Unable to load the requested class: ".$class);\r
-               }\r
-       }\r
-       \r
-       // --------------------------------------------------------------------\r
-\r
-       /**\r
-        * Instantiates a class\r
-        *\r
-        * @access      private\r
-        * @param       string\r
-        * @param       string\r
-        * @param       string  an optional object name\r
-        * @return      null\r
-        */\r
-       function _ci_init_class($class, $prefix = '', $config = FALSE, $object_name = NULL)\r
-       {       \r
-               // Is there an associated config file for this class?\r
-               if ($config === NULL)\r
-               {\r
-                       // We test for both uppercase and lowercase, for servers that\r
-                       // are case-sensitive with regard to file names\r
-                       if (file_exists(APPPATH.'config/'.strtolower($class).EXT))\r
-                       {\r
-                               include_once(APPPATH.'config/'.strtolower($class).EXT);\r
-                       }                       \r
-                       else\r
-                       {\r
-                               if (file_exists(APPPATH.'config/'.ucfirst(strtolower($class)).EXT))\r
-                               {\r
-                                       include_once(APPPATH.'config/'.ucfirst(strtolower($class)).EXT);\r
-                               }                       \r
-                       }\r
-               }\r
-               \r
-               if ($prefix == '')\r
-               {                       \r
-                       if (class_exists('CI_'.$class)) \r
-                       {\r
-                               $name = 'CI_'.$class;\r
-                       }\r
-                       elseif (class_exists(config_item('subclass_prefix').$class)) \r
-                       {\r
-                               $name = config_item('subclass_prefix').$class;\r
-                       }\r
-                       else\r
-                       {\r
-                               $name = $class;\r
-                       }\r
-               }\r
-               else\r
-               {\r
-                       $name = $prefix.$class;\r
-               }\r
-               \r
-               // Is the class name valid?\r
-               if ( ! class_exists($name))\r
-               {\r
-                       log_message('error', "Non-existent class: ".$name);\r
-                       show_error("Non-existent class: ".$class);\r
-               }\r
-               \r
-               // Set the variable name we will assign the class to\r
-               // Was a custom class name supplied?  If so we'll use it\r
-               $class = strtolower($class);\r
-               \r
-               if (is_null($object_name))\r
-               {\r
-                       $classvar = ( ! isset($this->_ci_varmap[$class])) ? $class : $this->_ci_varmap[$class];\r
-               }\r
-               else\r
-               {\r
-                       $classvar = $object_name;\r
-               }\r
-\r
-               // Save the class name and object name          \r
-               $this->_ci_classes[$class] = $classvar;\r
-\r
-               // Instantiate the class                \r
-               $CI =& get_instance();\r
-               if ($config !== NULL)\r
-               {\r
-                       $CI->$classvar = new $name($config);\r
-               }\r
-               else\r
-               {               \r
-                       $CI->$classvar = new $name;\r
-               }       \r
-       }       \r
-       \r
-       // --------------------------------------------------------------------\r
-       \r
-       /**\r
-        * Autoloader\r
-        *\r
-        * The config/autoload.php file contains an array that permits sub-systems,\r
-        * libraries, plugins, and helpers to be loaded automatically.\r
-        *\r
-        * @access      private\r
-        * @param       array\r
-        * @return      void\r
-        */\r
-       function _ci_autoloader()\r
-       {       \r
-               include_once(APPPATH.'config/autoload'.EXT);\r
-               \r
-               if ( ! isset($autoload))\r
-               {\r
-                       return FALSE;\r
-               }\r
-               \r
-               // Load any custom config file\r
-               if (count($autoload['config']) > 0)\r
-               {                       \r
-                       $CI =& get_instance();\r
-                       foreach ($autoload['config'] as $key => $val)\r
-                       {\r
-                               $CI->config->load($val);\r
-                       }\r
-               }               \r
-\r
-               // Autoload plugins, helpers and languages\r
-               foreach (array('helper', 'plugin', 'language') as $type)\r
-               {                       \r
-                       if (isset($autoload[$type]) AND count($autoload[$type]) > 0)\r
-                       {\r
-                               $this->$type($autoload[$type]);\r
-                       }               \r
-               }\r
-\r
-               // A little tweak to remain backward compatible\r
-               // The $autoload['core'] item was deprecated\r
-               if ( ! isset($autoload['libraries']))\r
-               {\r
-                       $autoload['libraries'] = $autoload['core'];\r
-               }\r
-               \r
-               // Load libraries\r
-               if (isset($autoload['libraries']) AND count($autoload['libraries']) > 0)\r
-               {\r
-                       // Load the database driver.\r
-                       if (in_array('database', $autoload['libraries']))\r
-                       {\r
-                               $this->database();\r
-                               $autoload['libraries'] = array_diff($autoload['libraries'], array('database'));\r
-                       }\r
-\r
-                       // Load scaffolding\r
-                       if (in_array('scaffolding', $autoload['libraries']))\r
-                       {\r
-                               $this->scaffolding();\r
-                               $autoload['libraries'] = array_diff($autoload['libraries'], array('scaffolding'));\r
-                       }\r
-               \r
-                       // Load all other libraries\r
-                       foreach ($autoload['libraries'] as $item)\r
-                       {\r
-                               $this->library($item);\r
-                       }\r
-               }               \r
-\r
-               // Autoload models\r
-               if (isset($autoload['model']))\r
-               {\r
-                       $this->model($autoload['model']);\r
-               }\r
-\r
-       }\r
-       \r
-       // --------------------------------------------------------------------\r
-\r
-       /**\r
-        * Assign to Models\r
-        *\r
-        * Makes sure that anything loaded by the loader class (libraries, plugins, etc.)\r
-        * will be available to models, if any exist.\r
-        *\r
-        * @access      private\r
-        * @param       object\r
-        * @return      array\r
-        */\r
-       function _ci_assign_to_models()\r
-       {\r
-               if (count($this->_ci_models) == 0)\r
-               {\r
-                       return;\r
-               }\r
-       \r
-               if ($this->_ci_is_instance())\r
-               {\r
-                       $CI =& get_instance();\r
-                       foreach ($this->_ci_models as $model)\r
-                       {                       \r
-                               $CI->$model->_assign_libraries();\r
-                       }\r
-               }\r
-               else\r
-               {               \r
-                       foreach ($this->_ci_models as $model)\r
-                       {                       \r
-                               $this->$model->_assign_libraries();\r
-                       }\r
-               }\r
-       }       \r
-\r
-       // --------------------------------------------------------------------\r
-\r
-       /**\r
-        * Object to Array\r
-        *\r
-        * Takes an object as input and converts the class variables to array key/vals\r
-        *\r
-        * @access      private\r
-        * @param       object\r
-        * @return      array\r
-        */\r
-       function _ci_object_to_array($object)\r
-       {\r
-               return (is_object($object)) ? get_object_vars($object) : $object;\r
-       }\r
-\r
-       // --------------------------------------------------------------------\r
-\r
-       /**\r
-        * Determines whether we should use the CI instance or $this\r
-        *\r
-        * @access      private\r
-        * @return      bool\r
-        */\r
-       function _ci_is_instance()\r
-       {\r
-               if ($this->_ci_is_php5 == TRUE)\r
-               {\r
-                       return TRUE;\r
-               }\r
-       \r
-               global $CI;\r
-               return (is_object($CI)) ? TRUE : FALSE;\r
-       }\r
-\r
-}\r
-\r
-/* End of file Loader.php */\r
+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package            CodeIgniter
+ * @author             ExpressionEngine Dev Team
+ * @copyright  Copyright (c) 2008, EllisLab, Inc.
+ * @license            http://codeigniter.com/user_guide/license.html
+ * @link               http://codeigniter.com
+ * @since              Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Loader Class
+ *
+ * Loads views and files
+ *
+ * @package            CodeIgniter
+ * @subpackage Libraries
+ * @author             ExpressionEngine Dev Team
+ * @category   Loader
+ * @link               http://codeigniter.com/user_guide/libraries/loader.html
+ */
+class CI_Loader {
+
+       // All these are set automatically. Don't mess with them.
+       var $_ci_ob_level;
+       var $_ci_view_path              = '';
+       var $_ci_is_php5                = FALSE;
+       var $_ci_is_instance    = FALSE; // Whether we should use $this or $CI =& get_instance()
+       var $_ci_cached_vars    = array();
+       var $_ci_classes                = array();
+       var $_ci_loaded_files   = array();
+       var $_ci_models                 = array();
+       var $_ci_helpers                = array();
+       var $_ci_plugins                = array();
+       var $_ci_varmap                 = array('unit_test' => 'unit', 'user_agent' => 'agent');
+       
+
+       /**
+        * Constructor
+        *
+        * Sets the path to the view files and gets the initial output buffering level
+        *
+        * @access      public
+        */
+       function CI_Loader()
+       {       
+               $this->_ci_is_php5 = (floor(phpversion()) >= 5) ? TRUE : FALSE;
+               $this->_ci_view_path = APPPATH.'views/';
+               $this->_ci_ob_level  = ob_get_level();
+                               
+               log_message('debug', "Loader Class Initialized");
+       }
+       
+       // --------------------------------------------------------------------
+       
+       /**
+        * Class Loader
+        *
+        * This function lets users load and instantiate classes.
+        * It is designed to be called from a user's app controllers.
+        *
+        * @access      public
+        * @param       string  the name of the class
+        * @param       mixed   the optional parameters
+        * @param       string  an optional object name
+        * @return      void
+        */     
+       function library($library = '', $params = NULL, $object_name = NULL)
+       {
+               if ($library == '')
+               {
+                       return FALSE;
+               }
+
+               if ( ! is_null($params) AND ! is_array($params))
+               {
+                       $params = NULL;
+               }
+
+               if (is_array($library))
+               {
+                       foreach ($library as $class)
+                       {
+                               $this->_ci_load_class($class, $params, $object_name);
+                       }
+               }
+               else
+               {
+                       $this->_ci_load_class($library, $params, $object_name);
+               }
+               
+               $this->_ci_assign_to_models();
+       }
+
+       // --------------------------------------------------------------------
+       
+       /**
+        * Model Loader
+        *
+        * This function lets users load and instantiate models.
+        *
+        * @access      public
+        * @param       string  the name of the class
+        * @param       string  name for the model
+        * @param       bool    database connection
+        * @return      void
+        */     
+       function model($model, $name = '', $db_conn = FALSE)
+       {               
+               if (is_array($model))
+               {
+                       foreach($model as $babe)
+                       {
+                               $this->model($babe);    
+                       }
+                       return;
+               }
+
+               if ($model == '')
+               {
+                       return;
+               }
+       
+               // Is the model in a sub-folder? If so, parse out the filename and path.
+               if (strpos($model, '/') === FALSE)
+               {
+                       $path = '';
+               }
+               else
+               {
+                       $x = explode('/', $model);
+                       $model = end($x);                       
+                       unset($x[count($x)-1]);
+                       $path = implode('/', $x).'/';
+               }
+       
+               if ($name == '')
+               {
+                       $name = $model;
+               }
+               
+               if (in_array($name, $this->_ci_models, TRUE))
+               {
+                       return;
+               }
+               
+               $CI =& get_instance();
+               if (isset($CI->$name))
+               {
+                       show_error('The model name you are loading is the name of a resource that is already being used: '.$name);
+               }
+       
+               $model = strtolower($model);
+               
+               if ( ! file_exists(APPPATH.'models/'.$path.$model.EXT))
+               {
+                       show_error('Unable to locate the model you have specified: '.$model);
+               }
+                               
+               if ($db_conn !== FALSE AND ! class_exists('CI_DB'))
+               {
+                       if ($db_conn === TRUE)
+                               $db_conn = '';
+               
+                       $CI->load->database($db_conn, FALSE, TRUE);
+               }
+       
+               if ( ! class_exists('Model'))
+               {
+                       load_class('Model', FALSE);
+               }
+
+               require_once(APPPATH.'models/'.$path.$model.EXT);
+
+               $model = ucfirst($model);
+                               
+               $CI->$name = new $model();
+               $CI->$name->_assign_libraries();
+               
+               $this->_ci_models[] = $name;    
+       }
+               
+       // --------------------------------------------------------------------
+       
+       /**
+        * Database Loader
+        *
+        * @access      public
+        * @param       string  the DB credentials
+        * @param       bool    whether to return the DB object
+        * @param       bool    whether to enable active record (this allows us to override the config setting)
+        * @return      object
+        */     
+       function database($params = '', $return = FALSE, $active_record = FALSE)
+       {
+               // Grab the super object
+               $CI =& get_instance();
+               
+               // Do we even need to load the database class?
+               if (class_exists('CI_DB') AND $return == FALSE AND $active_record == FALSE AND isset($CI->db) AND is_object($CI->db))
+               {
+                       return FALSE;
+               }       
+       
+               require_once(BASEPATH.'database/DB'.EXT);
+
+               if ($return === TRUE)
+               {
+                       return DB($params, $active_record);
+               }
+               
+               // Initialize the db variable.  Needed to prevent   
+               // reference errors with some configurations
+               $CI->db = '';
+               
+               // Load the DB class
+               $CI->db =& DB($params, $active_record); 
+               
+               // Assign the DB object to any existing models
+               $this->_ci_assign_to_models();
+       }
+       
+       // --------------------------------------------------------------------
+
+       /**
+        * Load the Utilities Class
+        *
+        * @access      public
+        * @return      string          
+        */             
+       function dbutil()
+       {
+               if ( ! class_exists('CI_DB'))
+               {
+                       $this->database();
+               }
+               
+               $CI =& get_instance();
+
+               // for backwards compatibility, load dbforge so we can extend dbutils off it
+               // this use is deprecated and strongly discouraged
+               $CI->load->dbforge();
+       
+               require_once(BASEPATH.'database/DB_utility'.EXT);
+               require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_utility'.EXT);
+               $class = 'CI_DB_'.$CI->db->dbdriver.'_utility';
+
+               $CI->dbutil =& new $class();
+
+               $CI->load->_ci_assign_to_models();
+       }
+       
+       // --------------------------------------------------------------------
+
+       /**
+        * Load the Database Forge Class
+        *
+        * @access      public
+        * @return      string          
+        */             
+       function dbforge()
+       {
+               if ( ! class_exists('CI_DB'))
+               {
+                       $this->database();
+               }
+               
+               $CI =& get_instance();
+       
+               require_once(BASEPATH.'database/DB_forge'.EXT);
+               require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_forge'.EXT);
+               $class = 'CI_DB_'.$CI->db->dbdriver.'_forge';
+
+               $CI->dbforge = new $class();
+               
+               $CI->load->_ci_assign_to_models();
+       }
+       
+       // --------------------------------------------------------------------
+       
+       /**
+        * Load View
+        *
+        * This function is used to load a "view" file.  It has three parameters:
+        *
+        * 1. The name of the "view" file to be included.
+        * 2. An associative array of data to be extracted for use in the view.
+        * 3. TRUE/FALSE - whether to return the data or load it.  In
+        * some cases it's advantageous to be able to return data so that
+        * a developer can process it in some way.
+        *
+        * @access      public
+        * @param       string
+        * @param       array
+        * @param       bool
+        * @return      void
+        */
+       function view($view, $vars = array(), $return = FALSE)
+       {
+               return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return));
+       }
+       
+       // --------------------------------------------------------------------
+       
+       /**
+        * Load File
+        *
+        * This is a generic file loader
+        *
+        * @access      public
+        * @param       string
+        * @param       bool
+        * @return      string
+        */
+       function file($path, $return = FALSE)
+       {
+               return $this->_ci_load(array('_ci_path' => $path, '_ci_return' => $return));
+       }
+       
+       // --------------------------------------------------------------------
+       
+       /**
+        * Set Variables
+        *
+        * Once variables are set they become available within
+        * the controller class and its "view" files.
+        *
+        * @access      public
+        * @param       array
+        * @return      void
+        */
+       function vars($vars = array(), $val = '')
+       {
+               if ($val != '' AND is_string($vars))
+               {
+                       $vars = array($vars => $val);
+               }
+       
+               $vars = $this->_ci_object_to_array($vars);
+       
+               if (is_array($vars) AND count($vars) > 0)
+               {
+                       foreach ($vars as $key => $val)
+                       {
+                               $this->_ci_cached_vars[$key] = $val;
+                       }
+               }
+       }
+       
+       // --------------------------------------------------------------------
+       
+       /**
+        * Load Helper
+        *
+        * This function loads the specified helper file.
+        *
+        * @access      public
+        * @param       mixed
+        * @return      void
+        */
+       function helper($helpers = array())
+       {
+               if ( ! is_array($helpers))
+               {
+                       $helpers = array($helpers);
+               }
+       
+               foreach ($helpers as $helper)
+               {               
+                       $helper = strtolower(str_replace(EXT, '', str_replace('_helper', '', $helper)).'_helper');
+
+                       if (isset($this->_ci_helpers[$helper]))
+                       {
+                               continue;
+                       }
+                       
+                       $ext_helper = APPPATH.'helpers/'.config_item('subclass_prefix').$helper.EXT;
+
+                       // Is this a helper extension request?                  
+                       if (file_exists($ext_helper))
+                       {
+                               $base_helper = BASEPATH.'helpers/'.$helper.EXT;
+                               
+                               if ( ! file_exists($base_helper))
+                               {
+                                       show_error('Unable to load the requested file: helpers/'.$helper.EXT);
+                               }
+                               
+                               include_once($ext_helper);
+                               include_once($base_helper);
+                       }
+                       elseif (file_exists(APPPATH.'helpers/'.$helper.EXT))
+                       { 
+                               include_once(APPPATH.'helpers/'.$helper.EXT);
+                       }
+                       else
+                       {               
+                               if (file_exists(BASEPATH.'helpers/'.$helper.EXT))
+                               {
+                                       include_once(BASEPATH.'helpers/'.$helper.EXT);
+                               }
+                               else
+                               {
+                                       show_error('Unable to load the requested file: helpers/'.$helper.EXT);
+                               }
+                       }
+
+                       $this->_ci_helpers[$helper] = TRUE;
+                       log_message('debug', 'Helper loaded: '.$helper);        
+               }               
+       }
+       
+       // --------------------------------------------------------------------
+       
+       /**
+        * Load Helpers
+        *
+        * This is simply an alias to the above function in case the
+        * user has written the plural form of this function.
+        *
+        * @access      public
+        * @param       array
+        * @return      void
+        */
+       function helpers($helpers = array())
+       {
+               $this->helper($helpers);
+       }
+       
+       // --------------------------------------------------------------------
+       
+       /**
+        * Load Plugin
+        *
+        * This function loads the specified plugin.
+        *
+        * @access      public
+        * @param       array
+        * @return      void
+        */
+       function plugin($plugins = array())
+       {
+               if ( ! is_array($plugins))
+               {
+                       $plugins = array($plugins);
+               }
+       
+               foreach ($plugins as $plugin)
+               {       
+                       $plugin = strtolower(str_replace(EXT, '', str_replace('_pi', '', $plugin)).'_pi');              
+
+                       if (isset($this->_ci_plugins[$plugin]))
+                       {
+                               continue;
+                       }
+
+                       if (file_exists(APPPATH.'plugins/'.$plugin.EXT))
+                       {
+                               include_once(APPPATH.'plugins/'.$plugin.EXT);   
+                       }
+                       else
+                       {
+                               if (file_exists(BASEPATH.'plugins/'.$plugin.EXT))
+                               {
+                                       include_once(BASEPATH.'plugins/'.$plugin.EXT);  
+                               }
+                               else
+                               {
+                                       show_error('Unable to load the requested file: plugins/'.$plugin.EXT);
+                               }
+                       }
+                       
+                       $this->_ci_plugins[$plugin] = TRUE;
+                       log_message('debug', 'Plugin loaded: '.$plugin);
+               }               
+       }
+
+       // --------------------------------------------------------------------
+       
+       /**
+        * Load Plugins
+        *
+        * This is simply an alias to the above function in case the
+        * user has written the plural form of this function.
+        *
+        * @access      public
+        * @param       array
+        * @return      void
+        */
+       function plugins($plugins = array())
+       {
+               $this->plugin($plugins);
+       }
+               
+       // --------------------------------------------------------------------
+       
+       /**
+        * Loads a language file
+        *
+        * @access      public
+        * @param       array
+        * @param       string
+        * @return      void
+        */
+       function language($file = array(), $lang = '')
+       {
+               $CI =& get_instance();
+
+               if ( ! is_array($file))
+               {
+                       $file = array($file);
+               }
+
+               foreach ($file as $langfile)
+               {       
+                       $CI->lang->load($langfile, $lang);
+               }
+       }
+
+       /**
+        * Loads language files for scaffolding
+        *
+        * @access      public
+        * @param       string
+        * @return      arra
+        */
+       function scaffold_language($file = '', $lang = '', $return = FALSE)
+       {
+               $CI =& get_instance();
+               return $CI->lang->load($file, $lang, $return);
+       }
+       
+       // --------------------------------------------------------------------
+       
+       /**
+        * Loads a config file
+        *
+        * @access      public
+        * @param       string
+        * @return      void
+        */
+       function config($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
+       {                       
+               $CI =& get_instance();
+               $CI->config->load($file, $use_sections, $fail_gracefully);
+       }
+
+       // --------------------------------------------------------------------
+       
+       /**
+        * Scaffolding Loader
+        *
+        * This initializing function works a bit different than the
+        * others. It doesn't load the class.  Instead, it simply
+        * sets a flag indicating that scaffolding is allowed to be
+        * used.  The actual scaffolding function below is
+        * called by the front controller based on whether the
+        * second segment of the URL matches the "secret" scaffolding
+        * word stored in the application/config/routes.php
+        *
+        * @access      public
+        * @param       string
+        * @return      void
+        */     
+       function scaffolding($table = '')
+       {               
+               if ($table === FALSE)
+               {
+                       show_error('You must include the name of the table you would like to access when you initialize scaffolding');
+               }
+               
+               $CI =& get_instance();
+               $CI->_ci_scaffolding = TRUE;
+               $CI->_ci_scaff_table = $table;
+       }
+
+       // --------------------------------------------------------------------
+               
+       /**
+        * Loader
+        *
+        * This function is used to load views and files.
+        * Variables are prefixed with _ci_ to avoid symbol collision with
+        * variables made available to view files
+        *
+        * @access      private
+        * @param       array
+        * @return      void
+        */
+       function _ci_load($_ci_data)
+       {
+               // Set the default data variables
+               foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val)
+               {
+                       $$_ci_val = ( ! isset($_ci_data[$_ci_val])) ? FALSE : $_ci_data[$_ci_val];
+               }
+
+               // Set the path to the requested file
+               if ($_ci_path == '')
+               {
+                       $_ci_ext = pathinfo($_ci_view, PATHINFO_EXTENSION);
+                       $_ci_file = ($_ci_ext == '') ? $_ci_view.EXT : $_ci_view;
+                       $_ci_path = $this->_ci_view_path.$_ci_file;
+               }
+               else
+               {
+                       $_ci_x = explode('/', $_ci_path);
+                       $_ci_file = end($_ci_x);
+               }
+               
+               if ( ! file_exists($_ci_path))
+               {
+                       show_error('Unable to load the requested file: '.$_ci_file);
+               }
+       
+               // This allows anything loaded using $this->load (views, files, etc.)
+               // to become accessible from within the Controller and Model functions.
+               // Only needed when running PHP 5
+               
+               if ($this->_ci_is_instance())
+               {
+                       $_ci_CI =& get_instance();
+                       foreach (get_object_vars($_ci_CI) as $_ci_key => $_ci_var)
+                       {
+                               if ( ! isset($this->$_ci_key))
+                               {
+                                       $this->$_ci_key =& $_ci_CI->$_ci_key;
+                               }
+                       }
+               }
+
+               /*
+                * Extract and cache variables
+                *
+                * You can either set variables using the dedicated $this->load_vars()
+                * function or via the second parameter of this function. We'll merge
+                * the two types and cache them so that views that are embedded within
+                * other views can have access to these variables.
+                */     
+               if (is_array($_ci_vars))
+               {
+                       $this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars);
+               }
+               extract($this->_ci_cached_vars);
+                               
+               /*
+                * Buffer the output
+                *
+                * We buffer the output for two reasons:
+                * 1. Speed. You get a significant speed boost.
+                * 2. So that the final rendered template can be
+                * post-processed by the output class.  Why do we
+                * need post processing?  For one thing, in order to
+                * show the elapsed page load time.  Unless we
+                * can intercept the content right before it's sent to
+                * the browser and then stop the timer it won't be accurate.
+                */
+               ob_start();
+                               
+               // If the PHP installation does not support short tags we'll
+               // do a little string replacement, changing the short tags
+               // to standard PHP echo statements.
+               
+               if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE)
+               {
+                       echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace('<?=', '<?php echo ', file_get_contents($_ci_path))));
+               }
+               else
+               {
+                       include($_ci_path); // include() vs include_once() allows for multiple views with the same name
+               }
+               
+               log_message('debug', 'File loaded: '.$_ci_path);
+               
+               // Return the file data if requested
+               if ($_ci_return === TRUE)
+               {               
+                       $buffer = ob_get_contents();
+                       @ob_end_clean();
+                       return $buffer;
+               }
+
+               /*
+                * Flush the buffer... or buff the flusher?
+                *
+                * In order to permit views to be nested within
+                * other views, we need to flush the content back out whenever
+                * we are beyond the first level of output buffering so that
+                * it can be seen and included properly by the first included
+                * template and any subsequent ones. Oy!
+                *
+                */     
+               if (ob_get_level() > $this->_ci_ob_level + 1)
+               {
+                       ob_end_flush();
+               }
+               else
+               {
+                       // PHP 4 requires that we use a global
+                       global $OUT;
+                       $OUT->append_output(ob_get_contents());
+                       @ob_end_clean();
+               }
+       }
+
+       // --------------------------------------------------------------------
+
+       /**
+        * Load class
+        *
+        * This function loads the requested class.
+        *
+        * @access      private
+        * @param       string  the item that is being loaded
+        * @param       mixed   any additional parameters
+        * @param       string  an optional object name
+        * @return      void
+        */
+       function _ci_load_class($class, $params = NULL, $object_name = NULL)
+       {       
+               // Get the class name, and while we're at it trim any slashes.  
+               // The directory path can be included as part of the class name, 
+               // but we don't want a leading slash
+               $class = str_replace(EXT, '', trim($class, '/'));
+       
+               // Was the path included with the class name?
+               // We look for a slash to determine this
+               $subdir = '';
+               if (strpos($class, '/') !== FALSE)
+               {
+                       // explode the path so we can separate the filename from the path
+                       $x = explode('/', $class);      
+                       
+                       // Reset the $class variable now that we know the actual filename
+                       $class = end($x);
+                       
+                       // Kill the filename from the array
+                       unset($x[count($x)-1]);
+                       
+                       // Glue the path back together, sans filename
+                       $subdir = implode($x, '/').'/';
+               }
+
+               // We'll test for both lowercase and capitalized versions of the file name
+               foreach (array(ucfirst($class), strtolower($class)) as $class)
+               {
+                       $subclass = APPPATH.'libraries/'.$subdir.config_item('subclass_prefix').$class.EXT;
+
+                       // Is this a class extension request?                   
+                       if (file_exists($subclass))
+                       {
+                               $baseclass = BASEPATH.'libraries/'.ucfirst($class).EXT;
+                               
+                               if ( ! file_exists($baseclass))
+                               {
+                                       log_message('error', "Unable to load the requested class: ".$class);
+                                       show_error("Unable to load the requested class: ".$class);
+                               }
+
+                               // Safety:  Was the class already loaded by a previous call?
+                               if (in_array($subclass, $this->_ci_loaded_files))
+                               {
+                                       // Before we deem this to be a duplicate request, let's see
+                                       // if a custom object name is being supplied.  If so, we'll
+                                       // return a new instance of the object
+                                       if ( ! is_null($object_name))
+                                       {
+                                               $CI =& get_instance();
+                                               if ( ! isset($CI->$object_name))
+                                               {
+                                                       return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name);                    
+                                               }
+                                       }
+                                       
+                                       $is_duplicate = TRUE;
+                                       log_message('debug', $class." class already loaded. Second attempt ignored.");
+                                       return;
+                               }
+       
+                               include_once($baseclass);                               
+                               include_once($subclass);
+                               $this->_ci_loaded_files[] = $subclass;
+       
+                               return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name);                    
+                       }
+               
+                       // Lets search for the requested library file and load it.
+                       $is_duplicate = FALSE;          
+                       for ($i = 1; $i < 3; $i++)
+                       {
+                               $path = ($i % 2) ? APPPATH : BASEPATH;  
+                               $filepath = $path.'libraries/'.$subdir.$class.EXT;
+                               
+                               // Does the file exist?  No?  Bummer...
+                               if ( ! file_exists($filepath))
+                               {
+                                       continue;
+                               }
+                               
+                               // Safety:  Was the class already loaded by a previous call?
+                               if (in_array($filepath, $this->_ci_loaded_files))
+                               {
+                                       // Before we deem this to be a duplicate request, let's see
+                                       // if a custom object name is being supplied.  If so, we'll
+                                       // return a new instance of the object
+                                       if ( ! is_null($object_name))
+                                       {
+                                               $CI =& get_instance();
+                                               if ( ! isset($CI->$object_name))
+                                               {
+                                                       return $this->_ci_init_class($class, '', $params, $object_name);
+                                               }
+                                       }
+                               
+                                       $is_duplicate = TRUE;
+                                       log_message('debug', $class." class already loaded. Second attempt ignored.");
+                                       return;
+                               }
+                               
+                               include_once($filepath);
+                               $this->_ci_loaded_files[] = $filepath;
+                               return $this->_ci_init_class($class, '', $params, $object_name);
+                       }
+               } // END FOREACH
+
+               // One last attempt.  Maybe the library is in a subdirectory, but it wasn't specified?
+               if ($subdir == '')
+               {
+                       $path = strtolower($class).'/'.$class;
+                       return $this->_ci_load_class($path, $params);
+               }
+               
+               // If we got this far we were unable to find the requested class.
+               // We do not issue errors if the load call failed due to a duplicate request
+               if ($is_duplicate == FALSE)
+               {
+                       log_message('error', "Unable to load the requested class: ".$class);
+                       show_error("Unable to load the requested class: ".$class);
+               }
+       }
+       
+       // --------------------------------------------------------------------
+
+       /**
+        * Instantiates a class
+        *
+        * @access      private
+        * @param       string
+        * @param       string
+        * @param       string  an optional object name
+        * @return      null
+        */
+       function _ci_init_class($class, $prefix = '', $config = FALSE, $object_name = NULL)
+       {       
+               // Is there an associated config file for this class?
+               if ($config === NULL)
+               {
+                       // We test for both uppercase and lowercase, for servers that
+                       // are case-sensitive with regard to file names
+                       if (file_exists(APPPATH.'config/'.strtolower($class).EXT))
+                       {
+                               include_once(APPPATH.'config/'.strtolower($class).EXT);
+                       }                       
+                       else
+                       {
+                               if (file_exists(APPPATH.'config/'.ucfirst(strtolower($class)).EXT))
+                               {
+                                       include_once(APPPATH.'config/'.ucfirst(strtolower($class)).EXT);
+                               }                       
+                       }
+               }
+               
+               if ($prefix == '')
+               {                       
+                       if (class_exists('CI_'.$class)) 
+                       {
+                               $name = 'CI_'.$class;
+                       }
+                       elseif (class_exists(config_item('subclass_prefix').$class)) 
+                       {
+                               $name = config_item('subclass_prefix').$class;
+                       }
+                       else
+                       {
+                               $name = $class;
+                       }
+               }
+               else
+               {
+                       $name = $prefix.$class;
+               }
+               
+               // Is the class name valid?
+               if ( ! class_exists($name))
+               {
+                       log_message('error', "Non-existent class: ".$name);
+                       show_error("Non-existent class: ".$class);
+               }
+               
+               // Set the variable name we will assign the class to
+               // Was a custom class name supplied?  If so we'll use it
+               $class = strtolower($class);
+               
+               if (is_null($object_name))
+               {
+                       $classvar = ( ! isset($this->_ci_varmap[$class])) ? $class : $this->_ci_varmap[$class];
+               }
+               else
+               {
+                       $classvar = $object_name;
+               }
+
+               // Save the class name and object name          
+               $this->_ci_classes[$class] = $classvar;
+
+               // Instantiate the class                
+               $CI =& get_instance();
+               if ($config !== NULL)
+               {
+                       $CI->$classvar = new $name($config);
+               }
+               else
+               {               
+                       $CI->$classvar = new $name;
+               }       
+       }       
+       
+       // --------------------------------------------------------------------
+       
+       /**
+        * Autoloader
+        *
+        * The config/autoload.php file contains an array that permits sub-systems,
+        * libraries, plugins, and helpers to be loaded automatically.
+        *
+        * @access      private
+        * @param       array
+        * @return      void
+        */
+       function _ci_autoloader()
+       {       
+               include_once(APPPATH.'config/autoload'.EXT);
+               
+               if ( ! isset($autoload))
+               {
+                       return FALSE;
+               }
+               
+               // Load any custom config file
+               if (count($autoload['config']) > 0)
+               {                       
+                       $CI =& get_instance();
+                       foreach ($autoload['config'] as $key => $val)
+                       {
+                               $CI->config->load($val);
+                       }
+               }               
+
+               // Autoload plugins, helpers and languages
+               foreach (array('helper', 'plugin', 'language') as $type)
+               {                       
+                       if (isset($autoload[$type]) AND count($autoload[$type]) > 0)
+                       {
+                               $this->$type($autoload[$type]);
+                       }               
+               }
+
+               // A little tweak to remain backward compatible
+               // The $autoload['core'] item was deprecated
+               if ( ! isset($autoload['libraries']))
+               {
+                       $autoload['libraries'] = $autoload['core'];
+               }
+               
+               // Load libraries
+               if (isset($autoload['libraries']) AND count($autoload['libraries']) > 0)
+               {
+                       // Load the database driver.
+                       if (in_array('database', $autoload['libraries']))
+                       {
+                               $this->database();
+                               $autoload['libraries'] = array_diff($autoload['libraries'], array('database'));
+                       }
+
+                       // Load scaffolding
+                       if (in_array('scaffolding', $autoload['libraries']))
+                       {
+                               $this->scaffolding();
+                               $autoload['libraries'] = array_diff($autoload['libraries'], array('scaffolding'));
+                       }
+               
+                       // Load all other libraries
+                       foreach ($autoload['libraries'] as $item)
+                       {
+                               $this->library($item);
+                       }
+               }               
+
+               // Autoload models
+               if (isset($autoload['model']))
+               {
+                       $this->model($autoload['model']);
+               }
+
+       }
+       
+       // --------------------------------------------------------------------
+
+       /**
+        * Assign to Models
+        *
+        * Makes sure that anything loaded by the loader class (libraries, plugins, etc.)
+        * will be available to models, if any exist.
+        *
+        * @access      private
+        * @param       object
+        * @return      array
+        */
+       function _ci_assign_to_models()
+       {
+               if (count($this->_ci_models) == 0)
+               {
+                       return;
+               }
+       
+               if ($this->_ci_is_instance())
+               {
+                       $CI =& get_instance();
+                       foreach ($this->_ci_models as $model)
+                       {                       
+                               $CI->$model->_assign_libraries();
+                       }
+               }
+               else
+               {               
+                       foreach ($this->_ci_models as $model)
+                       {                       
+                               $this->$model->_assign_libraries();
+                       }
+               }
+       }       
+
+       // --------------------------------------------------------------------
+
+       /**
+        * Object to Array
+        *
+        * Takes an object as input and converts the class variables to array key/vals
+        *
+        * @access      private
+        * @param       object
+        * @return      array
+        */
+       function _ci_object_to_array($object)
+       {
+               return (is_object($object)) ? get_object_vars($object) : $object;
+       }
+
+       // --------------------------------------------------------------------
+
+       /**
+        * Determines whether we should use the CI instance or $this
+        *
+        * @access      private
+        * @return      bool
+        */
+       function _ci_is_instance()
+       {
+               if ($this->_ci_is_php5 == TRUE)
+               {
+                       return TRUE;
+               }
+       
+               global $CI;
+               return (is_object($CI)) ? TRUE : FALSE;
+       }
+
+}
+
+/* End of file Loader.php */
 /* Location: ./system/libraries/Loader.php */
\ No newline at end of file