function ipuiBase() 
{
	this.baseURL		= '/ipui.strands.';
	this.repository		=
	{
		'common':
		{
			'base':
			{
				'cache': {'file': 'cache.js'},
				'cookie': {'file': 'cookie.js'},
				'demandlet': {'file': 'demandlet.js'},
				'history': {'file': 'history.js'},
				'persist': {'file': 'persist.js'},
				'swapDOM': {'file': 'swapDOM.js'},
				'query': {'file': 'query.js'},
				'xml': {'file': 'xml.js'},
				'crypto': {'file': 'crypto.js'},
				'ajax': {'file': 'ajax.js'}
			},
			'cap':
			{
				'cats': {'file': 'cats.js'},
				'manager': {'file': 'manager.js'}
			},
			'legacy': null
		},
		'localization': null,
		'commerce':
		{
			'cart': {'file': 'cart.js'},
			'gift': {'file': 'gift.js'},
			'promotion': {'file': 'promotion.js'}
		},
		'ui':
		{
			'dialog': {'file': 'dialog.js'},
			'grid': {'file': 'grid.js'},
			'layout': {'file': 'layout.js'},
			'lightbox': {'file': 'lightbox.js'},
			'meta_element': {'file': 'meta_element.js'},
			'modal': {'file': 'modal.js'},
			'page': {'file': 'page.js'},
			'page_layout': {'file': 'page_layout.js'},
			'repeater': {'file': 'repeater.js'},
			'tabs': {'file': 'tabs.js'},
			'tinymce': {'file': 'tinymce.js'},
			'tree': {'file': 'tree.js'}
		},
		'user':
		{
			'address': {'file': 'address.js'},
			'human': {'file': 'human.js'}
		},
		'utils':
		{
			'date': {'file': 'date.js'},
			'dom': {'file': 'dom.js'},
			'general': {'file': 'general.js'},
			'select': {'file': 'select.js'},
			'validate': {'file': 'validate.js'},
			'url': {'file': 'url.js'},
			'sort': {'file': 'sort.js'},
			'hash': {'file': 'hash.js'},
			'json': {'file': 'json.js'},
			'serializer': {'file': 'serializer.js'},
			'template': {'file': 'template.js'},
			'xhtml': {'file': 'xhtml.js'},
			'xml2json': {'file': 'xml2json.js'},
			'upload_manager': {'file': 'upload_manager'}
		},
		'cms':
		{
			'widget': {'file': 'widget.js'},
			'comm': {'file': 'comm.js'},
			'debug': {'file': 'debug.js'},
			'layout_node': {'file': 'layout_node.js'},
			'render': {'file': 'render.js'},
			'config': {'file': 'config.js'},
			'user': {'file': 'user.js'}
		}
	};
};
ipuiBase.prototype = 
{
	requires: function(ns)
	{
		var root 	= window;
		var nsPath 	= (this.baseURL+ns).split('.');
		var clName	= nsPath[nsPath.length-1];
		if(!IPUI[clName]) 
		{
			if(!this.inRepository(ns)) 
				this.console({msg:ns + ' not found in repository.',type:'warn'});
			else 
			{
				this.loadFile((this.baseURL+ns).replace(/\./gi, '/') + '.js',{async:false,clName:clName});
				if(IPUI[clName]) 
				{
					if('initialize' in IPUI[clName]) IPUI[clName].initialize();
				}
				else 
					this.console({msg:ns + ' not found on server.',type:'warn'});
			}
		}
	},
	
	inRepository: function(ns)
	{
		var nsPath 	= ns.split('.');
		var objPath  = '';
		for(var i=0;i<nsPath.length-1;i++){ objPath += '[\'' + nsPath[i] + '\']'; }
		return ([nsPath[nsPath.length-1]] in eval('IPUI.repository'+objPath)) ?  true : false;
	},

	bindClass: function(jsClass,options) 
	{
		if(typeof jsClass=='object') jsClass = jsClass.responseText;
		this[options.clName] = {};
		this[options.clName] = eval(jsClass);
		//window[options.cName] = eval(jsClass);
	},
		
	loadFile: function(url, optionalParams) 
	{	
		try
		{
			var options = {};Object.extend(options, optionalParams || {});
			var f 		= arguments.callee;
			if(!('queue' in f)) f.queue = {};
			var queue =  f.queue;
			new Ajax.Request(url,{asynchronous:false,onSuccess:this.bindClass.bindAsEventListener(this,options)});	
		}
		catch(e)
		{
			this.console({type:'error',msg:e});
		}				
	},

	importClass: function(ns) 
	{
		var nsPath 	= ns.split('.');
		var clName	= nsPath[nsPath.length-1];
		if(!this[clName]) 
		{
			this.loadFile(ns.replace(/\./gi, '/') + '.js');
			if(typeof this[clName] == 'undefined') 
			{
				this[clName] = new Object();
			}
		}
	},

	loadScript: function(url, callback) 
	{
		var f = arguments.callee;
		if (!("queue" in f))
			f.queue = {};
		var queue =  f.queue;
		if (url in queue) 
		{
			if (callback) 
			{
				if (queue[url])
					queue[url].push(callback);
				else
					callback();
			}
			return;
		}
		queue[url] = callback ? [callback] : [];
		var script = document.createElement("script");
		script.type = "text/javascript";
		if (/WebKit/i.test(navigator.userAgent)) 
		{
			var _timer = setInterval(function() 
			{
				if (/loaded|complete/.test(document.readyState)) 
				{
					clearInterval(_timer);
					while (queue[url].length) 
					{
						queue[url].shift()();
					}
					queue[url] = null;
				}
			}, 1000);
		} 
		else 
		{
			script.onload = script.onreadystatechange = function() 
										{
											if (script.readyState && script.readyState != "loaded" && script.readyState != "complete")
												return;
											script.onreadystatechange = script.onload = null;
											while (queue[url].length) 
											{
												queue[url].shift()();
											}
											queue[url] = null;
										};
		}
		script.src = url;
		document.getElementsByTagName("head")[0].appendChild(script);
	},

	alert: function(message)
	{
		var layout = new Template('<div>#{message}<a href="#" title="Close" onclick="Modalbox.hide(); return false;">OK</a></div>').evaluate({message: message});
		Modalbox.show(layout,{title: 'Alert', slideUpDuration:0, slideDownDuration:1, overlayClose:false, width: 200, height:200});
	},

	console: function(options) 
	{
		try
		{
			if(!('console' in window)||!(console))
			{
			    var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", "group"
			                 , "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
			    window.console = {};
			    for(var i=0;i<names.length;++i) window.console[names[i]]=function(){};
			}
			if (console[options.type])
			{
				if(options.toDIV && ($(options.toDIV)))
				{
					$(options.toDIV).insert(new Element('div').update(options.type + ' - ' + options.msg));
				}
				else
				{
					console[options.type](options.msg);	
				}				
			}
		}
		catch(e){}
	}
};
var IPUI = new ipuiBase;
