﻿var GAWrap = function(environment, uaCode, page) {
    var gaWrap = this;

    // Private Function
    var _debuggerMessage = function(message, isError) {
        if (typeof (isError) == 'undefined') {
            isError = false;
        }

        var writeToConsole = function(msg) {
            if (typeof (console) !== 'undefined' && console != null) {
                console.log(msg);
            }
        };

        // If we are in Live we do not alert unless in debug mode.
        if (gaWrap.environment == 'Live' && gaWrap.isDebugMode == true && isError == true) {
            alert(message);
        } else if (gaWrap.environment != 'Live' && isError == true) {
            alert(message);
        }
        else if (gaWrap.isDebugMode == true && isError == false) {
            writeToConsole(message);
        }
    };

    //Private function
    var _setDebug = function(key, val) {
        var querySt = function(ji) {
            hu = window.location.search.substring(1);
            gy = hu.split("&");
            for (i = 0; i < gy.length; i++) {
                ft = gy[i].split("=");
                if (ft[0] == ji) {
                    return ft[1];
                }
            }
        };

        var debugMode = false;
        var q = querySt(key); //'debugger');
        debugMode = q == val; // 'wrapperDebug';

        gaWrap.isDebugMode = debugMode;
    }

    //Private Function
    var _isGAValid = function() {
        return typeof (_gat) != 'undefined';
    };

    //Private Function
    var _getGAPrefix = function() {
        return 'googleTrackingCode';
    };

    //Private Function
    var _setDomainName = function(domainName) {
        if (_isUndefinedOrNull(domainName)) {
            _debuggerMessage('No domain name specified', true);
            return;
        } else if (_isUndefinedOrNull(gaWrap.pageTracker)) {
            _debuggerMessage('setDomain: No page', true);
        } else {
            _debuggerMessage('setDomainName: ' + domainName);
            gaWrap.pageTracker._setDomainName(domainName)
        }
    };

    //Private Function
    //Checks whether a value is undefined or null
    var _isUndefinedOrNull = function(value) {
        var isvalid = false;
        if (typeof (value) == 'undefined' || value == null) {
            isvalid = true;
        }
        return isvalid;
    };

    //Private Function
    var _setDefault = function(from, to, key, defaul) {
        var val = from[key];

        if (_isUndefinedOrNull(val)) {
            val = defaul;
        }

        to[key] = val;
    };

    //Private function
    var _createObj = function(uaCode) {
        if (typeof (uaCode) == 'undefined' || uaCode == null) {
            return undefined;
        }
        var code = undefined;

        if (typeof (uaCode) == 'string') {
            code = uaCode;
            uaCode = {};
        } else {
            // Validate and add defaults.
            code = uaCode[_getGAPrefix() + gaWrap.environment];
        }

        if (typeof (code) == 'undefined') {
            return undefined;
        }

        var obj = {};
        _setDefault(uaCode, obj, _getGAPrefix() + gaWrap.environment, code);
        _setDefault(uaCode, obj, _getGAPrefix() + gaWrap.environment + 'DomainName', undefined);
        return obj;
    };

    //Private function
    var _trackPageView = function(page) {
        if (typeof (gaWrap.pageTracker) == 'undefined') {
            _debuggerMessage('No Google page tracker', true);
            return;
        }

        if (typeof (page) == 'undefined') {
            _debuggerMessage('trackPageView No Page');
            gaWrap.pageTracker._trackPageview();
        } else {
            _debuggerMessage('trackPageView: ' + page);
            gaWrap.pageTracker._trackPageview(page);
        }
    };

    var _trackTrans = function(transObj) {
        if (typeof (gaWrap.pageTracker) == 'undefined') {
            _debuggerMessage('No Google page tracker', true);
            return;
        }

        var errors = [];

        // Validate transObj.
        if (typeof (transObj.orderId) == 'undefined' || transObj.orderId == null) {
            errors.push('Order ID Required');
        }
        if (typeof (transObj.total) == 'undefined' || transObj.total == null) {
            errors.push('Total Required');
        }
        if (typeof (transObj.items) == 'undefined' || transObj.items == null) {
            errors.push('Items are Required');
        }
        if (typeof (transObj.items) != 'undefined' && transObj.items != null && transObj.items.length == 0) {
            errors.push('Items are Required');
        }

        var item;
        for (var i in transObj.items) {
            item = transObj.items[i];

            if (typeof (item.skuCode) == 'undefined' || item.skuCode == null || item.skuCode.length <= 0) {
                errors.push('Item skuCode required');
            }
            if (typeof (item.unitPrice) == 'undefined' || item.unitPrice == null || item.quantity <= 0) {
                errors.push('Item unitPrice Required');
            }
            if (typeof (item.quantity) == 'undefined' || item.quantity == null || item.quantity <= 0) {
                errors.push('Item quantity Required');
            }
        }

        if (errors.length > 0) {
            _debuggerMessage('Track Trans: ' + errors.join(', '), true);
            return;
        }

        _debuggerMessage('add Trans: orderId=' + transObj.orderId +
            '&affiliation=' + transObj.affiliation + '&total=' + transObj.total +
            '&tax=' + transObj.tax + '&shipping=' + transObj.shipping +
            '&city' + transObj.city + '&state=' + transObj.state + '&country=' + transObj.country);

        gaWrap.pageTracker._addTrans(
              transObj.orderId, //"1234", // order ID - required
              transObj.affiliation, // "Womens Apparel", // affiliation or store name
              transObj.total, // "11.99", // total - required
              transObj.tax, // "1.29", // tax
              transObj.shipping, // "15.00", // shipping
              transObj.city, // "San Jose", // city
              transObj.state, // "California", // state or province
              transObj.country //"USA" // country
            );

        for (var i in transObj.items) {
            item = transObj.items[i];

            _debuggerMessage('add item: orderId=' + transObj.orderId +
                    '&skuCode=' + item.skuCode + '&productName=' + item.productName +
                    '&category=' + item.category + '&unitPrice=' + item.unitPrice +
                    '&quantity' + item.quantity);

            gaWrap.pageTracker._addItem(
                      transObj.orderId, //"1234", // order ID - necessary to associate item with transaction
                      item.skuCode, //"DD44", // SKU/code - required
                      item.productName, //"T-Shirt", // product name
                      item.category, //"Olive Medium", // category or variation
                      item.unitPrice, // "11.99", // unit price - required
                      item.quantity // "1" // quantity - required
                   );
        }

        _debuggerMessage('Track Trans');
        gaWrap.pageTracker._trackTrans();
    };

    //Private function
    var _createPageTracker = function(obj) {
        var uaCode = obj[_getGAPrefix() + environment];

        if (typeof (uaCode) == 'undefined') {
            _debuggerMessage('No UA Code');
            return;
        }

        gaWrap.pageTracker = _gat._getTracker(uaCode);
    };

    if (typeof (environment) != 'string' || environment.length == 0) {
        environment = 'Live';
    };

    gaWrap.environment = environment;
    if (typeof (uaCode) == 'undefined' && typeof (Hollard) != 'undefined') {
        uaCode = Hollard.Brand;
    }


    // Set the debugger mode here.
    _setDebug('debugger', 'wrapperDebug');

    // Start of GA Wrap.
    if (!_isGAValid()) {
        _debuggerMessage('GA Does not exist!', true);
        return;
    }

    // Create the GA Object used for tracking
    var obj = _createObj(uaCode);
    if (typeof (obj) == 'undefined') {
        _debuggerMessage('Issue with UA Object', true);
        return;
    }

    // check if the ua code exists.
    var uaCodeKey = _getGAPrefix() + gaWrap.environment;
    var uaCodeValue = obj[uaCodeKey];
    if (typeof (uaCodeValue) == 'undefined') {
        _debuggerMessage('Issue with UA Object', true);
        return;
    }

    _debuggerMessage('Environment: ' + gaWrap.environment);
    _debuggerMessage('GA Code: ' + uaCodeValue);

    // Create the google page tracker object
    _createPageTracker(obj);

    // Set the domain name if exists.
    var domainNameKey = _getGAPrefix() + gaWrap.environment + 'DomainName';
    var domainName = obj[domainNameKey];
    if (!_isUndefinedOrNull(domainName)) {
        _setDomainName(domainName);
    }

    _trackPageView(page);

    // The public facing objects for google tracking.
    return {
        // Display message if in debugger mode.
        debuggerMessage: _debuggerMessage,
        // Checks if _gat exists on the page.
        isGAValid: _isGAValid,
        // The prefix used in the GA Object used for tracking
        getGAPrefix: _getGAPrefix,
        setDomainName: _setDomainName,
        trackPageView: _trackPageView,
        trackTrans: _trackTrans
    };
};

