/*
 * Data Look Up
 * version 2.1.3
 */


;window.dlu = (function() {

    /*
     * Properties
     */

    // Hold site ID globally
    var siteId;
    var setSiteId = function(value) {
        siteId = value;
        _elqQ.push(['elqSetSiteId', siteId]);
    };

    // Catch Eloqua script callbacks and pass onto currently active custom callback
    var eloquaCallback;
    var setEloquaCallback = function(callback) { eloquaCallback = callback; };
    window.SetElqContent = function SetElqContent() { eloquaCallback(); };


    /*
     * Methods
     */

    // Visitor data look up
    var getVisitorData = function(options) {
        if(options.siteId) setSiteId(options.siteId);
        if(!options.returns) options.returns = ['V_ElqEmailAddress'];

        setEloquaCallback(function() {
            options.callback(retrieveEloquaValues(options.returns));
        });

        loadScript('https://s' + siteId + '.t.eloqua.com/visitor/v200/svrGP?pps=50&siteid=' + siteId + '&DLKey=' + options.id + '&DLLookup=&ms=279', function() {
            // Visitor has no cookie
            if(typeof GetElqContentPersonalizationValue === 'undefined') {
                options.callback({});
            }
        });
    };

    // Contact data look up
    var getData = function(options) {
        if(options.siteId) setSiteId(options.siteId);
        if(!options.returns) options.returns = ['C_FirstName', 'C_LastName'];
        if(typeof options.timeout === 'undefined') options.timeout = 10000;

        if(!options.criteria) return options.callback({});

        var timeout = setTimeout(function() {
            options.callback(null);
            setEloquaCallback(function() {});
        }, options.timeout);

        setEloquaCallback(function() {
            clearTimeout(timeout);
            options.callback(retrieveEloquaValues(options.returns, options.elqReturnFunction));
        });

        var fieldValues = [];
        for(var key in options.criteria) {
            if(options.criteria.hasOwnProperty(key)) {
                fieldValues[fieldValues.length] = '<' + key + '>' + options.criteria[key] + '</' + key + '>';
            }
        }
        fieldValues = fieldValues.join('');

        _elqQ.push(['elqDataLookup', escape(options.id), fieldValues]);
    };

    var autoFill = function(data) {
        var $ = window.$ || window.jQuery || document.querySelectorAll.bind(document);
        var elements = $('[data-dlu]');
        for(var i = elements.length - 1; i >= 0; i--) {
            elements[i].value = data[elements[i].getAttribute('data-dlu')];
        }
    };

    // Load script
    var loadScript = function loadScript(scriptUrl, callback) {
        var script = document.createElement('script');
        script.type = 'text/javascript';
        script.async = true;
        script.src = scriptUrl;
        if(callback) script.onload = callback;

        var firstScript = document.body.firstChild;
        document.body.insertBefore(script, firstScript);
    };

    // Retrieve values from Eloqua after callback
    var retrieveEloquaValues = function(fields, returnFunction) {
        if(!returnFunction) returnFunction = 'GetElqContentPersonalizationValue';
        var data = {};
        for(var i = fields.length - 1; i >= 0; i--) {
            data[fields[i]] = window[returnFunction](fields[i]);
        };
        return data;
    };


    /*
     * Init
     */

    // Ensure _elqQ.push
    if(!window._elqQ) {
        window._elqQ = [];
        loadScript('https://img.en25.com/i/elqCfg.min.js');
    }

    // Expose API
    return {
        setSiteId: setSiteId,
        getVisitorData: getVisitorData,
        getData: getData,
        autoFill: autoFill
    };

})();
