(function() {
if (typeof window.janrain.engage !== "object") window.janrain.engage = {};
if (!janrain.settings.capture) janrain.settings.capture = {};
if (!janrain.settings.common) janrain.settings.common = {};
if (!janrain.settings.language) janrain.settings.language = 'en';
if (!janrain.settings.packages) {
    janrain.settings.packages = ['login'];
} else {
    if (janrain.settings.tokenUrl) janrain.settings.packages.push('login');
}
if (!janrain.settings.share) janrain.settings.share = {};
if (!janrain.loadedPackages) janrain.loadedPackages = [];

if (window.console && console.warn) {
    console.warn("Could not load settings for '3ae472723fe02c7b6276b5e24041b6e999adbb04'");
}

/**
*  _scriptLoader
*
*  Loads script dynamically and allows for callbacks and a timeout.
*
*  @return {Object} Public methods for _loadDyanmicScript
*  @private
*/
function _scriptLoader(src, callback) {
    var _callback = callback,
        _timeout = 200,
        _useTimeout = false,
        _timeoutCallback,
        _pollCount = 0,
        _pollTimeout,
        _script = document.createElement('script'),
        _firstScript = document.getElementsByTagName('script')[0],
        _finished = false;

    _script.src = src;
    _script.setAttribute('type', 'text/javascript');

    _script.onload = _script.onerror = _script.onreadystatechange = function(event) {
        if (!_finished && (!this.readyState || this.readyState === "loaded" || this.readyState === "complete")) {
            _finish(event);
        }
    }

    function _load() {
        _firstScript.parentNode.insertBefore(_script, _firstScript);
        if (_useTimeout) _pollLoad();
    }

    function _finish(event) {
        _finished = true;
        if (typeof _pollTimeout !== 'undefined') {
            clearTimeout(_pollTimeout);
        }
        // event is a string when loading a script fails for any reason.
        if (typeof event === 'string') {
            if (typeof _timeoutCallback === 'function') _timeoutCallback(event);
            return true;
        }
        if (typeof event === 'object' || typeof event === 'undefined') {
            if (typeof event === 'object' && event.type === 'error') {
                if (typeof _timeoutCallback === 'function') _timeoutCallback(event);
            } else {
                if (typeof _callback === 'function') _callback();
            }
            return true;
        }
    }

    function _pollLoad() {
        _poll(function() {
            return _finished;
        })
        .setDelay(50)
        .setMaxAttempts(_timeout)
        .setFailCallback(function() {
            debug.warn('Polling for script loader failed. src: ' + src);
            _finish("Load Timeout Error");
        })
        .start();
    }

    return {
        setTimeoutCallback: function(callback) {
            _useTimeout = true;
            _timeoutCallback = callback;
            return this;
        },
        setCallback: function(callback) {
            _callback = callback;
            return this;
        },
        setTimeoutLimit: function(time) {
            _timeout = time;
            return this;
        },
        load: function() {
            _load();
        }
    }
}

function _loadDynamicScript(src, callback) {
    _scriptLoader(src, callback).load();
}

function getRootPath() {
    if (window.localStorage && localStorage.janrainLocalWidgetCodeEnabled === "true") {
        var rootPath = localStorage.janrainLocalWidgetCodeUrl || "http://apps.janrain.com:4567/";
    } else if (janrain.settings.enforceSecureCloudfront) {
        var rootPath = "https://ssl-widget-cdn.rpxnow.com/";
    } else {
        var rootPath = document.location.protocol === 'https:' ? "https://d29usylhdk1xyu.cloudfront.net/" : "http://widget-cdn.rpxnow.com/";
    }
    return rootPath;
}
function getPackagePath(packages) {
    var rootPath = getRootPath();
    var path = rootPath + 'manifest/' + packages.join(':') + '?version=' + encodeURIComponent('1.106.0_widgets_479');
    return path;
}
function getTranslationPath(language, widget) {
    var rootPath = getRootPath();
    var path = rootPath + 'translations/' + widget + '/' + language;
    return path;
}
function loadPackages(loaded, packages) {
    if (packages.length === 0) return false;
    if (loaded === packages.length) {
        var widgetPath = getPackagePath(packages);
        _loadDynamicScript(widgetPath);
    } else {
        if (!inArray(janrain.loadedPackages, packages[loaded])) {
            janrain.loadedPackages.push(packages[loaded]);
            if ((packages[loaded] === "login"&& janrain.settings.language === "en")
                || packages[loaded] === "capture") {
                loadPackages(loaded + 1, packages);
            } else {
                _loadDynamicScript(getTranslationPath(janrain.settings.language, packages[loaded]), function() {
                    loadPackages(loaded + 1, packages);
                });
            }
        } else {
            deleteItemFromArray(packages, loaded);
            loadPackages(loaded, packages);
        }
    }
}
function arrayToObject(array) {
    var uniqueObject = {};
    for (var i = 0, l = array.length; i < l; i++) {
        uniqueObject[array[i]] = array[i];
    }
    return uniqueObject;
}
function deleteItemFromArray(array, from, to) {
    var rest = array.slice((to || from) + 1 || array.length);
    array.length = from < 0 ? array.length + from : from;
    return array.push.apply(array, rest);
}
function inArray(array, item) {
    var arrayObject = arrayToObject(array);
    return arrayObject.hasOwnProperty(item);
}
function unique(array){
    var uniqueObject = arrayToObject(array);
    var unique = [];
    for (var key in uniqueObject){
        if (uniqueObject.hasOwnProperty(key)) unique.push(key);
    }
    return unique;
}

janrain.settings.packages = unique(janrain.settings.packages);
janrain.settings.packages.sort();
loadPackages(0, janrain.settings.packages);
})();
