/*
 * jQuery.namespace plugin
 *
 * Copyright (c) 2008 Borgar Thorsteinsson (borgar.net)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * Compatible with jQuery 1.2.6 
 *
 */

jQuery.namespace = function ( space, obj, splitter ) {
  var c, 
      b = space.split( splitter || '.' ), 
      p = window;
  while (c = b.shift()) {
    p = (p[c] = (p[c] || {}));
  }
  if (obj) {
    jQuery.extend( p, obj );
  }
  return p;
};

// move original function out of the way
jQuery._extend = jQuery.fn._extend = jQuery.extend;

// this is a modified copy of the original extend function that
// allows passing of strings as first argument: jQuery.extend('foo.bar', { mem:'val' })
jQuery.extend = jQuery.fn.extend = function() {
	// copy reference to target object
	var target = arguments[0] || {}, 
	    i = 1, 
	    length = arguments.length, 
	    deep = false,
	    options;

	// Handle a deep copy situation
	if ( target.constructor == Boolean ) {
		deep = target;
		target = arguments[1] || {};
		// skip the boolean and the target
		i = 2;
	}

	// Handle case when target is a string (namespace)
	if ( typeof target === "string" && !deep && length > 1 )
		target = jQuery.namespace( target );

	// Handle case when target isn't an object or function (possible in deep copy)
	if ( typeof target != "object" && typeof target != "function" )
		target = {};

	// extend jQuery itself if only one argument is passed
	if ( length == i ) {
		target = this;
		--i;
	}

	for ( ; i < length; i++ )
		// Only deal with non-null/undefined values
		if ( (options = arguments[ i ]) != null )
			// Extend the base object
			for ( var name in options ) {
				var src = target[ name ], copy = options[ name ];

				// Prevent never-ending loop
				if ( target === copy )
					continue;

				// Recurse if we're merging object values
				if ( deep && copy && typeof copy == "object" && !copy.nodeType )
					target[ name ] = jQuery.extend( deep, 
						// Never move original objects, clone them
						src || ( copy.length != null ? [ ] : { } )
					, copy );

				// Don't bring in undefined values
				else if ( copy !== undefined )
					target[ name ] = copy;

			}

	// Return the modified object
	return target;
};
