
LSF = {
	
	Net : {},
	UI : {},
	DOM : {},
	Data : {}
	
};

(function() {
	
	var func_toString = function() {
		return "[Delegate : function = " + method + ", this = " + thisObject;
	};

	Delegate = function (thisObject, method) {
		if (typeof method == 'function') {
			var func = function() {
				return method.apply (thisObject, arguments);
			}
		} else {
	    	var func = function() {
		        return thisObject[method].apply (thisObject, arguments);
	    	}	
		}
		func.toString = func_toString;
		return func;
	}
	
	DelegateIterate = function (thisObject, objectList) {
		if (typeof objectList == 'function') {
			objectList = Delegate (objectList);
		} else if (objectList instanceof Array) {
			for (var i = 0; i < objectList.length; i++) {
				objectList[i] = Delegate (thisObject, objectList[i]);
			}
		} else {
			for (var i in objectList) {
				objectList[i] = Delegate (thisObject, objectList[i]);
			}
		}
		return objectList;
	}
	
	var browsers = {
		opera : 'opera', 
		safari : 'webkit',
		gecko : 'gecko',
		ie : 'msie'
	}
	var br;
    var uag = navigator.userAgent.toLowerCase();
    for (var b in browsers) {
    	if (uag.indexOf (b) > -1) br = browsers[b];
    }
    var ver = null;
    if (br == browsers.ie) {
    	ver = parseFloat (navigator.appVersion.match (/MSIE\s*(\d+(\.\d+)?)/)[1]);
    }
    
    LSF.Browser = {
    	name : br,
    	version : ver
    	//todo - more
    };
	
})();

LSF.emptyFunction = function(){}
LSF.abstractFunction = function (message) {
	return function() {
		throw new Error (message);
	}
}

LSF.clone = function (obj) {
	if (obj instanceof Array) {
		var cloned = [];
		for (var i = 0; i < obj.length; i++) {
			cloned[i] = obj[i];
		}
	} else {
		var cloned = {};
		for (var i in obj) {
			cloned[i] = obj[i];
		}
	}
	return cloned;
}

LSF.each = function (array, callback, context) {
	if (typeof context != 'undefined') {
		if (array instanceof Array || (array.length && typeof array.length == 'number')) {
			for (var i = 0; i < array.length; i++) {
				callback.call (context, array[i], i);
			}
		} else {
			for (var i in array) {
				callback.call (context, array[i], i);
			}
		}
	} else {
		if (array instanceof Array || (array.length && typeof array.length == 'number')) {
			for (var i = 0; i < array.length; i++) {
				callback (array[i], i);
			}
		} else {
			for (var i in array) {
				callback (array[i], i);
			}
		}
	}
}

LSF.quickAccess = function (shortHand, namespace, level) {
	level = level || 2;
	if (LSF_quickAccess >= level) {
		window[shortHand] = namespace;
	}
}

LSF.Callback = {
	
	Modifier : function (modifier, callback) {
		return function (response) {
			var result = modifier (response);
			if (typeof callback == 'function') {
				callback (result);
			} else {
				return result;
			}
		}	
	},

	Helper : function (callback, preModifier, postModifier) {
		var postM = LSF.Callback.Modifier (postModifier, callback);
		if (typeof callback == 'function') {
			preModifier (postM);
		} else {
			return postM (preModifier());
		}	
	}
	
}	

//Set a fallback function if the language extension is not needed.
LSF.Language = { term : function (term) { return term; }, terms : {} };