var Kava = {
	Globals: {
		ClientDebug: /kavadebug/.test(navigator.userAgent),
		CookieOpts: { expires: 5000, path: '/' },
		Loaded: 0
	},

	Logger: function () {
		var self = this;
		if (self === Kava) {
			self = Kava.Logger;
		}
		self.messages = [];
		self.log = function (msg) {
			self.messages.push(msg);
		}
	},
	
	clicked: function (e) {
		Kava.Globals.Clicked = e;
	},

	Loader: function (host) {
		var sources = {};
		var parents_of = {};
		var children_of = {};
		var loaded = {};
		var async = {};
		var log = Kava.Logger.log || function () {};
		var proto = window.location.protocol;
		
		if (!/^http/.test(proto))
			proto = 'https:';
		
		var base = proto + '//' + (host ? host : window.location.host);
		var self = this;
		if (self === Kava) {
			self = Kava.Loader;
		}
		
		self.url = function (source) {
			if (/^\/\//.test(source))
				return proto + source;
			else if (/^\//.test(source))
				return base + source;
			else	
				return source;
		}
		
		var _request = function (name) {
			log('_request: ' + name + ',' + sources[name]);

			if (async[name])
				return;
			
			async[name] = true;
	
			var head = document.getElementsByTagName("head")[0];
			var script = document.createElement("script");
			script.src = sources[name];
			script.id = name;
			head.appendChild(script);
		};
		
		var _parents_are_loaded = function (name) {
			log('_parents_are_loaded: ' + name);
			var parents_loaded = true;
			for (var dep in parents_of[name])
				if (!(parents_loaded &= loaded[dep]))
					break;
			
			return parents_loaded;
		};
	
		var _load = function (name, kid) {
			log('_load: ' + name + ', ' + kid);
			children_of[name] = children_of[name] || {};
			if (kid)
				children_of[name][kid] = true;
			
			if (loaded[name]) {
				self._already_loaded(name);
				return;
			}
			else if (name in loaded)
				return;
	
			loaded[name] = false;
			
			var has_parents = false;
			for (var parent in parents_of[name]) {
				has_parents = true;
				_load(parent, name);
			}
	
			if (!has_parents)
				_request(name);
		};

		self.script = function (p) {
			log('script: ' + p);
			var name = p.name;
			sources[name] = self.url(p.source);
	
			var needs = [];
	
			if (parents_of[name])
				return false;
	
			parents_of[name] = {};
	
			if ('needs' in p)
				needs = p.needs.split(/\s+/);
	
			var i;
			for (i=0; i < needs.length; i++) {
				var dep = needs[i];
				parents_of[name][dep] = true;
			}
		};
	
		self.use = function (namestr) {
			log('use: ' + namestr);
			var names = namestr.split(/\s+/);
			var i;
			for (i=0; i < names.length; i++) {
				_load(names[i]);
			}
		};
	
		self.css = function (loc) {
			log('loadcss: ' + loc);
			var url = self.url(loc);

			var head = document.getElementsByTagName("head")[0];
			var script = document.createElement("link");
			script.href = url;
			script.rel = "stylesheet";
			script.type = "text/css";
			head.appendChild(script);
		};

		self._already_loaded = function (name) {
			log('_already_loaded: ' + name);
			for (var kid in children_of[name])
				if (!loaded[kid] && _parents_are_loaded(kid))
					_request(kid);
		};

		self.loaded = function (name) {
			log('loaded: ' + name);
			loaded[name] = true;
			for (var kid in children_of[name])
				if (!loaded[kid] && _parents_are_loaded(kid))
					_request(kid);
		};
		
		self.run = function (source) {
			var head = document.getElementsByTagName("head")[0];
			var script = document.createElement("script");
			script.src = self.url(source);
			head.appendChild(script);
		};
		self.pixel = function (loc) {
			log('loadimg: ' + loc);
			var url = self.url(loc);

			var body = document.body;
			var img = document.createElement("img");
			img.src = url;
			body.appendChild(img);
			img.style.display = 'none';
		};
	}

};


// Kava.DebugClient = /kavadebug/.test(navigator.userAgent);
