

var app = (function(){

	var libraries = {
		jQuery: 'http://ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js',
		jQueryUI:  'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js',
		carousel:  'tinycarousel.js',
		quicksand: 'quicksand.js',
		html5Ie: 'html5-ie.js',
		selectivzr: 'selectivizr.js',
		colorbox: 'colorbox.min.js',
		timeago:  'timeago.js',
		googleMaps: 'http://maps.googleapis.com/maps/api/js?sensor=false&callback=app.mapsReady',
		validate: 'jquery.validate.js',
		validateMessage: 'validate.messages_'+ localeLang +'.js'
	};

	var viewsPath = (typeof versionPath !== 'undefined' ? versionPath+'/' : '') + 'js/views/',
		libPath = (typeof versionPath !== 'undefined' ? versionPath+'/' : '') + 'js/lib/',
		utilsPath = (typeof versionPath !== 'undefined' ? versionPath+'/' : '') + 'js/utils/',
		stylePath = (typeof versionPath !== 'undefined' ? versionPath+'/' : '') + 'css/';

	var callbacks = {};



	var loadLibraries = function(deps){
		var libs = [];
		for (var i in deps)
		{
			var k = deps[i],
				d = libraries[k],
				p = d.substr(0,4) == 'http' ? '' : libPath;

			libs.push(p + d);
		}

		return libs;
	};


	var load = function(file, type){

		var path = viewsPath;
		if (type == 'utils') path = utilsPath;

		// load file
		$script(path + file + '.js', function(){

			var obj = app[type][file];
			if (!obj) return;
			if (!obj.dependencies) return jQuery(obj.execute);

			var start = function(){
				var libs = loadLibraries(obj.dependencies);

				$script(libs, file);
				$script.ready(file, function(){
					jQuery(obj.execute);
				});
			};

			if (!obj.init) return start();


			jQuery(function(){
				if (obj.init(jQuery)) return start();
			});
		});
	};


	var init = function(cb){

		var done = function(){
			var tokens = document.getElementsByTagName('html')[0].className.split(' ');
			for (var i in tokens)
			{
				var view = tokens[i];
				if (view.substr(0, 5) == 'page-')
					load(view.substr(5), 'views');
			}

			cb();
		};

		// load jQuery
		$script(libraries.jQuery, function(){
			init = done;
			init();
		});
	};


	var util = function(utils){

		for (var i in utils) load(utils[i], 'utils');
	};


	var addStylesheet = function(file){
		file = stylePath + file;

		if (document.createStyleSheet) document.createStyleSheet(file);
		else jQuery('head').append(
			jQuery('<link rel="stylesheet" />').attr('href', file)
		);
	};


	var mapsReady = function(){
		for (var i in callbacks.maps)
			callbacks.maps[i]();
	};


	return {
		views: {},
		utils: {},
		init: init,
		util: util,
		loadLibraries: loadLibraries,
		addStylesheet: addStylesheet,
		mapsReady: mapsReady,
		callbacks: callbacks
	};
})();


google.setOnLoadCallback(function(){
	app.init(function(){
		app.util(['stickyheader', 'youtube', 'twitter', 'maps', 'blogs']);
	});
});

