/**
 * Responsible of loading certain object from server; it does not initialize anything by itself,
 * but it can be instructed to do a callback to a function.
 */
function Loader() {
    var loaded_files = [];

    this.start = function() {
        //nya
    };


    this.load_core = function(name) {
        //loader("core", name);
    };
    
    
    this.load_plugin = function(name) {
        //loader("plugin", name);
    };


    this.load_widget = function(name, callback_function) {
        return loader("widget", name, callback_function);
    };

    this.load_class = function(name) {
        //loader("class", name);
    };

    /**
     * Abstract loader, use load_plugin, load_core, load_widget, load_class instead.
     *
     * Loads the source if not still loaded and calls its callback function if such specified.
     */
    var loader = function(what, name, callback_function) {
        var async = false;
        var callback = false;
        switch(what) {
            case "plugin":
                url = Config.url.plugins + '/' + name;
                break;
            case "core":
                url = Config.url.core + '/' + name;
                break;
            case "class":
                url = Config.url.dataclass + '/' + name;
                break;
            case "widget":
                url = Config.url.widgets + '/' + name;
                async = true;
                callback = true;
                break;
        }

        if(url == null) {
            return;
        }

        is_loaded = false;
        for(i = 0; i < loaded_files.length; i++) {
            if(loaded_files[i] === url) {
                is_loaded = true;
                break;
            }
        }

        if(is_loaded === false) {
            $.ajax({
                url: url,
                dataType: 'script',
                async: async,
                success: function(res) {
                    if(callback == true && typeof callback_function == "function") {
                        callback_function(res);
                        return true;
                    } else {
                        return res;
                    }
                    loaded_files.push(url);
                },
                error: function() {
                }
            });
        } else if(is_loaded === true) {
            if(callback == true && typeof callback_function == "function") {
                while(typeof name) {
                    callback_function();
                }
                return true;
            }
        }
    };
}

var Loader = new Loader();
