Initial Import
diff --git a/system/libraries/Loader.php b/system/libraries/Loader.php
new file mode 100644
index 0000000..e2467fa
--- /dev/null
+++ b/system/libraries/Loader.php
@@ -0,0 +1,611 @@
+<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * Code Igniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		Rick Ellis
+ * @copyright	Copyright (c) 2006, pMachine, Inc.
+ * @license		http://www.codeignitor.com/user_guide/license.html 
+ * @link		http://www.codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+ 
+// ------------------------------------------------------------------------
+
+/**
+ * Loader Class
+ * 
+ * Loads views and files
+ *
+ * @package		CodeIgniter
+ * @subpackage	Libraries
+ * @author		Rick Ellis
+ * @category	Loader
+ * @link		http://www.codeigniter.com/user_guide/libraries/loader.html
+ */
+class CI_Loader {
+
+	var $ob_level;
+	var $cached_vars	= array();
+	var $helpers		= array();
+	var $plugins		= array();
+	var $scripts		= array();
+	var $languages		= array();
+	var $view_path		= '';
+
+	/**
+	 * Constructor
+	 *
+	 * Sets the path to the view files and gets the initial output
+	 * buffering level
+	 *
+	 * @access	public
+	 */
+	function CI_Loader()
+	{
+		$this->view_path = APPPATH.'views/';
+		$this->ob_level = ob_get_level();
+				
+		log_message('debug', "Loader Class Initialized");
+	}
+	// END CI_Loader()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * 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	any initialization parameters
+	 * @return	void
+	 */	
+	function library($class, $param = FALSE)
+	{		
+		if ($class == '')
+			return;
+	
+		$obj =& get_instance();
+		$obj->_ci_initialize($class, $param);
+		$obj->_ci_assign_to_models();
+	}
+	// END library()
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Model Loader
+	 *
+	 * This function lets users load and instantiate models.
+	 *
+	 * @access	public
+	 * @param	string	the name of the class
+	 * @param	mixed	any initialization parameters
+	 * @return	void
+	 */	
+	function model($model, $name = '', $db_conn = FALSE)
+	{		
+		if ($model == '')
+			return;
+	
+		$obj =& get_instance();
+		$obj->_ci_load_model($model, $name, $db_conn);
+	}
+	// END library()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * 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	mixed
+	 */	
+	function database($db = '', $return = FALSE, $active_record = FALSE)
+	{
+		$obj =& get_instance();
+	
+		if ($return === TRUE)
+		{
+			return $obj->_ci_init_database($db, TRUE, $active_record);
+		}
+		else
+		{
+			$obj->_ci_init_database($db, FALSE, $active_record);
+			$obj->_ci_assign_to_models();			
+		}
+	}
+	// END database()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Scaffolding Loader
+	 *
+	 * @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 access when you initialize scaffolding');
+		}
+		
+		$obj =& get_instance();
+		$obj->_ci_init_scaffolding($table);
+	}
+	// END scaffolding()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * 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 retun 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('view' => $view, 'vars' => $this->_ci_object_to_array($vars), 'return' => $return));
+	}
+	// END view()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * 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('path' => $path, 'return' => $return));
+	}
+	// END file()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Set Variables
+	 *
+	 * Once variables are set they become availabe within
+	 * the controller class and its "view" files.
+	 *
+	 * @access	public
+	 * @param	array
+	 * @return	void
+	 */
+	function vars($vars = array())
+	{
+		$vars = $this->_ci_object_to_array($vars);
+	
+		if (is_array($vars) AND count($vars) > 0)
+		{
+			foreach ($vars as $key => $val)
+			{
+				$this->cached_vars[$key] = $val;
+			}
+		}
+	}
+	// END vars()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * 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)
+		{
+			if (isset($this->helpers[$helper]))
+			{
+				continue;
+			}
+		
+			$helper = strtolower(str_replace(EXT, '', str_replace('_helper', '', $helper)).'_helper');
+		
+			if ( ! file_exists(BASEPATH.'helpers/'.$helper.EXT))
+			{
+				show_error('Unable to load the requested file: helpers/'.$helper.EXT);
+			}
+			
+			include_once(BASEPATH.'helpers/'.$helper.EXT);
+
+			$this->helpers[$helper] = TRUE;
+		}
+		
+		log_message('debug', 'Helpers loaded: '.implode(', ', $helpers));
+	}
+	// END 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);
+	}
+	// END 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)
+		{
+			if (isset($this->plugins[$plugin]))
+			{
+				continue;
+			}
+	
+			$plugin = strtolower(str_replace(EXT, '', str_replace('_plugin.', '', $plugin)).'_pi');
+		
+			if ( ! file_exists(BASEPATH.'plugins/'.$plugin.EXT))
+			{
+				show_error('Unable to load the requested file: plugins/'.$plugin.EXT);
+			}
+			
+			include_once(BASEPATH.'plugins/'.$plugin.EXT);	
+			
+			$this->plugins[$plugin] = TRUE;
+		}
+		
+		log_message('debug', 'Plugins loaded: '.implode(', ', $plugins));
+	}
+	// END plugin()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Load Script
+	 *
+	 * This function loads the specified include file from the
+	 * application/scripts/ folder
+	 *
+	 * @access	public
+	 * @param	array
+	 * @return	void
+	 */
+	function script($scripts = array())
+	{
+		if ( ! is_array($scripts))
+		{
+			$scripts = array($scripts);
+		}
+	
+		foreach ($scripts as $script)
+		{
+			if (isset($this->scripts[$script]))
+			{
+				continue;
+			}
+	
+			$script = strtolower(str_replace(EXT, '', $script));
+		
+			if ( ! file_exists(APPPATH.'scripts/'.$script.EXT))
+			{
+				show_error('Unable to load the requested script: scripts/'.$script.EXT);
+			}
+			
+			include_once(APPPATH.'scripts/'.$script.EXT);
+			
+			$this->scripts[$script] = TRUE;
+		}
+		
+		log_message('debug', 'Scripts loaded: '.implode(', ', $scripts));
+	}
+	// END script()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * 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);
+	}
+	// END plugins()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Loads a language file
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	void
+	 */
+	function language($file = '', $lang = '', $return = FALSE)
+	{
+		$obj =& get_instance();
+		return $obj->lang->load($file, $lang, $return);
+	}
+	// END language()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Loads a config file
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	void
+	 */
+	function config($file = '')
+	{
+		$obj =& get_instance();
+		$obj->config->load($file);
+	}
+	// END config()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Set the Path to the "views" folder
+	 *
+	 * @access	private
+	 * @param	string
+	 * @return	void
+	 */
+	function _ci_set_view_path($path)
+	{
+		$this->view_path = $path;
+	}
+	// END _ci_set_view_path()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Loader
+	 *
+	 * This function isn't called directly.  It's called from
+	 * the two functions above.  It's used to load views and files
+	 *
+	 * @access	private
+	 * @param	array
+	 * @return	void
+	 */
+	function _ci_load($data)
+	{	
+		$OUT =& _load_class('CI_Output');
+
+		// This allows anything loaded using $this->load (viwes, files, etc.)
+		// to become accessible from within the Controller and Model functions.
+		$obj =& get_instance();
+		foreach ($obj->ci_is_loaded as $val)
+		{
+			if ( ! isset($this->$val))
+			{
+				$this->$val =& $obj->$val;
+			}	
+		}		
+		
+		// Set the default data variables
+		foreach (array('view', 'vars', 'path', 'return') as $val)
+		{
+			$$val = ( ! isset($data[$val])) ? FALSE : $data[$val];
+		}
+		
+		/*
+		 * Extract and cached 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($vars))
+		{
+			$this->cached_vars = array_merge($this->cached_vars, $vars);
+		}
+		extract($this->cached_vars);
+				
+		// Set the path to the requested file
+		if ($path == '')
+		{
+			$ext = pathinfo($view, PATHINFO_EXTENSION);
+			$file = ($ext == '') ? $view.EXT : $view;
+			$path = $this->view_path.$file;
+		}
+		else
+		{
+			$x = explode('/', $path);
+			$file = end($x);
+		}
+
+		/*
+		 * 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 acurate.
+		 *
+		 */
+
+		if ( ! file_exists($path))
+		{
+			show_error('Unable to load the requested file: '.$file);
+		}
+
+		ob_start();
+		
+		include($path);
+		log_message('debug', 'File loaded: '.$path);
+		
+		// Return the file data if requested to
+		if ($return === TRUE)
+		{		
+			$buffer = ob_get_contents();
+			ob_end_clean(); 
+			
+			return $buffer;
+		}
+
+		/*
+		 * Flush the buffer... or buff the flusher?
+		 *
+		 * In order to permit templates (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->ob_level + 1)
+		{
+			ob_end_flush();
+		}
+		else
+		{
+			$OUT->set_output(ob_get_contents());
+			ob_end_clean();
+		}
+	}
+	// END _load()
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Autoloader
+	 *
+	 * The config/autoload.php file contains an array that permits sub-systems, 
+	 * plugins, and helpers to be loaded automatically.
+	 *
+	 * @access	private
+	 * @param	array
+	 * @return	void
+	 */
+	function _ci_autoloader($autoload)
+	{
+		if ($autoload === FALSE)
+		{
+			return;
+		}
+	
+		foreach (array('helper', 'plugin', 'script') as $type)
+		{
+			if (isset($autoload[$type]))
+			{
+				if ( ! is_array($autoload[$type]))
+				{
+					$autoload[$type] = array($autoload[$type]);
+				}
+			
+				foreach ($autoload[$type] as $item)
+				{
+					$this->$type($item);
+				}
+			}
+		}
+	}
+	// END _ci_autoloader()
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Object to Array
+	 *
+	 * Takes an object as input and convers the class variables to array key/vals
+	 *
+	 * @access	public
+	 * @param	object
+	 * @return	array
+	 */
+	function _ci_object_to_array($object)
+	{
+		if ( ! is_object($object))
+		{
+			return $object;
+		}
+		
+		$array = array();
+		foreach (get_object_vars($object) as $key => $val)
+		{
+			$array[$key] = $val;
+		}
+	
+		return $array;
+	}
+	
+}
+// END Loader Class
+?>
\ No newline at end of file