(function(ns) {

var namespaces = [this];

var attachBehavior = function($element, behavior) {
    var fn = namespaces;

    behavior.replace(/([^.]+)/g, function(object) {
        if(fn === namespaces) {
            for(var nextFn, index = 0; index < fn.length; ++index) {
                nextFn = fn[index][object];
                if(nextFn) {
                    fn = nextFn;
                    break;
                }
            }
        } else if(typeof fn === 'object') {
            fn = fn[object];
        }
    });

    if(typeof fn === 'function') {
        if(ns.options.classBased) {
            return new fn($element);
        } else {
            return fn($element);
        }
    } else {
        if (window.console && console.warn) {
            console.warn("elementalJS: Unable to find behavior:", behavior);
        }
    }
};

var attachBehaviorsToElement = function(element) {
    var $element = $(element);
    var behaviors = $element.data('behavior') || $element.data('behaviour');
    behaviors.replace(/([^ ]+)/g, function(behavior) {
        attachBehavior($element, behavior);
    });
};

ns.options = {
    classBased: false
};

ns.loadOnly = function(element) {
    attachBehaviorsToElement(element);
};

ns.load = function(container) {
    var selector_name = '[data-behavior], [data-behaviour]';
    var $behaviors = $(selector_name, container).add($(container).filter(selector_name));

    $behaviors.each(function(index, element) {
        attachBehaviorsToElement(element);
    });
};

ns.addNamespace = function(namespace) {
    namespaces.push(namespace);
};

})(window.Elemental = {});