if (typeof DISPLAY_NOJS == "undefined")
{
    // Variables we use throughout the application
    window.sdgoogle = window.sdgoogle || {}; // global namespace for slickdeals js google

    var sdgoogle = window.sdgoogle;
    sdgoogle.scopes = 'https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email';

    // boolean flag sets true when user is logged in on slickdeals
    sdgoogle.SDLoggedIn = false;
    sdgoogle.complete_signup = false;
    sdgoogle.chosen_username = '';
    sdgoogle.google_auth_token = '';
    sdgoogle.clientId = '848950106722-o17212am4mt231tdgatgrh2p1b8shjq1.apps.googleusercontent.com';
    if (typeof sdgoogle_settings != "undefined" && sdgoogle_settings.clientId)
    {
        sdgoogle.clientId = sdgoogle_settings.clientId;
    }
    sdgoogle.apiKey = '';
    sdgoogle.do_link = false;
    sdgoogle.authResult = '';
    sdgoogle.newsletter = 0;
    sdgoogle.actionSource = null;
    sdgoogle.regUrl = '';
    sdgoogle.autoReg = false;
    sdgoogle.modern = true;
    sdgoogle.forceUsername = true;
    sdgoogle.sdkLoaded = false;
    sdgoogle.skipChangeUsername = false;
    sdgoogle.registrationTracking = {};

    sdgoogle.isExtension = function()
    {
        return window.dataLayer.visitor.layout === 'Extension';
    }

    sdgoogle.getWindowParent = function ()
    {
        return sdgoogle.isExtension() ? window : window.parent;
    };

    sdgoogle.signUpClickHandler = function (event)
    {
        var $elm = $(event.currentTarget);
        var loginOptions = $elm.data('login-options') || {};

        sdgoogle.trackAttempt(loginOptions.regLogForm);

        sdgoogle.checkGoogleAuth(loginOptions);
    };

    sdgoogle.trackAttempt = function (regLogForm)
    {
        if (window.SD && window.SD.RegLog && regLogForm)
        {
            sdgoogle.registrationTracking = window.SD.RegLog.socialAttempt(regLogForm, 'google');
        }
    };

    sdgoogle.getSDKLoadPriority = function ()
    {
        var criticalPathLocations = [
            '/forums/register.php',
            '/forums/login.php'
        ];

        return criticalPathLocations.indexOf(window.location.pathname) > -1 ? 'criticalPath' : 'nonCriticalUi';
    };

    $(document).ready(function () {
        var isModal = /modal=[^0.]/.test(window.location.search);

        $('#google-authorize-button').click(function (e) {
            sdgoogle.checkGoogleAuth({actionSource: sdgoogle.actionSource, regUrl: sdgoogle.regUrl});
        });

        $("#unlinkGoogle").click(function (e) {
            sdgoogle.UnlinkGoogleCheck();

            e.preventDefault();
            return false;
        });

        // Click the link google button from account settings page
        $("#link_google").click(function (e) {
            sdgoogle.do_link = true;
            sdgoogle.checkGoogleAuth({actionSource: sdgoogle.actionSource, regUrl: sdgoogle.regUrl});

            e.preventDefault();
            return false;
        });

        if (isModal)
        {
            $('#linkaccount_google form, #choose_username_google').submit(function(ev){
                sdgoogle.handleAjaxRequest(ev);
            });
        }
    });

    handleGoogleClientLoad = function()
    {
        gapi.auth.init(function(){});
        // gapi.auth.authorize({client_id: sdgoogle.clientId, scope: sdgoogle.scopes, immediate: true}, sdgoogle.handleGoogleAuthResult);
        sdgoogle.sdkLoaded = true;

        $(document).ready(function()
        {
            sdgoogle.initializeButtons();
        });

        $(document).on('click', '[data-role="googleSignUp"]', sdgoogle.signUpClickHandler);
    };

    sdgoogle.initializeButtons = function()
    {
        $('[data-role="googleSignUp"]').prop('disabled', false);
    };

    sdgoogle.checkGoogleAuth = function(loginArgs)
    {
        loginArgs = loginArgs || {};
        sdgoogle.actionSource = loginArgs.actionSource;
        sdgoogle.regUrl       = loginArgs.regUrl;
        sdgoogle.autoReg      = loginArgs.autoReg || false;
        sdgoogle.goToRegUrl   = loginArgs.goToRegUrl || false;
        sdgoogle.skipChangeUsername = loginArgs.skipChangeUsername || false;

        if ($('#loginbox_signin_ajax'))
        {
            $('#loginbox_signin_ajax').css('display', 'inline-block');
            $('#loginbox_signin_ajax > img').attr('src', '/images/slickdeals/ajaxsmall.gif');
        }

        if ($('.loginbox_box').length)
        {
            $('.loginbox_box').block({
                message: null,
                overlayCSS:  {
                    backgroundColor: '',
                    opacity: 'inherit',
                    timeout: 5000
                }
            });
        }

            gapi.auth.authorize({
                client_id: sdgoogle.clientId,
                scope: sdgoogle.scopes,
                immediate: loginArgs.immediate || false,
                authuser: -1,
                emitSuccess: loginArgs.emitSuccess
            }, sdgoogle.handleGoogleAuthResult);
    };

    sdgoogle.handleGoogleAuthResult = function(authResult)
    {
        var authorizeButton = $('#google-authorize-button');

        if (authResult && !authResult.error)
        {
            if (typeof authResult['created'] == "undefined")
            {
                authResult['created'] = (new Date).getTime();
            }
            sdgoogle.makeGoogleApiCall(authResult);

        }
        else
        {
            authorizeButton.css('visibility', '');
            authorizeButton.click(sdgoogle.handleGoogleAuthClick);
        }
        sdgoogle.authResult = authResult;
    };

    sdgoogle.handleGoogleAuthClick = function(event) {
        gapi.auth.authorize({client_id: sdgoogle.clientId, scope: sdgoogle.scopes, immediate: false}, sdgoogle.handleGoogleAuthResult);
        return false;
    };

    sdgoogle.doLink = function()
    {
        var passwordModal = new PasswordModal({
            headline: 'Please enter your password',
            message: 'This action requires you to enter your Slickdeals password.',
            onSubmit: function(password){
                var settings = {
                    type: 'post',
                    data: {
                        do: 'check_password',
                        securitytoken: SECURITYTOKEN,
                        password: password,
                        action: 'link_google',
                        access_token: sdgoogle.google_auth_token
                    },
                    url: '/ajax/profile_ajax.php',
                    dataType: 'json'
                };

                $.ajax(settings).done(function(response){
                    passwordModal.close();

                    if (response.error)
                    {
                        new ErrorModal(response.error);
                    }
                    else
                    {
                        location.reload(true);
                    }
                });
            }
        });
    };

    sdgoogle.doLinkClassic = function()
    {
        var html = 'This action requires you to enter your Slickdeals.net password.<br />' +
                   '<input type="password" name="password" id="link_google_password" />';

        okfunc = function()
        {
            var password = $("#link_google_password").val();
            var params = {
                'do': 'check_password',
                'securitytoken': SECURITYTOKEN,
                'password': password,
                'action': 'link_google',
                'access_token': sdgoogle.google_auth_token
            };

            $.post("/ajax/profile_ajax.php", params,
                function (data)
                {
                    if (data.error)
                    {
                        errordialog(data.error, false, 300);
                    }
                    else
                    {
                        location.reload(true);
                    }
                },
                "json"
            );
        };

        genericdialog("Please enter your password", html, null, okfunc);
        $("#link_google_password").focus().keypress(function (e) {
            if (e.keyCode == 13)
            {
                $(e.target).closest(".ui-dialog").find(".ui-dialog-buttonpane button").click();
            }
        });
    };

    sdgoogle.afterChooseUsernameFormGoogle = function()
    {
        $('#regform_checkusername').click(function(){
            var params = {
                'do': 'check_username',
                'securitytoken': window.SECURITYTOKEN,
                'username': $('#regform_choose_username').val(),
                'action_source': sdgoogle.actionSource,
                'regUrl': sdgoogle.regUrl
            };

            $.ajax({
                url: '/forums/sdlogin.php',
                cache: false,
                data: params,
                dataType: 'json',
                type: 'POST',
                success: function (data) {
                    if (data.form)
                    {
                        sdfollowers.getMoreRecommendedFriends(data);

                        SD.Analytics.dtmTrackRegLogin('rLLinkSuccess', sdgoogle.actionSource);
                    }
                    else
                    {
                        if (data.error == true)
                        {
                            $('#regform_submit').css('display', 'none');
                            $('#regform_errormessage').html(data.message);
                            $('#regform_username_good').css('display', 'none');
                            $('#regform_username_notgood').css('display', 'inline-block');
                        }
                        else
                        {
                            $('#regform_errormessage').html('');
                            $('#regform_submit').css('display', 'block');
                            $('#regform_username_notgood').css('display', 'none');
                            $('#regform_username_good').css('display', 'inline-block');
                        }
                    }
                }
            });
            return false;
        });

        $('#regform_submit').click(function(){
            complete_signup = true;
            chosen_username = $('#regform_choose_username').val();
            sdgoogle.checkGoogleAuth({actionSource: sdgoogle.actionSource, regUrl: sdgoogle.regUrl});
        });
    };

    // Unlinks the current account from google, and deauthorizes the app
    sdgoogle.UnlinkGoogle = function()
    {
        $.post("/ajax/profile_ajax.php",
            {
                "do": "unlink_google",
                "securitytoken": SECURITYTOKEN
            },
            function(data)
            {
                if (data.error)
                {
                    errordialog(data.error, false, 200);
                    return false;
                }
                else
                {
                    location.reload();
                }
            },
            "json"
        );
    };

    sdgoogle.UnlinkGoogleCheck = function ()
    {
        genericdialog("Are you sure?", "Are you sure you want to unlink your slickdeals account from google?", false,
        function () {
            sdgoogle.UnlinkGoogle();
        },
        function () {

        });
    };

    sdgoogle.formHandlers = function(actionSource)
    {
        sdgoogle.actionSource = actionSource;
        sdgoogle.regUrl       = '/';
        sdgoogle.autoReg      = false;
        sdgoogle.goToRegUrl   = true;
        sdgoogle.postRedirect = true;

        sdgoogle.initForms();
    };

    sdgoogle.initForms = function()
    {
        var $overlay = $("#loginbox_overlay");
        var $ajaxForm = $("#loginbox_signin_ajax");
        var $usernameInput = $("#regform_choose_username");
        var $checkUsernameButton = $("#regform_checkusername");
        var $regSubmitButton = $("#regform_submit");
        var $usernameStatus = $('#regform_username_status');
        var $usernameSpinner = $usernameStatus.children("img");
        var $usernameError = $('#regform_errormessage');

        $('form.frm_choose_username .meh').click(function(){
            $('#loginbox_overlay.loginbox_overlay_chooseuser').remove();
        });

        $overlay.click(function(elem){
            if ($(elem.target).attr('id') == 'loginbox_overlay')
            {
                $overlay.remove();
                $ajaxForm.hide();
            }
        });
        $('.meh', $overlay).click(function(){
            $overlay.remove();
            $ajaxForm.hide();
        });

        $usernameInput.keyup(function(){
            $regSubmitButton.hide();
        });
        $usernameInput.keypress(function(e){
            if (e.keyCode == 13) return false;
        });

        $("#popup_dialog_newsletter_link").click(function () {
            $('#dialog_newsletter').dialog('open');
            return false;
        });

        $('.meh').on('click', function() {
            $overlay.hide();
        });

        $('#regform_submit').prop('disabled', false);

        $checkUsernameButton.click(function(){
            $usernameSpinner.attr('src', '/images/slickdeals/ajaxsmall.gif');
            $usernameStatus.css('display', 'inline-block');

            var source =  $checkUsernameButton.data('source');
            var params = {
                'do': 'check_username',
                'securitytoken': window.SECURITYTOKEN,
                'username': $usernameInput.val(),
                'action_source': sdgoogle.actionSource,
                'regUrl': sdgoogle.regUrl
            };

            $.ajax({
                url: '/forums/sdlogin.php',
                cache: false,
                data: params,
                dataType: 'json',
                type: 'POST',
                success: function(data){
                    if (data.form)
                    {
                        sdfollowers.RecommendedFriendsDialog(data);

                        SD.Analytics.dtmTrackRegLogin('rLLinkSuccess', sdgoogle.actionSource);
                    }
                    else
                    {
                        if (data.error == true)
                        {
                            SD.Analytics.signUpTrack('unsuccessful');
                            if (source == "mobile3") {
                                $regSubmitButton.hide();
                                $usernameStatus.html('Username has already been registered&hellip;')
                                    .removeClass('success')
                                    .addClass('failure')
                                    .show();
                            }
                            else
                            {
                                $regSubmitButton.hide();
                                $usernameError.html(data.message);
                                $usernameSpinner.attr('src', '/images/slickdeals/cross.png');
                            }
                        }
                        else
                        {
                            if (source == "mobile3") {
                                $usernameStatus.html('Username is available!')
                                    .removeClass('failure')
                                    .addClass('success')
                                    .show();
                                $regSubmitButton.show();
                            }
                            else
                            {
                                $usernameError.html('');
                                $regSubmitButton.show();
                                $usernameSpinner.attr('src', '/images/slickdeals/tick.png');

                                // Successful choosing of username
                                SD.Analytics.dtmTrackRegLogin('rLLinkSuccess', sdgoogle.actionSource);
                            }
                        }
                    }
                }
            });
            return false;
        });

        function handleChooseUserSubmitGoogle() {
            if (this.requireJS)
            {
                sdgoogle = this.sdgoogle;
            }

            $('.loginbox_form_container').block({
                message: null,
                overlayCSS:  {
                    backgroundColor: '',
                    opacity: 'inherit',
                    timeout: 5000
                }
            });

            sdgoogle.complete_signup = true;
            sdgoogle.chosen_username = $('#regform_choose_username').val();

            if ($('#chk_newsletter').is(':checked') == true)
            {
                sdgoogle.newsletter = 1;
            }
            else
            {
                sdgoogle.newsletter = 0;
            }

            sdgoogle.checkGoogleAuth({actionSource: sdgoogle.actionSource, regUrl: sdgoogle.regUrl, emitSuccess: true});
        }

        $('#regform_submit').click(function() {
            handleChooseUserSubmitGoogle();
        });

        $('#sdssoForm').submit(googleSSOLinkTracking);
    };

    window.googleSSOLinkTracking = function () {
        params = $('#sdssoForm').serialize();
        $.ajax({
            url: '/forums/sdlogin.php',
            cache: false,
            data: params,
            dataType: 'json',
            type: 'POST',
            success: function(data) {
                if (data.successful_link == true)
                {
                    SD.Analytics.dtmTrackRegLogin('rLSuccess', sdgoogle.actionSource);

                    if (sdgoogle.isExtension())
                    {
                        window.location = sdgoogle.regUrl;
                    }
                    else
                    {
                        // redirect to fp
                        location.href = "/";
                    }
               }
            }
       });

        return false;
    };

    sdgoogle.makeGoogleApiCall = function(access_token)
    {
        // the bulk of this code is copied from the sdgoogle.js code, changing the inner code handling
        gapi.client.load('oauth2', 'v2', function(){
            var request = gapi.client.oauth2.userinfo.get({
                userId: 'me'
            });
            request.execute(function(resp){
                var params = {
                    'do': (typeof(type) == 'undefined') ? 'google' : type,
                    'type': 'userinfo',
                    'securitytoken': window.SECURITYTOKEN,
                    'complete_signup': sdgoogle.complete_signup,
                    'chosen_username': sdgoogle.chosen_username,
                    'do_link': sdgoogle.do_link,
                    'newsletter': sdgoogle.newsletter,
                    'forceUsername': sdgoogle.forceUsername,
                    'access_token': {
                        'access_token': access_token.access_token,
                        'created': access_token.created,
                        'expires_in': access_token.expires_in,
                        'state': access_token.state,
                        'token_type': access_token.token_type
                    },
                    'action_source': sdgoogle.actionSource,
                    'regUrl': sdgoogle.regUrl,
                    'goToRegUrl': sdgoogle.goToRegUrl,
                    'registrationTracking': sdgoogle.registrationTracking
                };
                sdgoogle.google_auth_token = params['access_token'];

                if (sdgoogle.do_link == true)
                {
                    if (window.dataLayer.visitor.layout == 'Classic')
                    {
                        sdgoogle.doLinkClassic();
                    }
                    else
                    {
                        sdgoogle.doLink();
                    }
                    return;
                }

                $.ajax({
                    url: '/forums/sdlogin.php',
                    cache: false,
                    data: params,
                    dataType: 'json',
                    type: 'POST',
                    success: function(data){
                        if (data.task == 'sso_link')
                        {
                            // account needs linking
                            sdgoogle.linkAccountForm(data);
                        }
                        else if (data.form && $('#loginForm, #registerForm').data('experience') === 'mobileWeb')
                        {
                            $('#loginbox_overlay').remove();
                            $('body').append(data.form);
                            $('#loginbox_overlay').show();

                            sdgoogle.initForms();
                        }
                        else if (data.task == 'choose_username')
                        {
                            if (sdgoogle.skipChangeUsername)
                            {
                                sdgoogle.getWindowParent().location = sdgoogle.regUrl;

                                return;
                            }

                            var url = '/forums/login.php?do=social-complete';

                            if (isModal)
                            {
                                url += '&modal=1';
                            }

                            if (sdgoogle.regUrl)
                            {
                                url += '&url=' + encodeURIComponent(sdgoogle.regUrl);
                            }

                            if (sdgoogle.autoReg)
                            {
                                $('.autoRegisterModal').hide();
                                require(['sd/registration/autoRegistrationUsernameModal'], function(AutoRegistrationUsernameModal){
                                    new AutoRegistrationUsernameModal({
                                        accessToken: sdgoogle.google_auth_token,
                                        securityToken: SECURITYTOKEN,
                                        actionSource: sdgoogle.actionSource,
                                        regUrl: sdgoogle.regUrl,
                                        username: data.chosen_username,
                                        type: 'google'
                                    }).show();
                                });
                            }
                            else
                            {
                                location.href = url;
                            }
                        }
                        else if (data.success == true)
                        {
                            $('#loginbox_signin_ajax').hide();

                            if (sdgoogle.isExtension())
                            {
                                window.location = sdgoogle.regUrl;
                            }
                            else if (data.info && data.info.goto != null)
                            {
                                window.parent.location = data.info.goto;
                            }
                            else
                            {
                                // TODO: Let the server side code handle the url redirecting for non-modal pages
                                window.parent.location.reload(true);
                            }
                        }
                        else if (data.error == true)
                        {
                            sdgoogle.getWindowParent().errordialog(data.message);
                        }
                    }
                });
            });
        });
    };

    sdgoogle.linkAccountForm = function(data)
    {
        var params = {
            'do': 'sso-link',
            'type': 'google',
            'username': data.username,
            'socialEmail': data.socialEmail,
            'socialName': data.socialName,
            'access_token': data.accessToken,
            'action_source': data.actionSource,
            'regUrl': data.regUrl,
            'goToRegUrl': data.goToRegUrl,
            'securitytoken': SECURITYTOKEN
        };

        var url = '/forums/login.php';

        if (isModal)
        {
            url += '?modal=1';
        }

        if (sdgoogle.autoReg)
        {
            url += '?auto=1';
        }

        postLocationRedirect(url, params);
    };

    sdgoogle.handleAjaxRequest = function(ev)
    {
        // this will hijack the form submission
        // and make it an ajax call instead
        // this allows us to handle refreshing the page after the user logs in
        ev.preventDefault();

        var requestUrl = $(ev.currentTarget).attr('action');
        var params = {};

        if (isModal)
        {
            params['ajax'] = 1;
        }

        $(ev.currentTarget).find('input[name]').each(function(index){
            // get all the input fields and load it into a params
            if ($(this).is('[type=checkbox]'))
            {
                // check whether its checked
                params[$(this).attr('name')] = $(this).prop('checked') ? 1 : 0;
            }
            else
            {
                params[$(this).attr('name')] = $(this).val();
            }
        });

        $.post(requestUrl, params, function(data){
            if (data.success)
            {
                var userId = data.userid;

                if (params.newsletter)
                {
                    SD.Analytics.newsletterTrack('successful');
                }

                if (params.goToRegUrl && params.regUrl)
                {
                    window.parent.location = params.regUrl;
                }
                else
                {
                    window.parent.location.reload();
                }
            }
            else if (data.successful_link)
            {
                if (params.goToRegUrl && params.regUrl)
                {
                    window.parent.location = params.regUrl;
                }
                else
                {
                    window.parent.location.reload();
                }
            }
            else if (data.message)
            {
                SD.Analytics.signUpTrack('unsuccessful');

                if (params.newsletter)
                {
                    SD.Analytics.newsletterTrack('unsuccessful');
                }
                $('.chooseUsername .status').show();
                $('.chooseUsername .errorTxt').html(data.message);
            }
            // TODO: Handle additional errors
        });
    };

    // Load the SDK Asynchronously
    window.sdLoadQueue.push([function() {
        (function(d){
            var js, id = 'google-jssdk', ref = d.getElementsByTagName('script')[0];
            if (d.getElementById(id))
            {
                return;
            }
            js = d.createElement('script');
            js.id = id;
            js.async = true;
            js.type = 'text/javascript';
            js.src = 'https://apis.google.com/js/client.js?onload=handleGoogleClientLoad';
            ref.parentNode.insertBefore(js, ref);
        }(document));
    }, sdgoogle.getSDKLoadPriority()]);
}