/**
 * The SALEM object is the single global object used by the SALEM Library.  It
 * contains utility function for setting up namespaces.
 * @module salem
 * @title  SALEM Global
 */
var SALEM = function() {
	/**
     * The SALEM global namespace object.  If SALEM is already defined, the
     * existing SALEM object will not be overwritten so that defined
     * namespaces are preserved.
     * @class SALEM
 	 * @namespace  
     * @static
     */
    return {
		/**
		 * Returns the namespace specified and creates it if it doesn't exist
		 * <pre>
		 * SALEM.namespace("util");
		 * </pre>
		 * The above would create SALEM.util
		 *
		 * Be careful when naming packages. Reserved words may work in some browsers
		 * and not others. For instance, the following will fail in Safari:
		 * <pre>
		 * SALEM.namespace("really.long.nested.namespace");
		 * </pre>
		 * This fails because "long" is a future reserved word in ECMAScript
		 *
		 * @method namespace
		 * @static
		 * @param  {String} arguments 1-n namespaces to create 
		 * @return {Object}  A reference to the last namespace object created
 		*/			
        namespace: function() {
            var a = arguments, o = null, i, j, d;
            for (i = 0; i < a.length; i = i + 1) {
                d = a[i].split(".");
                o = SALEM;

                // TOWNHALL is implied, so it is ignored if it is included
                for (j = (d[0] == "SALEM") ? 1 : 0; j < d.length; j = j + 1) {
                    o[d[j]] = o[d[j]] ||
							{};
                    o = o[d[j]];
                }
            }
        }
    };
} ();
