﻿/*
Triton Loyalty -- Carrot lib

Author: Ben Z.
Version: alpha 0.1
*/

var carrot = function ($) {
    var config = {};

    var init = function (configs) {
        config = {
            cookieDomain: carrot.utils.getDefaultCookieDomain(),
            exRegiUrl: ''
        };
        config = carrot.utils.merge(config, configs);

    };

    return { init: init };
} (jQuery);

carrot.tsso = function ($) {
    var user = function () {
        var tssoToken = '';

        var registerNewUserToken = function (newToken) {
            tssoToken = newToken;
        };

        var disposeUser = function () {
            tssoToken = '';
        };

        var getUserToken = function(){
            return tssoToken;
        };

        return { registerNewUserToken: registerNewUserToken, disposeUser: disposeUser, getUserToken: getUserToken };
    }();

    return { user: user };
} (jQuery);

carrot.utils = function ($) {
    var cleanLocation = function () {
        return document.location.toString().replace(/(?:(\?)|&)(tlat|ec|tst)=[^&]*/g, '$1').split("#")[0];
    };

    var getDefaultCookieDomain = function () {
        var dDom = document.domain;
        return dDom.match(/^[0-9]{1,3}(\.[0-9]{1,3}){3}$/) ?
    			dDom //ip address
    			: (dDom.split('.').length < 3) ?
    				"." + dDom
    				: "." + dDom.split('.').slice(-2).join('.');
    };

    /**
    * serializeJSON - turns JSON to string.  Uses built in
    *   JSON.stringify if available
    */
    var serializeJSON = /* (typeof JSON != 'undefined' && !!(JSON.stringify) ) ? JSON.stringify : */function (obj) {
        var t = typeof (obj);
        if (t != "object" || obj === null) {
            if (t == "string") { obj = '"' + obj + '"'; }
            return obj;
        } else {
            var n, v, json = [], arr = (obj && obj.constructor == Array);
            for (n in obj) {
                if (obj.hasOwnProperty(n)) {
                    v = obj[n]; t = typeof (v);
                    if (t == "string") { v = '"' + v + '"'; }
                    else if (t == "object" && v !== null) { v = serializeJSON(v); }
                    json.push((arr ? "" : '"' + n + '":') + String(v));
                }
            }
            return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
        }
    };

    /**
    * merge - merges two objects
    * @param {Object} original Original object
    * @param {Object} update Object to merge in.  These values overwrite.
    * @returns {Object} Merged object
    */
    var merge = function (original, update) {
        var value = '';
        for (var key in update) {
            if (update.hasOwnProperty(key)) {
                value = ((!!update[key]) && update[key].constructor == String) ? update[key].replace(/<[^>]*>/g, '') : update[key];
                original[key] = value;
            }
        }
        return original;
    };

    /**
    * listener - Singleton.  used to subscribe to and fire events
    */
    listener = function () {
        /**
        * @param {Object} evts the container for all event listeners
        * @private
        */
        var evts = {};

        /**
        * listen - subscribe to events
        * @param {String} evtName the name to be listening for
        * @param {Function} method the function to be fired
        * @param {Object} scope the value for the 'this' object inside the function
        */
        var listen = function (evtName, method, scope) {
            if (method && method.constructor == Function) {
                evts[evtName] = evts[evtName] || [];
                evts[evtName][evts[evtName].length] = { method: method, scope: scope };
            }
        };

        /**
        * fire - call all the event handlers
        * @param {String} evtName the name of the event listner to invoke
        * @param {Boolean} remove Whether or not to unsubscribe all listeners
        */
        var fire = function (evtName, args) {
            args = args || [];
            if (evts.hasOwnProperty(evtName)) {
                var evt = evts[evtName].reverse();
                for (var i = evt.length; i--; ) {
                    try {
                        evt[i].method.apply(evt[i].scope || [], (args.data || []));
                    } catch (e) {
                        if (args && args.data && args.data.push) {
                            evt[i].method(args.data[0]);
                        } else {
                            evt[i].method();
                        }
                    }
                }
                if (args.remove) { kill(evtName); }
            }
        };

        var listening = function (evtName) {
            return !!evts[evtName];
        };

        var kill = function (evtName) {
            if (evts.hasOwnProperty(evtName)) { delete evts[evtName]; }
        };

        // return the public functions
        return { listen: listen, fire: fire, kill: kill, listening: listening };
    } ();


    var getUrlVar = function () {
        var vars;

        /**
        * getVar - Get values from url parameters.  If no arguments are passed,
        *   object with all URL parameters is returned.
        * @param {String} key URL parameter to retrieve.
        */
        var getVar = function (key) {
            if (!key) { return getVars(); }
            return getVars()[key];
        };

        /**
        * getVars - Get object with all URL parameters
        * @private
        * @returns {Object} all URL parameters
        */
        var getVars = function () {
            if (vars) { return vars; }
            vars = {};
            var hashes;
            if (!!(hashes = window.location.href.replace(/(\?[^\?]*)\?/g, '$1&').split('?')[1])) {
                var hash;
                hashes = hashes.split('&');
                for (var i = hashes.length; i--; ) {
                    hash = hashes[i].split('=');
                    vars[hash[0]] = hash[1];
                }
            }
            return vars;
        };

        return getVar;
    } ();

    var contains = function (arr, obj) {
        if (arr.indexOf) {
            return arr.indexOf(obj) < 0;
        }
        return $.inArray(arr, obj);
    };

    return {
        cleanLocation: cleanLocation,
        getDefaultCookieDomain: getDefaultCookieDomain,
        serializeJSON: serializeJSON,
        merge: merge,
        getUrlVar: getUrlVar,
        contains: contains,
        listener: listener
    };

} (jQuery);

(function () {
    // initializer will take data between open/close script tags and initialize
    // js client with it.
    var tl_c_script = document.getElementsByTagName('script');
    tl_c_script = tl_c_script[tl_c_script.length - 1];
    
    var text = tl_c_script.innerHTML.replace(/\s+$/, '');

    // src.match required to protect against deferred or dom injected script loads
    if (text.length && tl_c_script.src.match(/carrot\.js/)) {
        try { tl_c_data = JSON.parse(text); } catch (e) { tl_c_data = window["eval"]("(" + text + ")"); }
        carrot.init(tl_c_data);
    }
})();

