/*global document,window, CT_I_Subdomain, Image, event, clickTracksSettings, OANDAClientConfig, OANDAOPC */
var clickTracksOANDA = (function(defaultSettings) {

    // This variable ensures that our paramters are loaded before attempting to
    // log to click tracks
    var first_stage_done    = false;
    var CT_I_Datasets       = defaultSettings.clickTracksDatasets();
    var CT_I_Path           = defaultSettings.serverPath();
    // CT_I_... is an internally defined variable
    // window.CT_C_... is an internally named variable that the customer sets
    // window.CT_X_... is a customer defined variable to be written as a biscuit
    var paths = defaultSettings.paths();

    var CT_I_FirstPartyJDC      = defaultSettings.firstPartyJDC();
    var CT_I_FirstPartyCookies  = defaultSettings.firstPartyCookies();
    var CT_I_EnableExitTracking = defaultSettings.enableExitTracking();
    var CT_I_LocalLinks         = defaultSettings.localLinks();
    var CT_I_FirstPartyDomain   = defaultSettings.firstPartyDomain();
    var CT_I_OtherFileExtensionsToReport
        = defaultSettings.otherFileExtensionsToReport();

    var callbacks   = [];

    // execute stored callbacks
    function run_callbacks() {
        if(!callbacks) { return; }
        var fn,i = 0;
        while ((fn = callbacks[i++])) {
            fn(params);
        }
        callbacks = null;
    }

    function load_script(url){
        var script = document.createElement("script");
        script.type = "text/javascript";
        if(callbacks) {
            if (script.readyState){  //IE
                script.onreadystatechange = function(){
                    if (script.readyState == "loaded" ||
                            script.readyState == "complete"){
                        script.onreadystatechange = null;
                        run_callbacks();
                    }
                };
            } else {  //Others
                script.onload = function(){
                    run_callbacks();
                };
            }
        }
        script.src = url;

        var elem =
        document.getElementsByTagName("head")[0].appendChild(script);
    }


    function load_params(json) {

        // this function is called to load the parameters from the site.cnf
        // file if the variables were set by client config, then we set them.
        // otherwise we ignore it.
        if (typeof(json.clicktracks) !== 'undefined') {
            if (typeof(json.clicktracks.datasets) !== 'undefined') {
                if (typeof(json.clicktracks.datasets) === 'string') {
                    CT_I_Datasets = [json.clicktracks.datasets];
                } else {
                    CT_I_Datasets = json.clicktracks.datasets;
                }
            }
            if (typeof(json.clicktracks.serverPath) !== 'undefined') {
                CT_I_Path = json.clicktracks.serverPath;
            }
            if (typeof(json.clicktracks.paths) !== 'undefined') {
                paths = json.clicktracks.paths;
            }
            if (typeof(json.clicktracks.firstPartyJDC) !== 'undefined') {
                CT_I_FirstPartyJDC = json.clicktracks.firstPartyJDC;
            }
            if (typeof(json.clicktracks.firstPartyCookies) !== 'undefined') {
                CT_I_FirstPartyCookies = json.clicktracks.firstPartyCookies;
            }
            if (typeof(json.clicktracks.enableExitTracking) !== 'undefined') {
                CT_I_EnableExitTracking = json.clicktracks.enableExitTracking;
            }
            if (typeof(json.clicktracks.localLinks) !== 'undefined') {
                CT_I_LocalLinks = json.clicktracks.localLinks;
            }
            if (typeof(json.clicktracks.otherFileExtensionsToReport)
                 !== 'undefined') {
                CT_I_OtherFileExtensionsToReport
                    = json.clicktracks.otherFileExtensionsToReport;
            }
            if (typeof(json.clicktracks.firstPartyDomain) != 'undefined') {
                CT_I_FirstPartyDomain = json.clicktracks.firstPartyDomain;
            }
        }

        if (first_stage_done) {
            clickTracksOANDA.CT_RecordView();
        } else {
            first_stage_done = true;
        }
    }

    function cookies_set() {
        if (first_stage_done) {
            clickTracksOANDA.CT_RecordView();
        } else {
            first_stage_done = true;
        }
    }

    function record_view(request, method, additionalParams, server, skip_busy_loop ) {
        // set defaults
        var basicCall = true;
        if (request === null || request === undefined) {
            request = document.location;
        } else {
            basicCall = false;
        }
        additionalParams = additionalParams || []; //default
        server = server || CT_I_Path; //default

        if (typeof(window.CT_R_PID) != 'undefined') {
            request += (/\?/.test(request) ? '&' : '?')
                + 'CT_R_PID=' + encodeURIComponent(window.CT_R_PID);
        }
        var orderTotal = 0;
        //if (typeof(window.CT_C_OrderTotal) != 'undefined') {
        //    orderTotal = window.CT_C_OrderTotal;
        //}

        // handle biscuits first
        var biscuits = [];
        for (var i in window) {
            // if variable name starts with CT_X_ and by something else
            if (i.substring(0, 5) == 'CT_X_' && i.length > 5) {
				var s = window[i] + '';
				biscuits.push(encodeURIComponent(i + '=' + s));
            }
        }
        var ctxValue = biscuits.join('%26');

        // setup request fields
        var vals = additionalParams.concat(); //clone array into vals
        vals.push('i=' + CT_I_Datasets.join('&amp;i='));
        vals.push('r=' + encodeURIComponent(request));
        if (CT_I_FirstPartyJDC) {
            if (window.CT_I_FirstPartyDomain
                && window.CT_I_FirstPartyDomain !== '') {
                vals.push('fp=' + window.CT_I_FirstPartyDomain);
            } else {
                vals.push('fp=1');
            }
        }
        if (CT_I_FirstPartyCookies || CT_I_FirstPartyJDC) {
            vals.push('c=' + encodeURIComponent(document.cookie));
        }
        if (method !== null && method !== undefined) {
            vals.push('s=' + method); // method

            // referrer
            vals.push('f=' + encodeURIComponent(document.location));
        } else {

            // referrer
            vals.push('f=' + encodeURIComponent(document.referrer));
            if (orderTotal > 0) {
                vals.push('e=' + orderTotal);
            }
        }
        if (typeof(CT_I_Subdomain) != 'undefined') {
            vals.push('d=' + encodeURIComponent(CT_I_Subdomain));
        }
        if (ctxValue !== '') {
            vals.push('U=' + ctxValue); // biscuits
        }
        if (!basicCall) {
            vals.push('g=1'); // use graphic as response
        }
        if (typeof(window.CT_I_Protocol) == 'undefined') {
            window.CT_I_Protocol = window.location.protocol;
        }

        // screen dimensions
        vals.push('sd=' + window.screen.width + 'x' + window.screen.height);

        var path = window.CT_I_Protocol + server + vals.join('&');

        /*var debug = window.CT_C_Debug;
        if (debug) {
            var debugMsg = 'ClickTracks JavaScript Data\n';
            if (orderTotal !== 0) {
                debugMsg += 'OrderTotal = ' + orderTotal.toFixed(2) + '\n';
            }
            if (biscuits.length > 0) {
                debugMsg += 'Biscuits:\n  ' + biscuits.join('\n  ') + '\n';
            }
            if (debug > 1) {
                debugMsg += 'Request:\n  ' + path + '\n';
            }
            if (basicCall) {
                debugMsg += '(Basic call)\n';
            } else {
                debugMsg += '(Advanced call)\n';
            }
            debugMsg += '\n\nIf you set any other data, it was not set correctly.\n';
            alert(debugMsg);
        }*/

        if (basicCall) {

            // called to log the page being loaded, JavaScript can still
            // be added to and executed
            load_script(path);

        } else {
            // called by exit tracking or customer activity
            var a = new Image();
            a.src = path;

            if ( ! skip_busy_loop ) {
                var now = new Date();
                now = now.getTime() + 1000;
                var then;
                do {
                    then = new Date();
                } while (then.getTime() < now);
            }
        }
    }

    return {
        'load_params': function(json) {
           load_params(json);
        },
        'cookies_set': function() {
            cookies_set();
        },
        'add_callback' : function(callback) {
            // add the callback
            if ( callbacks ) { callbacks.push(callback); }
            // run it if we already have it
            else  { callback(); }
        },
        CT_I_EnableExitTracking: function() { return CT_I_EnableExitTracking; },

        //- additionalParams MAY be undefined. If set it MUST be either null
        //  or an array of additional parameters to pass, encoded
        //  as "key=value". e.g. additionalParams = [ "some_param=somevalue",
        //  "some_other_param=blah" ];
        //- server MAY be undefined. If set it MUST be either null or a
        //  non-empty string indicating where to send the message
        //  to. e.g. server ="jdc.ct.com". do not include protocol or trailing /s.
        CT_RecordView: function(request, method, additionalParams, server ) {
            // last arg is "skip busy loop"
            record_view( request, method, additionalParams, server, false);
        }, // CT_RecordView()

        //- additionalParams MAY be undefined. If set it MUST be either null
        //  or an array of additional parameters to pass, encoded
        //  as "key=value". e.g. additionalParams = [ "some_param=somevalue",
        //  "some_other_param=blah" ];
        //- server MAY be undefined. If set it MUST be either null or a
        //  non-empty string indicating where to send the message
        //  to. e.g. server ="jdc.ct.com". do not include protocol or trailing /s.
        CT_RecordViewSleepless: function(request, method, additionalParams, server ) {
            // last arg is "skip busy loop"
            record_view( request, method, additionalParams, server, true);
        }, // CT_RecordView()


        CT_ProcClick: function(evt) {
            evt = (evt) ? evt : ((window.event) ? event : null);
            if (evt) {
                var e = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
                if (e) {
                    while (e) {
                        var link = '';
                        switch(e.tagName) {
                            case 'A':
                            case 'AREA':
                                link = e.href;
                                break;
                            case 'INPUT':
                                if (e.form) {
                                    e = e.form;
                                    link = e.action;
                                    if (link === '') {
                                        link = document.location.href;
                                    }
                                } else {
                                    link = '';
                                }
                                break;
                        }
                        switch(e.tagName) {
                            case 'A':
                            case 'AREA':
                                if (link !== '') {
                                    if (!this.CT_LocalLink(link)) {
                                        this.CT_RecordView(link, 'EXIT');
                                    } else if (this.CT_TrackFileExtension(link)) {
                                        this.CT_RecordView(link, 'GET');
                                    }
                                }
                                e = 0;
                                break;
                            default:
                                e = (e.parentElement) ? e.parentElement : e.parentNode;
                                break;
                        }
                    }
                }
            }
        }, // CT_ProcClick

        CT_TrackFileExtension: function(link) {
            link = link.split(/\?/)[0]; // get everything up to but not including ?
            link = link.toLowerCase();
            var l1 = link.length;
            for (var index = 0; index < CT_I_OtherFileExtensionsToReport.length; index++) {
                if (CT_I_OtherFileExtensionsToReport[index] !== ''
                    && link.substring(l1-CT_I_OtherFileExtensionsToReport[index].length-1)
                    == '.' + CT_I_OtherFileExtensionsToReport[index].toLowerCase()) {
                    return true;
                }
            }
            return false;
        },

        CT_LocalLink: function(link) {
            var pieces = link.match(/^https?:\/\/([^\/]+)\//);
            if (pieces) {
                var l = pieces[1].length;
                for (var i in CT_I_LocalLinks){
                    if (pieces[1] == CT_I_LocalLinks[i]) {
                        return true;
                    }
                }
                return false;
            }
            return true;
        } // CT_LocalLink
    };
})(clickTracksSettings);

if (clickTracksOANDA.CT_I_EnableExitTracking()) {
    if (document.addEventListener) { // handle DOM 2 (Mozilla 6)
        document.addEventListener('click', clickTracksOANDA.CT_ProcClick, false);
    } else {
        document.attachEvent('onclick', clickTracksOANDA.CT_ProcClick);
    }
}

document.write = function(s) {
    var v = /[<]script.+?src\s*=\s*"(\S+?)"/i.exec(s);
    if (v) {
      var e = document.createElement('script');
      e.type = 'text/javascript';
      e.src = v[1];
      document.getElementsByTagName("head")[0].appendChild(e);
    }
};
OANDAClientConfig.add_callback(clickTracksOANDA.load_params);
OANDAOPC.add_callback(clickTracksOANDA.cookies_set);
