(function(){
	var core = {
		/**
		 * @var object settings - The configuration of this library
		 */
		settings:{
			urls:{
				savePreferences:'#'
			}
		},
		
		/**
		 * @var array - List of loaded JS scripts
		 */	
		libraries:[],

		/**
		 * Loads a JS library via Ajax
		 * 
		 * @param string url - The location of the script
		 * @param function callback - Optional callback to execute after script was loaded
		 * @return core for chainability
		 */	
		loadJS:function(url,callback){
			if (typeof callback === "undefined"){
				callback = function(){};
			}
			
			// load it via Ajax
			$.getScript(url,callback);
			return this;
		},
		
		/**
		 * Loads a JS library once via Ajax
		 * 
		 * @param string url - The location of the script
		 * @param function callback - Optional callback to execute after script was loaded
		 * @return core for chainability
		 */	
		loadOnce:function(url,callback){
			if (typeof callback === "undefined"){
				callback = function(){};
			}
			
			if ($.inArray(url,this.libraries) == -1){
				// load JS:
				this.loadJS(url, callback);
				
				// append to list:
				this.libraries.push(url);
			} else {
				callback();
			}
			return this;
		},
		
		/**
		 * Saves preferences via AJAX, and then calls a callback function
		 *
		 * @param string|array prefs - List or a single preference
		 * @param string|array values - List or a single value
		 * @param function callback - Optional callback to execute after script is completed
		 */
		savePreferences:function(prefs,values,callback){
			if (typeof callback === "undefined"){
				callback = function(){};
			}
			
			if (typeof prefs == "string"){
				prefs = [prefs];
			}
			if (typeof values == "string"){
				values = [values];
			}
			
			var postValues = {
				"preferences[]":	prefs,
				"values[]":			values
			};
			
			$.post(this.settings.urls.savePreferences,postValues,function(data){
				callback(data);
			},'json');
		}
	};
	SE.extend("core",core);
})();
