// Copyright @ SurveyOL.com. All rights reserved.
var $shared = $shared || {};

$shared.filterChoiceList = function ($this) {
    var typed = $this.val();
    var sec = $this.closest(".so-choicelist-section");
    sec.find(".so-choice-container").removeClass("nodisp");
    sec.find(".so-choice-container").find(".choice-pointer").each(function () {
        if ($.trim($(this).text()).toLowerCase().indexOf(typed.toLowerCase()) >= 0) {
            $(this).removeClass("nodisp");
        } else {
            $(this).addClass("nodisp");
        }
    });
};

$shared.focusListItem = function ($this, e) {
    var sec = $this.closest(".so-choicelist-section");
    var focused = sec.find(".choice-pointer.choice-focus:not(.nodisp)");
    var current, pointerHeight;
    if (e.keyCode === 13) {
        if (focused.length > 0) {
            sec.find(".choice-pointer.choice-focus:not(.nodisp)").eq(0).click();
        }
    } else if (e.keyCode === 40) { // Arrow down
        if (focused.length === 0) {
            sec.find(".choice-pointer:not(.nodisp)").eq(0).addClass("choice-focus");
        } else {
            current = focused.eq(0);
            var next = current.nextAll(".choice-pointer:not(.nodisp)");
            if (next.length > 0) {
                focused.removeClass("choice-focus");
                next.eq(0).addClass("choice-focus");
                pointerHeight = current.outerHeight();
                if (sec.find(".so-choicebox").length > 0) {
                    sec.find(".so-choicebox")[0].scrollTop += pointerHeight;
                }
            }
        }
    } else if (e.keyCode === 38) { // Arrow up
        if (focused.length > 0) {
            current = focused.eq(0);
            var prev = focused.eq(0).prevAll(".choice-pointer:not(.nodisp)");
            if (prev.length > 0) {
                focused.removeClass("choice-focus");
                prev.eq(0).addClass("choice-focus");
                pointerHeight = current.outerHeight();
                if (sec.find(".so-choicebox").length > 0) {
                    sec.find(".so-choicebox")[0].scrollTop -= pointerHeight;
                }
            }
        }
    } else {
        if (sec.find(".so-choicebox").length > 0) {
            sec.find(".so-choicebox")[0].scrollTop = 0;
        }
        sec.find(".choice-pointer:not(.nodisp)").removeClass("choice-focus");
        sec.find(".choice-pointer:not(.nodisp)").eq(0).addClass("choice-focus");
    }
};

$shared.shouldChangeType = function () {
    var action = $sog.getUrlParameterByKey("action");
    if (action === "extendTrial" || action === "convertTrialToFree") {
        return true;
    } else {
        return false;
    }
};

$shared.changeTypeActions = function (fnCallback) {
    var action = $sog.getUrlParameterByKey("action");
    if (action === "extendTrial") {
        $shared.extendTrial(fnCallback);
    } else if (action === "convertTrialToFree") {
        $shared.convertTrialToFree(fnCallback);
    }
};

$shared.extendTrial = function (fnCallback) {
    var token = $sog.getUrlParameterByKey("token");
    $.ajax({
        method: "POST",
        url: "/account/extendtrial",
        data: JSON.stringify({ token: token }),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag && result.successful) {
            if (fnCallback) {
                fnCallback();
            }
            $sog.showMessage($sog.messages.trialExtended);
        } else {
            $logbrite.addMinorActivityTracking("fails to extend trial");
        }
    });
};

$shared.convertTrialToFree = function (fnCallback) {
    var token = $sog.getUrlParameterByKey("token");
    $.ajax({
        method: "POST",
        url: "/account/converttrialtofree",
        data: JSON.stringify({ token: token }),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag && result.successful) {
            if (fnCallback) {
                fnCallback();
            }
            $sog.showMessage($sog.messages.trialConvertedToFree);
        } else {
            $sog.showMessage($sog.message.linkExpired);
            $logbrite.addMinorActivityTracking("fails to convert trial to free");
        }
    });
};

$shared.convertToFree = function (fnCallback) {
    $.ajax({
        method: "POST",
        url: "/account/converttofree",
        beforeSend: function (request) {
            request.setRequestHeader("Authorization", "bearer " + $sog.getAccountToken());
        },
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag && result.successful) {
            if (fnCallback) {
                fnCallback();
            }
            var action = $("<a/>").attr("href", "/dashboard").html($sog.messages.viewDashboard);
            $sog.showMessage($sog.messages.convertedToFree, action);
        } else {
            $logbrite.addMinorActivityTracking("fails to convert to free");
        }
    });
};

$shared.getSubscriptionLimit = function (fnCallback) {
    $.ajax({
        method: "GET",
        beforeSend: function (request) {
            request.setRequestHeader("Authorization", "bearer " + $sog.getAccountToken());
        },
        url: "/account/getsubscriptionlimit",
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag && result.signedin) {
            if (fnCallback) {
                fnCallback(result);
            }
        } else {
            $logbrite.addErrorActivityTracking("could not get subscription limit");
        }
    }).fail(function () {
        $logbrite.addErrorActivityTracking("fails to get subscription limit");
    });
};

// Copyright @ SurveyOL.com. All rights reserved.
var $surveyol = $surveyol || {};

$surveyol.initializeHome = function () {
    var token = $sog.getAccountToken();
    var hrs = $sog.getAccountExpirationHours();
    var source = $sog.getUrlParameterByKey("source");
    if (token && (hrs === undefined || hrs === null || hrs > 0) && source !== "dashboard") {
        window.location.href = "/dashboard";
        return false;
    } else {
        $surveyol.showTransferredMessage();
    }
    var email = $sog.getUrlParameterByKey("email");
    if (email.length > 0) {
        $(".register-link").attr("href", "/freetrial?email=" + email);
    }
    if ($sog.getBrowserEmail()) {
        // Returning users
        $(".new-user-row").addClass("nodisp");
        $("#accountEmail").val($sog.getBrowserEmail());
        $(".not-you").removeClass("nodisp");
        $("#accountPassword").focus();
        $(".new-user-banner").addClass("nodisp");
        $(".return-user-banner").removeClass("nodisp");
    } else {
        // New users
        $(".new-user-banner").removeClass("nodisp");
        $(".return-user-banner").addClass("nodisp");
    }
    $(".arrowDown").on("click", function (e) {
        e.preventDefault();
        $sog.scrollTo($(this).offset().top);
    });
    $surveyol.setRememberMe();
    // Coupon
    var couponCode = $sog.getUrlParameterByKey($sog.sources.coupon);
    if (couponCode) {
        $sog.setBrowserCoupon(couponCode);
        $sog.showMessage($sog.messages.couponApplied.replace("{0}", couponCode), $surveyol.getFindMoreAction(couponCode), 10000);
    }
    // Taglines 
    $surveyol.toggleTaglineCursor();
    $surveyol.rotateTaglines(0, 5, -1);
};

$surveyol.getFindMoreAction = function (couponCode) {
    var findMoreIcon = $("<i/>").addClass("fas fa-rm fa-chevron-circle-right icon14").attr("aria-hidden", "true");
    var linkUrl = couponCode !== undefined ? "/pricing?coupon=" + couponCode : "/pricing";
    var findMoreAction = $("<a/>").attr("href", linkUrl).html($sog.sources.findMore);
    var findMoreBlock = $("<div/>").addClass("inline-block").append(findMoreIcon).append(findMoreAction);
    var actionsBlock = $("<div/>").addClass("inline-block").append(findMoreBlock);
    return actionsBlock;
};

$surveyol.toggleTaglineCursor = function () {
    setTimeout(function () {
        if ($(".tagline-cursor").hasClass("nodisp")) {
            $(".tagline-cursor").removeClass("nodisp");
            $(".tagline-cursor-alternative").addClass("nodisp");
        } else {
            $(".tagline-cursor").addClass("nodisp");
            $(".tagline-cursor-alternative").removeClass("nodisp");
        }
        $surveyol.toggleTaglineCursor();
    }, 500);
};

$surveyol.rotateTaglines = function (tagIndex, holdCycles, forward) {
    var maxCycles = 30;
    var taglines = ["Professional. Effective. Easy.", "Survey + OnLine = SurveyOL", "Make Better Decisions", "Enhance Customer Satisfaction",
        "Increase Employee Engagement", "Optimize Product Experience", "Boost Event Attendance"];
    setTimeout(function () {
        if (holdCycles > 0) {
            holdCycles = holdCycles - 1;
        } else {
            var newTagline = forward === 1 ? taglines[tagIndex].substring(0, $(".tagline").text().length + 1)
                : $(".tagline").text().substring(0, $(".tagline").text().length - 1);
            $(".tagline").text(newTagline);
            if (newTagline.length === 0) {
                if (tagIndex < taglines.length - 1) {
                    tagIndex += 1;
                } else {
                    tagIndex = 0;
                }
                forward = 1;
                holdCycles = maxCycles;
            } else if (newTagline.length === taglines[tagIndex].length) {
                forward = -1;
                holdCycles = maxCycles;
            }
        }
        $surveyol.rotateTaglines(tagIndex, holdCycles, forward);
    }, 60);
};


$(function () {
    $surveyol.initializeHome();
});

// Copyright @ SurveyOL.com. All rights reserved.
function Account() {
    this.hasInitialSubmission = false;
}

Account.prototype.initializePricing = function () {3
    $(document).on("touchstart click", ".create-basic-account", function (e) {
        e.preventDefault();
        $sog.removeBrowserMemory();
        $sog.setBrowserAccountType($sog.sources.basic);
        window.location.href = "/register";
        return false;
    });
    $(document).on("touchstart click", ".create-basic-trial-account", function (e) {
        e.preventDefault();
        $sog.removeBrowserMemory();
        $sog.setBrowserAccountType($sog.sources.basicTrial);
        window.location.href = "/freetrial";
        return false;
    });
    $(document).on("touchstart click", ".create-free-account", function (e) {
        e.preventDefault();
        $sog.removeBrowserMemory();
        $sog.setBrowserAccountType($sog.sources.free);
        window.location.href = "/freeaccount";
        return false;
    });
    $(document).on("touchstart click", ".create-pro-account", function (e) {
        e.preventDefault();
        $sog.removeBrowserMemory();
        $sog.setBrowserAccountType($sog.sources.pro);
        window.location.href = "/register";
        return false;
    });
    $(document).on("touchstart click", ".create-pro-trial-account", function (e) {
        e.preventDefault();
        $sog.removeBrowserMemory();
        $sog.setBrowserAccountType($sog.sources.proTrial);
        window.location.href = "/freetrial";
        return false;
    });
    $(document).on("touchstart click", ".create-enterprise-account", function (e) {
        e.preventDefault();
        $sog.removeBrowserMemory();
        $sog.setBrowserAccountType($sog.sources.enterprise);
        window.location.href = "/register";
        return false;
    });
    $(document).on("touchstart click", ".create-enterprise-trial-account", function (e) {
        e.preventDefault();
        $sog.removeBrowserMemory();
        $sog.setBrowserAccountType($sog.sources.enterpriseTrial);
        window.location.href = "/freetrial";
        return false;
    });
    $(document).on("click", ".more-feature-link", function (e) {
        e.preventDefault();
        $(this).closest(".feature-block").find(".feature-item.nodisp").removeClass("nodisp");
        $(this).closest(".feature-item").remove();
    });
    // Display logged-in user message/button
    var email = $sog.getAccountEmail();
    if (email) {
        var type = $sog.getAccountType();
        $(".free-subscription, .free-subscribed, .pro-subscription, .pro-subscribed").addClass("nodisp");
        if (type === $sog.sources.pro) {
            $(".pro-subscribed").removeClass("nodisp");
        } else {
            $(".free-subscribed").removeClass("nodisp");
        }
    }
    // Coupon
    var couponCode = $sog.getUrlParameterByKey($sog.sources.coupon);
    if (couponCode) {
        $sog.setBrowserCoupon(couponCode);
        $.ajax({
            method: "GET",
            url: "/account/getcoupon",
            data: { code: couponCode },
            contentType: 'application/json; charset=utf-8',
            dataType: 'json'
        }).done(function (result) {
            if (result && result.flag) {
                if (result.valid) {
                    if (!result.expired) {
                        $sog.showMessage(result.description);
                    }
                }
            }
        });
    }
};

Account.prototype.getSubscription = function (fnCallback, fnFailCallback) {
    $.ajax({
        method: "GET",
        beforeSend: function (request) {
            request.setRequestHeader("Authorization", "bearer " + $sog.getAccountToken());
        },
        url: "/account/getsubscription",
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag) {
            $sog.setAccountProfile(result.account);
            if (fnCallback) {
                fnCallback(result);
            }
        } else {
            if (fnFailCallback) {
                fnFailCallback();
            }
            $logbrite.addErrorActivityTracking("could not get subscription");
        }
    }).fail(function () {
        if (fnFailCallback) {
            fnFailCallback();
        }
        $logbrite.addErrorActivityTracking("fails to get subscription");
    });
};

Account.prototype.setSubscription = function (subscription, userCount) {
    var type = subscription.type;
    var role = $surveyol.getTeamRole();
    if (subscription.type === $sog.sources.basic || subscription.type === $sog.sources.pro || subscription.type === $sog.sources.enterprise) {
        type = $sog.sources.subscriberSince.replace("{0}", subscription.type).replace("{1}", $sog.displayDate(new Date(subscription.startDate)));
        $(".buy-now-block").addClass("nodisp");
        $(".pro-subscription-block").removeClass("nodisp");
        $(".subscription-end-date").text($sog.displayDate(new Date(subscription.endDate)));
        if (subscription.autoRenew) {
            $(".stop-renewal-container").removeClass("nodisp");
            $(".resume-renewal-container").addClass("nodisp");
            $(".subscription-next-bill-date").text($sog.displayDate(new Date(subscription.nextBillDate)));
            $(".subscription-next-bill-date-section").removeClass("nodisp");
            $(".subscription-end-date-section").addClass("nodisp");
        } else {
            $(".stop-renewal-container").addClass("nodisp");
            if (subscription.isPaid) {
                $(".resume-renewal-container").removeClass("nodisp");
            }
            $(".subscription-end-date-section").removeClass("nodisp");
            $(".subscription-next-bill-date-section").addClass("nodisp");
        }
        if (subscription.type === $sog.sources.enterprise && role !== $sog.sources.primaryAdmin) {
            $(".stop-renewal-container").addClass("nodisp");
            $(".resume-renewal-container").addClass("nodisp");
            $(".change-subscription-link").addClass("nodisp");
            $(".subscription-next-bill-date-section").addClass("nodisp");
        }
        if (subscription.type === $sog.sources.enterprise && role === $sog.sources.primaryAdmin) {
            $(".subscription-user-count").text(userCount);
            $(".subscription-user-count-section").removeClass("nodisp");
        }
    } else if (subscription.type === $sog.sources.basicTrial || subscription.type === $sog.sources.proTrial) {
        type = $sog.sources.trialExpiresOn.replace("{0}", $sog.displayDate(new Date(subscription.endDate)));
        $(".buy-now-block").removeClass("nodisp");
        $(".pro-subscription-block").addClass("nodisp");
    } else if (subscription.type === $sog.sources.enterpriseTrial) {
        type = $sog.sources.trialExpiresOn.replace("{0}", $sog.displayDate(new Date(subscription.endDate)));
        if (role === $sog.sources.primaryAdmin) {
            $(".buy-now-block").removeClass("nodisp");
        } else {
            $(".buy-disallowed-block").removeClass("nodisp");
        }
        $(".pro-subscription-block").addClass("nodisp");
        if (subscription.type === $sog.sources.enterprise && role === $sog.sources.primaryAdmin) {
            $(".subscription-user-count").text(userCount);
            $(".subscription-user-count-section").removeClass("nodisp");
        }
    } else {
        $(".subscription-type").text(subscription.type);
        $(".upgrade-block").removeClass("nodisp");
        $(".pro-subscription-block").addClass("nodisp");
    }
    $(".subscription-type").text(type);
};

Account.prototype.preselectSubscription = function () {
    $account.getSubscription(function (result) {
        var role = $surveyol.getTeamRole();
        console.log(role);
        if (result.subscription.type === $sog.sources.enterprise) {
            if (role === $sog.sources.primaryAdmin) {
                $(".user-count").val(result.userCount);
                $account.getPricing();
            } else {
                //window.location.href = "/myaccount";
                return false;
            }
        }
    });
};

Account.prototype.initializeMyAccount = function () {
    var email = $sog.getAccountEmail();
    if (email) {
        $("#accountEmail").val($sog.getAccountEmail());
        if ($sog.getAccountSettings()) {
            $("#allowShare").prop("checked", $sog.getAccountSettings().allowShare);
            $("#allowTransfer").prop("checked", $sog.getAccountSettings().allowTransfer);
        }
        if ($sog.getAccountDesignDetailedView()) {
            $("input[name=designView][value=1]").prop("checked", true);
        } else {
            $("input[name=designView][value=0]").prop("checked", true);
        }
        if ($sog.getAccountFirstName()) {
            $("#firstName").val($sog.getAccountFirstName());
        }
        if ($sog.getAccountLastName()) {
            $("#lastName").val($sog.getAccountLastName());
        }
        if ($sog.getAccountCompanyName()) {
            $("#companyName").val($sog.getAccountCompanyName());
        }
        if ($sog.getAccountIndustry()) {
            $("#industry").val($sog.getAccountIndustry());
        }
        if ($sog.getAccountTimezone()) {
            $("#timezone").val($sog.getAccountTimezone());
        }
        var provider = $sog.getAccountProvider();
        if (provider && provider !== $sog.sources.surveyol) {
            $(".account-email-display").html(email);
            $(".account-email-social").removeClass("nodisp");
            $(".account-email-edit, .account-email-actions").addClass("nodisp");
        }
        $account.getSubscription(function (result) {
            $account.setSubscription(result.subscription, result.userCount);
            $account.setInsiderDisplay(result.account);
            $surveyol.setSubscriptionBar();
            $surveyol.setTeamRoleDisplay();
            $surveyol.setUpgradeLink();
        }, function () {
            window.location.href = "/dashboard";
            return false;
        });
        var nextDate = new Date().addDays(1).toISOString().split("T")[0];
        $(".token-expired-date").attr("min", nextDate);
        $account.listApiTokens();
    } else {
        window.location.href = "/signin?url=" + $sog.getUrlWithoutDomain();
        return false;
    }
};

Account.prototype.setInsiderDisplay = function (account) {
    if (account.isTest) {
        $("#accountSubscriptionSection .insider").removeClass("nodisp");
    }
};

Account.prototype.initializeSignIn = function () {
    $surveyol.setRememberMe();
    if ($sog.getUrlParameterByKey("email")) {
        $(".not-you").removeClass("nodisp");
        $("#accountEmail").val($sog.getUrlParameterByKey("email"));
        $("#accountPassword").focus();
    } else if ($sog.getAccountEmail()) {
        $(".not-you").removeClass("nodisp");
        $("#accountEmail").val($sog.getAccountEmail());
        $("#accountPassword").focus();
    } else if ($sog.getBrowserEmail()) {
        $(".not-you").removeClass("nodisp");
        $("#accountEmail").val($sog.getBrowserEmail());
        $("#accountPassword").focus();
    } else {
        $(".not-you").addClass("nodisp");
        $("#accountEmail").val("");
        $("#accountPassword").val("");
        $("#accountEmail").focus();
    }
    $sog.hideMessage();
    if ($sog.getUnclaimedSurvey()) {
        $sog.showMessage($sog.messages.surveyIncompleteToBeClaimed);
    } else {
        $surveyol.showTransferredMessage();
    }
    var token = $sog.getAccountToken();
    if (token) {
        $(".already-signed-in").removeClass("nodisp");
    } else {
        $(".already-signed-in").addClass("nodisp");
    }
    $shared.changeTypeActions();
};

Account.prototype.initializeSubcribe = function () {
    var email = $sog.getAccountEmail();
    if (email) {
        $("input[name=billingCycle][value=0]").prop("checked", true);
        $(".billing-cycle").on("click", function () {
            $account.showDueTodayAmount();
        });
        $(".cancel-subscribe").on("click", function (e) {
            e.preventDefault();
            $sog.removeBrowserAccountType();
            window.location.href = "/features";
            return false;
        });
        $(document).on("click", ".convert-to-free", function (e) {
            e.preventDefault();
            $shared.convertToFree();
        });
        $(document).on("click", ".vip-subscribe", function () {
            var couponCode = $sog.getBrowserCoupon();
            var planType = $("input[name=planType]:checked").val();
            $account.saveSubscription($("input[name=billingCycle]:checked").val(), planType, $(".user-count").val(), "Free", "", couponCode, function () {
                $(".submit-payment").prop("disabled", false);
                $(".submit-message").text("").addClass("nodisp");
                var url = $sog.getUrlParameterByKey("url");
                if (url) {
                    window.location.href = url + window.location.hash;
                } else {
                    window.location.href = "/myaccount";
                }
                return false;
            }, function () {
                $(".submit-payment").prop("disabled", false);
                $(".submit-message").text("").addClass("nodisp");
            });
        });
        $(document).on("click", ".plan-type", function () {
            if ($(this).attr("value") === $sog.sources.enterprise) {
                $(".user-count-section").removeClass("nodisp");
            } else {
                $(".user-count-section").addClass("nodisp");
            }
            $account.getPricing();
        });
        $(document).on("change", ".user-count", function () {
            $account.getPricing();
        });
        // Set enterprise user counts 
        var teamUsers = $sog.getAccountTeamUsers();
        var teamUserCount = teamUsers !== undefined && teamUsers.length > 0 ? teamUsers.length : 0;
        for (var iCount = $sog.sources.enterpriseMinUserCount; iCount <= $sog.sources.enterpriseMaxUserCount; iCount++) {
            if (iCount >= teamUserCount) {
                var optionElement = $("<option/>").attr("value", iCount).text(iCount);
                $("#mainArea .user-count").append(optionElement);
            }
        }
        if (teamUserCount > 1) {
            $("input.plan-type[value=Basic]").prop("disabled", true);
            $("input.plan-type[value=Pro]").prop("disabled", true);
        }
        $(".user-count").find("option").first().prop("selected", true);
        $(".user-count").find("option").last().text($sog.sources.unlimited);
        // Coupon
        var code = $sog.getUrlParameterByKey($sog.sources.coupon);
        if (code) {
            $sog.setBrowserCoupon(code);
            $sog.showMessage($sog.messages.couponApplied.replace("{0}", code), null, 10000);
        } else {
            code = $sog.getBrowserCoupon();
        }
        if (code) {
            $(".apply-coupon-section").addClass("nodisp");
            $(".coupon-section").addClass("nodisp");
            $("input[name=couponCode]").val(code);
            $account.getCoupon(code);
        }
        // Pre-select subscription 
        var type = $sog.getUrlParameterByKey("type") ? $sog.getUrlParameterByKey("type") : $sog.getAccountType();
        if (type == $sog.sources.free || type === $sog.sources.basic || type === $sog.sources.basicTrial) {
            $("input.plan-type[value=Basic]").click();
        } else if (type === $sog.sources.pro || type === $sog.sources.proTrial) {
            $("input.plan-type[value=Pro]").click();
        } else if (type === $sog.sources.enterprise || type === $sog.sources.enterpriseTrial) {
            $("input.plan-type[value=Enterprise]").click();
        }
        if (type === $sog.sources.enterprise) {
            $account.preselectSubscription();
        }
        // Hide links & show message if needed
        $account.setExpired();
    } else {
        window.location.href = "/signin?url=" + $sog.getUrlWithoutDomain();
        return false;
    }
};

Account.prototype.initializeFreeSurveyTool = function () {
    var email = $sog.getAccountEmail();
    if (email) {
        $(".new-customer-section").addClass("nodisp");
        $(".existing-customer-section").removeClass("nodisp");
        $(document).on("click", ".convert-to-free", function (e) {
            e.preventDefault();
            $shared.convertToFree();
        });
        $(document).on("click", ".get-subscription", function (e) {
            e.preventDefault();
            window.location.href = "/subscription";
            return false;
        });
    } else {
        $(".new-customer-section").removeClass("nodisp");
        $(".existing-customer-section").addClass("nodisp");
    }
    $(document).on("touchstart click", ".create-basic-trial-account", function (e) {
        e.preventDefault();
        $sog.removeBrowserMemory();
        $sog.setBrowserAccountType($sog.sources.basicTrial);
        window.location.href = "/freetrial";
        return false;
    });
    $(document).on("touchstart click", ".create-free-account", function (e) {
        e.preventDefault();
        $sog.removeBrowserMemory();
        $sog.setBrowserAccountType($sog.sources.free);
        window.location.href = "/freeaccount";
        return false;
    });
};

Account.prototype.initializeActivityLogs = function () {
    $.ajax({
        method: "GET",
        beforeSend: function (request) {
            request.setRequestHeader("Authorization", "bearer " + $sog.getAccountToken());
        },
        url: "/account/getactivitylogs",
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag) {
            if (result.signedin) {
                $account.setActivityLogs(result.userLogs);
            } else {
                window.location.href = "/signin?url=" + $sog.getUrlWithoutDomain();
                return false;
            }
        } else {
            console.log("could not get activity logs");
        }
    }).fail(function () {
        console.log("fails to get activity logs");
    });
};

Account.prototype.setActivityLogs = function (userLogs) {
    if (userLogs && userLogs.length > 0) {
        var ls = $(".logs-section");
        var logLines = [];
        for (var i = 0; i < userLogs.length; i++) {
            var log = userLogs[i];
            var logTrackings = JSON.parse(log.content);
            var iTracking;
            var tracking;
            for (iTracking = 0; iTracking < logTrackings.length; iTracking++) {
                tracking = logTrackings[iTracking];
            }
            for (iTracking = 0; iTracking < logTrackings.length; iTracking++) {
                tracking = logTrackings[iTracking];
                var trackingEle = $("<div/>").text($sog.displayDateTime($sog.getLocalDate(tracking.time)) + " " + tracking.title);
                if (tracking.priority && tracking.label !== "error") {
                    var trackingEleContainer = $("<div/>").append(trackingEle);
                    if (logLines.indexOf(trackingEleContainer.html()) === -1) {
                        logLines.push(trackingEleContainer.html());
                    }
                }
            }
        }
        for (var iLine = logLines.length - 1; iLine >= 0; iLine--) {
            var row = $("#templateArea > .log-section").clone();
            row.html(logLines[iLine]);
            ls.append(row);
        }
    }
};

Account.prototype.setExpired = function () {
    var type = $sog.getAccountType();       
    var hrs = $sog.getAccountExpirationHours();
    $(".nav-account-icon").find("ul").remove();
    $(".nav-account-menu").remove();
    if (hrs !== undefined && hrs !== null && hrs <= 0) {
        if (type === $sog.sources.basicTrial || type === $sog.sources.proTrial || type === $sog.sources.enterpriseTrial) {
            $sog.showMessage($sog.messages.trialExpired);
        } else if (type === $sog.sources.basic) {
            $sog.showMessage($sog.messages.basicExpired);
        } else if (type === $sog.sources.pro) {
            $sog.showMessage($sog.messages.proExpired);
        } else if (type === $sog.sources.enterprise) {
            $sog.showMessage($sog.messages.enterpriseExpired);
        }
        $(".cancel-subscribe").addClass("nodisp");
        $(".convert-to-free").removeClass("nodisp");
        $(".home-link").attr("href", "/");
    }
};

Account.prototype.getCoupon = function (code) {
    $("#couponCodeFailedMessage").addClass("nodisp");
    $.ajax({
        method: "GET",
        url: "/account/getcoupon",
        data: { code: code },
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag) {
            if (result.valid) {
                if (!result.expired) {
                    // Show coupon message
                    $(".coupon-code-applied").text(code);
                    $(".coupon-code-description").text(result.description);
                    $(".coupon-section").addClass("nodisp");
                    $(".coupon-applied-section").removeClass("nodisp");
                    $sog.setBrowserCoupon(code);
                } else {
                    $(".coupon-section").removeClass("nodisp");
                    $(".coupon-applied-section").addClass("nodisp");
                    $("#couponCodeFailedMessage").text($sog.messages.expiredCouponCode);
                    $("#couponCodeFailedMessage").removeClass("nodisp");
                }
                $account.pricing = result.pricing;
                $account.setPricing();
                // Due today
                $account.showDueTodayAmount();
            } else {
                // Show validation message
                $(".coupon-section").removeClass("nodisp");
                $(".coupon-applied-section").addClass("nodisp");
                $("#couponCodeFailedMessage").text($sog.messages.invalidCouponCode);
                $("#couponCodeFailedMessage").removeClass("nodisp");
            }
        } else {
            $logbrite.addErrorActivityTracking("could not get coupon: " + code);
        }
    }).fail(function () {
        $logbrite.addErrorActivityTracking("fails to get coupon: " + code);
    });
};

Account.prototype.showDueTodayAmount = function () {
    var checkedRadio = $("input[name=billingCycle]:checked");
    var billAmountElement = checkedRadio.closest("tr").find(".bill-amount");
    var billAmount = billAmountElement.find(".paid-amount").length > 0 ? billAmountElement.find(".paid-amount").text().replace(/[$,]+/g, "") :
            billAmountElement.find(".original-amount").text().replace(/[$,]+/g, "");
    var creditAmount = $("#creditContainer > .credit-amount").text().replace(/[$,]+/g, "");
    var dueAmount = parseFloat(billAmount) - parseFloat(creditAmount);
    var dueAmountDisplay = dueAmount > 0 ? "$" + dueAmount.toFixed(2) : "$0.00";
    $("#dueContainer > .due-today").html(dueAmountDisplay);
    $(".submit-payment").prop("disabled", false);
    if (dueAmount <= 0) {
        if (parseInt(billAmount) === 0) {
            $(".stripe-payment").addClass("nodisp");
            $(".vip-section").removeClass("nodisp");
        } else {
            $(".submit-payment").prop("disabled", true);
            $(".stripe-payment").removeClass("nodisp");
            $(".vip-section").addClass("nodisp");
        }
    } else {
        $(".stripe-payment").removeClass("nodisp");
        $(".vip-section").addClass("nodisp");
    }
};

Account.prototype.getPricing = function () {
    var couponCode = $sog.getBrowserCoupon();
    if (couponCode === undefined) {
        couponCode = "";
    }
    if ($account.pricing === undefined) {
        $.ajax({
            method: "GET",
            beforeSend: function (request) {
                request.setRequestHeader("Authorization", "bearer " + $sog.getAccountToken());
            },
            url: "/account/getprices",
            data: { code: couponCode },
            contentType: 'application/json; charset=utf-8',
            dataType: 'json'
        }).done(function (result) {
            if (result && result.flag) {
                $account.pricing = result.pricing;
                if (result.creditAmount > 0) {
                    $("#creditContainer > .credit-amount").text("$" + result.creditAmount.toFixed(2));
                    $("#creditContainer").removeClass("nodisp");
                } else {
                    $("#creditContainer").addClass("nodisp");
                }
                $account.setPricing();
            }
        }).fail(function() {
            console.log("Fails to get pricing.");
        });
    } else {
        $account.setPricing();
    }
};

Account.prototype.setPricing = function () {
    var planType = $(".plan-type:checked").val();
    var userCount = planType === $sog.sources.enterprise ? parseInt($(".user-count").val()) : 1;
    var monthlyCost, annualPaid;
    for (var i = 0; i < $account.pricing.length; i++) {
        for (var j = 0; j < $account.pricing[i].plans.length; j++) {
            for (var k = 0; k < $account.pricing[i].plans[j].prices.length; k++) {
                if ($account.pricing[i].planType === planType && $account.pricing[i].plans[j].prices[k].userCount === userCount) {
                    var originalAmount = $account.pricing[i].plans[j].prices[k].originalAmount;
                    var paidAmount = $account.pricing[i].plans[j].prices[k].paidAmount;
                    var originalAmountDisplay = "$" + originalAmount.toFixed(2);
                    var paidAmountDisplay = "$" + paidAmount.toFixed(2);
                    var originalElement = $("<div/>").addClass("inline-block original-amount").text(originalAmountDisplay);
                    var paidElement = $("<div/>").addClass("inline-block paid-amount padding-l5").text(paidAmountDisplay);
                    if ($account.pricing[i].plans[j].term === $sog.sources.annual) {
                        $(".annual-bill-amount").empty().append(originalElement);
                        if (originalAmountDisplay !== paidAmountDisplay) {
                            originalElement.addClass("line-through");
                            $(".annual-bill-amount").append(paidElement);
                            if (paidAmount === 0) {
                                $("input[name=billingCycle][value=1]").prop("checked", true);
                            }
                        }
                        annualPaid = paidAmount;
                    } else if ($account.pricing[i].plans[j].term === $sog.sources.monthly) {
                        $(".monthly-bill-amount").empty().append(originalElement);
                        if (originalAmountDisplay !== paidAmountDisplay) {
                            originalElement.addClass("line-through");
                            $(".monthly-bill-amount").append(paidElement);
                        } 
                        monthlyCost = originalAmount;
                    }     
                    break;
                }
            }
        }
    }
    if (monthlyCost > 0 && annualPaid > 0) {
        var savingPerc = 100 - Math.round(annualPaid / (monthlyCost * 12) * 100);
        $(".annual-bill-saving").text(savingPerc + "%");
    }
    $account.showDueTodayAmount();
};

Account.prototype.initializeLanding = function () {
    $surveyol.setRememberMe();
    var email = $sog.getUrlParameterByKey("email");
    if (email.length > 0) {
        $(".not-you").removeClass("nodisp");
        $("#accountEmail").val(email);
    } else if ($sog.getBrowserUnregisteredEmail()) {
        $(".not-you").removeClass("nodisp");
        $("#accountEmail").val($sog.getBrowserUnregisteredEmail());
    } else {
        $(".not-you").addClass("nodisp");
        $("#accountEmail").val("");
        $("#accountPassword").val("");
    }
    // Create account button
    $(".btn-create-account").text("Create My FREE Survey");
    // Turn off options
    $(".register-options").addClass("nodisp");
    // Company name
    $(".company-name-section").removeClass("nodisp");
    $(".privacy-by-part").text("By using the website");
    $("#accountEmail").focus();
    $sog.hideMessage();
    $surveyol.showTransferredMessage();
};

Account.prototype.initializeRegister = function () {
    $surveyol.setRememberMe();
    var email = $sog.getUrlParameterByKey("email");
    var firstName = $sog.getUrlParameterByKey("firstName");
    var lastName = $sog.getUrlParameterByKey("lastName");
    var companyName = $sog.getUrlParameterByKey("companyName");
    var industry = $sog.getUrlParameterByKey("industry");
    if (email.length > 0) {
        $(".not-you").removeClass("nodisp");
        $("#accountEmail").val(email);
        $("#accountEmail").focus();
    } else if ($sog.getBrowserUnregisteredEmail()) {
        $(".not-you").removeClass("nodisp");
        $("#accountEmail").val($sog.getBrowserUnregisteredEmail());
        $("#accountEmail").focus();
    } else {
        $(".not-you").addClass("nodisp");
        $("#accountEmail").val("");
        $("#accountPassword").val("");
        $("#accountEmail").focus();
    }
    if (firstName.length > 0) {
        $("#accountFirstName").val(firstName);
    }
    if (lastName.length > 0) {
        $("#accountLastName").val(lastName);
    }
    if (companyName.length > 0) {
        $("#companyName").val(companyName);
    }
    if (industry.length > 0) {
        $("#industry").val(industry);
    }
    $sog.hideMessage();
    if ($sog.getUnclaimedSurvey()) {
        $sog.showMessage($sog.messages.surveyIncompleteToBeClaimed);
    } else {
        $surveyol.showTransferredMessage();
    }
    var token = $sog.getAccountToken();
    if (token) {
        $(".already-signed-in").removeClass("nodisp");
    } else {
        $(".already-signed-in").addClass("nodisp");
    }
};

Account.prototype.initializePaymentReceived = function () {
    var email = $sog.getAccountEmail();
    if (email) {
        $("#subscriptionEmail").html(email);
        var planType = $sog.getAccountType();
        $("#subscriptionType").text(planType);
        var url = $sog.getUrlParameterByKey("url");
        if (url) {
            $(".nav-postpay").attr("href", url + window.location.hash);
        } else if (planType === $sog.sources.enterprise) {
            $(".nav-postpay").attr("href", "/users" + window.location.hash);
        }
    } else {
        window.location.href = "/signin?url=/subscription";
        return false;
    }
};

Account.prototype.changePasswordByToken = function () {
    $account.hasInitialSubmission = true;
    var token = $sog.getUrlParameterByKey("token");
    $.ajax({
        method: "POST",
        url: "/account/changepasswordbytoken",
        data: JSON.stringify({ token: token, password: $("#accountPassword").val() }),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag) {
            if (!result.status) {
                $("#beforeReset").addClass("nodisp");
                $("#afterReset").removeClass("nodisp");
                $logbrite.addMajorActivityTracking("changes password");
            } else if (result.source === $sog.sources.password) {
                $("#accountPasswordFailedMessage").html($sog.messages[result.status]);
                $("#accountPasswordFailedMessage").removeClass("nodisp");
                $("#accountPasswordMessage").addClass("nodisp");
                $logbrite.addMinorActivityTracking("fails to change password: " + $sog.messages[result.status]);
            }
        } else {
            $logbrite.addMinorActivityTracking("fails to change password");
        }
    });
};

Account.prototype.confirmEmail = function () {
    $account.hasInitialSubmission = true;
    var guid = $sog.getUrlParameterByKey("guid");
    var email = $sog.getUrlParameterByKey("email");
    $.ajax({
        method: "POST",
        url: "/account/confirmEmail",
        data: JSON.stringify({ email: email, guid: guid }),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag && result.validAccount) {
            if (result.confirmed) {
                $("#afterConfirm").removeClass("nodisp");
                $(".btn-sign-in").attr("href", "/signin?email=" + email);
                $logbrite.addMinorActivityTracking("confirms email");
            } else {
                $("#emailExpired").removeClass("nodisp");
                $("#newEmailAddress").text(result.account.email);
                $logbrite.addMinorActivityTracking("could not confirm email");
            } 
        } else {
            $logbrite.addMinorActivityTracking("fails to confirm email (account GUID: " + guid + ")");
        }
    }).fail(function () {
        $logbrite.addMinorActivityTracking("fails to confirm email");
    });
};

Account.prototype.confirmToken = function () {
    var token = $sog.getUrlParameterByKey("token");
    $.ajax({
        method: "POST",
        url: "/account/confirmtoken",
        data: JSON.stringify({ token: token }),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag) {
            if (!result.status) {
                $("#beforeReset").addClass("nodisp");
                $("#tokenExired").removeClass("nodisp");
            } else {
                $("#beforeReset").removeClass("nodisp");
                $("#tokenExired").addClass("nodisp");
            }
        } else {
            $logbrite.addErrorActivityTracking("could not confirm token");
        }
    }).fail(function () {
        $logbrite.addErrorActivityTracking("fails to confirm token");
    });
};

Account.prototype.declineToken = function () {
    var guid = $sog.getUrlParameterByKey("guid");
    var email = $sog.getUrlParameterByKey("email");
    var token = $sog.getUrlParameterByKey("code");
    $.ajax({
        method: "POST",
        url: "/account/declineaccounttoken",
        data: JSON.stringify({ guid: guid, email: email, token: token }),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag) {
            if (result.successful) {
                $("#invalidTokenMessage").addClass("nodisp");
                $("#declinedTokenMessage").removeClass("nodisp");
            } else {
                $("#declinedTokenMessage").addClass("nodisp");
                $("#invalidTokenMessage").removeClass("nodisp");
            }
        } else {
            $logbrite.addErrorActivityTracking("could not decline token");
        }
    }).fail(function () {
        $logbrite.addErrorActivityTracking("fails to decline token");
    });
};

Account.prototype.createAccount = function ($this, fnCallback) {
    if (typeof grecaptcha !== 'undefined') {
        grecaptcha.ready(function() {
            grecaptcha.execute($sog.sources.reCaptchaOpenToken, { action: 'REGISTER' }).then(function (token) {
                $account.createAccountWithToken($this, token, fnCallback);
            });
        });
    } else {
        $account.createAccountWithToken($this, null, fnCallback);
    }
}

Account.prototype.createAccountWithToken = function($this, captchaToken, fnCallback) 
{
    $account.hasInitialSubmission = true;
    var timezone = parseFloat(-(new Date()).stdTimezoneOffset() / 60);
    var firstName = $.trim($("#accountFirstName").val());
    var lastName = $.trim($("#accountLastName").val());
    var companyName = $.trim($("#companyName").val());
    var industry = $.trim($("#industry").val());
    var email = $.trim($("#accountEmail").val());
    var password = $("#accountPassword").val();
    var invitationKey = $sog.getUrlParameterByKey("invitationKey");
    var logReferrer = $sog.getLogReferrer();
    var rootReferrer = logReferrer !== undefined && logReferrer.rootReferrer !== undefined ? logReferrer.rootReferrer.url : null;
    var type = $sog.getBrowserAccountType();
    var previousEmail = $sog.getBrowserEmail();
    var special = $(".btn-create-account").attr("data-special");
    if (firstName && lastName && companyName && email && password && self === top) {
        var loader = new Loader();
        loader.setMethod("createAccount", JSON.stringify({ email: $("#accountEmail").val() }));
        loader.init();
        $.ajax({
            method: "POST",
            url: "/account/createaccount",
            data: JSON.stringify({
                firstName: firstName, lastName: lastName, companyName: companyName, industry: industry,
                email: email, password: password, 
                timezone: timezone, type: type,
                rootReferrer: rootReferrer, previousEmail: previousEmail, special: special,
                captchaToken: captchaToken
            }),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json'
        }).done(function (result) {
            if (result && result.flag) {
                if (!result.status) {
                    $sog.setBrowserMemory($(".remember-me").prop("checked"), result.account.email, true);
                    $sog.setAccountProfile(result.account, result.token, $sog.sources.surveyol);
                    $logbrite.addMajorActivityTracking("registers as " + email);
                    if (result.code) {
                        $sog.setBrowserCoupon(result.code);
                    }
                    if (fnCallback) {
                        fnCallback();
                    } else {
                        if (type === $sog.sources.basic || type === $sog.sources.pro || type === $sog.sources.enterprise) {
                            $sog.removeBrowserAccountType();
                            window.location.href = "/subscription";
                            return false;
                        } else {
                            $sog.removeBrowserAccountType();
                            if (invitationKey) {
                                window.location.href = "/dashboard?invitationKey=" + invitationKey;
                            } else {
                                window.location.href = "/dashboard";
                            }
                            return false;
                        }
                    }
                } else if (result.source === $sog.sources.email) {
                    if (result.status === $sog.sources.existsEmail) {
                        $("#accountEmailFailedMessage").html($sog.messages[result.status]);
                        $("#accountEmail").addClass("sog-red-border");
                        $("#accountEmailValidationIcon").removeClass("nodisp");
                        $("#accountEmailFailedMessage").removeClass("nodisp");
                        $("#accountEmailMessage").addClass("nodisp");
                        $sog.setBrowserEmail($("#accountEmail").val(), true);
                    } else {
                        $("#accountEmailFailedMessage").html($sog.messages[result.status]);
                        $("#accountEmail").addClass("sog-red-border");
                        $("#accountEmailValidationIcon").removeClass("nodisp");
                        $("#accountEmailFailedMessage").removeClass("nodisp");
                        $("#accountEmailMessage").addClass("nodisp");
                    }
                } else if (result.source === $sog.sources.password) {
                    $("#accountPasswordFailedMessage").html($sog.messages[result.status]);
                    $("#accountPassword").addClass("sog-red-border");
                    $("#accountPasswordValidationIcon").removeClass("nodisp");
                    $("#accountPasswordFailedMessage").removeClass("nodisp");
                    $("#accountPasswordMessage").addClass("nodisp");
                } else if (result.source === $sog.sources.token) {
                    alert($sog.messages[result.status]);
                }
            } else {
                $logbrite.addErrorActivityTracking("could not register");
            }
        }).fail(function () {
            $logbrite.addErrorActivityTracking("fails to register");
        }).always(function () {
            loader.finish();
        });
    } else {
        if (!industry) {
            $("#industryFailedMessage").html($sog.messages.invalidIndustry);
            $("#industry").addClass("sog-red-border");
            $("#industryValidationIcon").removeClass("nodisp");
            $("#industryFailedMessage").removeClass("nodisp");
            $("#industryMessage").addClass("nodisp");
            $("#industry").focus();
        }
        if (!companyName) {
            $("#companyNameFailedMessage").html($sog.messages.invalidCompanyName);
            $("#companyName").addClass("sog-red-border");
            $("#companyNameValidationIcon").removeClass("nodisp");
            $("#companyNameFailedMessage").removeClass("nodisp");
            $("#companyNameMessage").addClass("nodisp");
            $("#companyName").focus();
        }
        if (!lastName) {
            $("#accountLastNameFailedMessage").html($sog.messages.invalidLastName);
            $("#accountLastName").addClass("sog-red-border");
            $("#accountLastNameValidationIcon").removeClass("nodisp");
            $("#accountLastNameFailedMessage").removeClass("nodisp");
            $("#accountLastNameMessage").addClass("nodisp");
            $("#accountLastName").focus();
        }
        if (!firstName) {
            $("#accountFirstNameFailedMessage").html($sog.messages.invalidFirstName);
            $("#accountFirstName").addClass("sog-red-border");
            $("#accountFirstNameValidationIcon").removeClass("nodisp");
            $("#accountFirstNameFailedMessage").removeClass("nodisp");
            $("#accountFirstNameMessage").addClass("nodisp");
            $("#accountFirstName").focus();
        }
        if (!password) {
            $("#accountPasswordFailedMessage").html($sog.messages.invalidPassword);
            $("#accountPassword").addClass("sog-red-border");
            $("#accountPasswordValidationIcon").removeClass("nodisp");
            $("#accountPasswordFailedMessage").removeClass("nodisp");
            $("#accountPasswordMessage").addClass("nodisp");
            $("#accountPassword").focus();
        }
        if (!email) {
            $("#accountEmailFailedMessage").html($sog.messages.invalidEmail);
            $("#accountEmail").addClass("sog-red-border");
            $("#accountEmailValidationIcon").removeClass("nodisp");
            $("#accountEmailFailedMessage").removeClass("nodisp");
            $("#accountEmailMessage").addClass("nodisp");
            $("#accountEmail").focus();
        }
        if (self !== top) {
            $sog.logError("Registration embedded");
            window.location.href = "/";
        }
    }
};

Account.prototype.saveEmail = function () {
    $account.hasInitialSubmission = true;
    $("#messageSection").addClass("nodisp");
    var email = $("#accountEmail").val();
    var password = $("#accountPassword").val();
    $.ajax({
        method: "POST",
        beforeSend: function (request) {
            request.setRequestHeader("Authorization", "bearer " + $sog.getAccountToken());
        },
        url: "/account/saveemail",
        data: JSON.stringify({
            email: email, password: password
        }),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag) {
            if (result.signedin) {
                if (!result.status) {
                    $sog.setAccountProfile(result.account);
                    $sog.showMessage($sog.messages.emailSaved, null, 5000);
                    $logbrite.addMajorActivityTracking("changes email");
                    $("#accountEmail").prop("disabled", true);
                    $("#accountPasswordBlock").addClass("nodisp");
                    $(".btn-save-email").prop("disabled", true);
                    $("#changeEmail").removeClass("nodisp");
                } else if (result.source === $sog.sources.email) {
                    $("#accountEmailFailedMessage").html($sog.messages[result.status]);
                    $("#accountEmailFailedMessage").removeClass("nodisp");
                    $("#accountEmailMessage").addClass("nodisp");
                } else if (result.source === $sog.sources.password) {
                    $("#accountPasswordFailedMessage").html($sog.messages[result.status]);
                    $("#accountPasswordFailedMessage").removeClass("nodisp");
                    $("#accountPasswordMessage").addClass("nodisp");
                }
            } else {
                window.location.href = "/signin";
                return false;
            }
        } else {
            $logbrite.addErrorActivityTracking("could not save email");
        }
    }).fail(function () {
        $logbrite.addErrorActivityTracking("fails to save email");
    });
};

Account.prototype.saveCompanyName = function () {
    $("#messageSection").addClass("nodisp");
    var companyName = $("#companyName").val();
    $.ajax({
        method: "POST",
        beforeSend: function (request) {
            request.setRequestHeader("Authorization", "bearer " + $sog.getAccountToken());
        },
        url: "/account/savecompanyname",
        data: JSON.stringify({
            companyName: companyName
        }),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag) {
            if (result.signedin) {
                $sog.setAccountProfile(result.account);
                $logbrite.addMajorActivityTracking("saves company name");
            } else {
                window.location.href = "/signin";
                return false;
            }
        } else {
            $logbrite.addErrorActivityTracking("could not save company name");
        }
    }).fail(function () {
        $logbrite.addErrorActivityTracking("fails to save company name");
    });
};

Account.prototype.savePersonalInformation = function () {
    $("#messageSection").addClass("nodisp");
    var firstName = $("#firstName").val();
    var lastName = $("#lastName").val();
    var companyName = $("#companyName").val();
    var industry = $("#industry").val();
    var timezone = $("#timezone").val();
    $.ajax({
        method: "POST",
        beforeSend: function (request) {
            request.setRequestHeader("Authorization", "bearer " + $sog.getAccountToken());
        },
        url: "/account/savepersonalinformation",
        data: JSON.stringify({
            firstName: firstName,
            lastName: lastName,
            companyName: companyName,
            industry: industry,
            timezone: timezone
        }),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag) {
            if (result.signedin) {
                $sog.setAccountProfile(result.account);
                $sog.showMessage($sog.messages.accountInformationSaved, null, 5000);
                $logbrite.addMajorActivityTracking("saves account information");
            } else {
                window.location.href = "/signin";
                return false;
            }
        } else {
            $logbrite.addErrorActivityTracking("could not save account information");
        }
    }).fail(function () {
        $logbrite.addErrorActivityTracking("fails to save account information");
    });
};

Account.prototype.saveDesignView = function () {
    $("#messageSection").addClass("nodisp");
    var designDetailedView = $("input[name=designView][value=1]").prop("checked");
    $.ajax({
        method: "POST",
        beforeSend: function (request) {
            request.setRequestHeader("Authorization", "bearer " + $sog.getAccountToken());
        },
        url: "/account/savedesignview",
        data: JSON.stringify({
            designDetailedView: designDetailedView
        }),             
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag) {
            if (result.signedin) {
                $sog.setAccountProfile(result.account);
                $sog.showMessage($sog.messages.designViewSaved, null, 5000);
                $logbrite.addMajorActivityTracking("saves design view");
            } else {
                if ($sog.getAccountEmail()) {
                    window.location.href = "/signin";
                    return false;
                } else {
                    window.location.href = "/register";
                    return false;
                }
            }
        } else {
            $logbrite.addErrorActivityTracking("could not save design view");
        }
    }).fail(function () {
        $logbrite.addErrorActivityTracking("fails to save design view");
    });
};


Account.prototype.saveSettings = function () {
    $("#messageSection").addClass("nodisp");
    var allowShare = $("#allowShare").is(":checked");
    var allowTransfer = $("#allowTransfer").is(":checked");
    $.ajax({
        method: "POST",
        beforeSend: function (request) {
            request.setRequestHeader("Authorization", "bearer " + $sog.getAccountToken());
        },
        url: "/account/savesettings",
        data: JSON.stringify({
            allowShare: allowShare,
            allowTransfer: allowTransfer
        }),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag) {
            if (result.signedin) {
                $sog.setAccountProfile(result.account);
                $sog.showMessage($sog.messages.settingsSaved, null, 5000);
                $logbrite.addMajorActivityTracking("saves transfer/share settings");
            } else {
                if ($sog.getAccountEmail()) {
                    window.location.href = "/signin";
                    return false;
                } else {
                    window.location.href = "/register";
                    return false;
                }
            }
        } else {
            $logbrite.addErrorActivityTracking("could not save share/transfer settings");
        }
    }).fail(function () {
        $logbrite.addErrorActivityTracking("fails to save share/transfer settings");
    });
};

Account.prototype.sendAccountToken = function () {
    $("#messageSection").addClass("nodisp");
    $.ajax({
        method: "POST",
        beforeSend: function (request) {
            request.setRequestHeader("Authorization", "bearer " + $sog.getAccountToken());
        },
        url: "/account/sendaccounttoken",
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag) {
            $sog.showMessage($sog.messages.resetPasswordEmailSent);
            $logbrite.addMinorActivityTracking("sends reset password email");
        } else {
            $logbrite.addErrorActivityTracking("could not send account token");
        }
    }).fail(function () {
        $logbrite.addErrorActivityTracking("fails to send account token");
    });
};

Account.prototype.sendToken = function () {
    $account.hasInitialSubmission = true;
    $("#accountEmailMessage").removeClass("nodisp");
    $("#accountEmailFailedMessage").addClass("nodisp");
    $("#messageSection").addClass("nodisp");
    $.ajax({
        method: "POST",
        url: "/account/sendtoken",
        data: JSON.stringify({ email: $("#accountEmail").val() }),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag) {
            if (!result.status) {
                $sog.showMessage($sog.messages.resetPasswordEmailSent);
            } else if (result.source === $sog.sources.email) {
                $("#accountEmailFailedMessage").html($sog.messages[result.status]);
                $("#accountEmailFailedMessage").removeClass("nodisp");
                $("#accountEmailMessage").addClass("nodisp");
            }
        } else {
            $logbrite.addErrorActivityTracking("could not send token");
        }
    }).fail(function () {
        $logbrite.addErrorActivityTracking("fails to send token");
    });
};

Account.prototype.signIn = function ($this) {
    if (typeof grecaptcha !== 'undefined') {
        grecaptcha.ready(function () {
            grecaptcha.execute($sog.sources.reCaptchaOpenToken, { action: 'SIGNIN' }).then(function (token) {
                $account.signInWithToken($this, token);
            });
        });
    } else {
        $account.signInWithToken($this);
    }
};

Account.prototype.signInWithToken = function ($this, captchaToken) {
    $account.hasInitialSubmission = true;
    var email = $("#accountEmail").val();
    var password = $("#accountPassword").val();
    var invitationKey = $sog.getUrlParameterByKey("invitationKey");
    var logReferrer = $sog.getLogReferrer();
    var rootReferrer = logReferrer !== undefined && logReferrer.rootReferrer !== undefined ? logReferrer.rootReferrer.url : null;
    if (self === top) {
        var loader = new Loader();
        loader.setMethod("signin", JSON.stringify({ email: $("#accountEmail").val() }));
        loader.init();
        $.ajax({
            method: "POST",
            url: "/account/signin",
            data: JSON.stringify({
                email: email,
                password: password,
                rootReferrer: rootReferrer,
                captchaToken: captchaToken
            }),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json'
        }).done(function (result) {
            if (result && result.flag) {
                if (!result.status) {
                    $sog.setBrowserMemory($(".remember-me").prop("checked"), result.account.email, true);
                    $sog.setAccountProfile(result.account, result.token, $sog.sources.surveyol);
                    $logbrite.addMajorActivityTracking("signs in as " + email);
                    var url = $sog.getUrlParameterByKey("url");
                    $sog.removeBrowserAccountType();
                    if (url) {
                        window.location.href = url + window.location.hash;
                        return false;
                    } else if (invitationKey) {
                        window.location.href = "/dashboard?invitationKey=" + invitationKey;
                    } else if (($sog.getAccountType() !== $sog.sources.pro && $sog.getBrowserAccountType() === $sog.sources.pro)
                        || ($sog.getAccountType() !== $sog.sources.enterprise && $sog.getBrowserAccountType() === $sog.sources.enterprise)) {
                        window.location.href = "/subscription";
                        return false;
                    } else {
                        window.location.href = "/dashboard";
                        return false;
                    }
                } else if (result.source === $sog.sources.email) {
                    $("#accountEmailFailedMessage").html($sog.messages[result.status]);
                    $("#accountEmail").addClass("sog-red-border");
                    $("#accountEmailValidationIcon").removeClass("nodisp");
                    $("#accountEmailFailedMessage").removeClass("nodisp");
                    $("#accountEmailMessage").addClass("nodisp");
                    $sog.setBrowserEmail($("#accountEmail").val(), false);
                    $logbrite.addMinorActivityTracking("could not sign in: " + $sog.messages[result.status]);
                } else if (result.source === $sog.sources.password) {
                    $("#accountPasswordFailedMessage").html($sog.messages[result.status]);
                    $("#accountPassword").addClass("sog-red-border");
                    $("#accountPasswordValidationIcon").removeClass("nodisp");
                    $("#accountPasswordFailedMessage").removeClass("nodisp");
                    $("#accountPasswordMessage").addClass("nodisp");
                    $logbrite.addMinorActivityTracking("could not sign in: " + $sog.messages[result.status]);
                } else if (result.source === $sog.sources.token) {
                    alert($sog.messages[result.status]);
                }
            } else {
                $logbrite.addErrorActivityTracking("could not sign in");
            }
        }).fail(function (xhr) {
            $logbrite.addErrorActivityTracking("fails to sign in");
            $sog.logError(xhr.responseText);
        }).always(function () {
            loader.finish();
        });
    } else {
        $sog.logError("Signin embedded");
        window.location.href = "/";
    }
};

Account.prototype.verifyAccountEmail = function () {
    if (!$sog.validateEmail($.trim($("#accountEmail").val()))) {
        $("#accountEmailFailedMessage").html($sog.messages.invalidEmail);
        $("#accountEmail").addClass("sog-red-border");
        $("#accountEmailValidationIcon").removeClass("nodisp");
        $("#accountEmailFailedMessage").removeClass("nodisp");
        $("#accountEmailMessage").addClass("nodisp");
        return false;
    } else {
        $("#accountEmailMessage").removeClass("nodisp");
        $("#accountEmailFailedMessage").addClass("nodisp");
        $("#accountEmail").removeClass("sog-red-border");
        $("#accountEmailValidationIcon").addClass("nodisp");
        return true;
    }
};

Account.prototype.verifyAccountPassword = function () {
    if (!$sog.validatePassword($.trim($("#accountPassword").val()))) {
        $("#accountPasswordFailedMessage").html($sog.messages.invalidPassword);
        $("#accountPassword").addClass("sog-red-border");
        $("#accountPasswordValidationIcon").removeClass("nodisp");
        $("#accountPasswordFailedMessage").removeClass("nodisp");
        $("#accountPasswordMessage").addClass("nodisp");
        return false;
    } else {
        $("#accountPasswordMessage").removeClass("nodisp");
        $("#accountPasswordFailedMessage").addClass("nodisp");
        $("#accountPassword").removeClass("sog-red-border");
        $("#accountPasswordValidationIcon").addClass("nodisp");
        return true;
    }
};

Account.prototype.verifyAccountFirstName = function () {
    if ($.trim($("#accountFirstName").val()).length === 0) {
        $("#accountFirstNameFailedMessage").html($sog.messages.invalidFirstName);
        $("#accountFirstName").addClass("sog-red-border");
        $("#accountFirstNameValidationIcon").removeClass("nodisp");
        $("#accountFirstNameFailedMessage").removeClass("nodisp");
        $("#accountFirstNameMessage").addClass("nodisp");
        return false;
    } else {
        $("#accountFirstNameMessage").removeClass("nodisp");
        $("#accountFirstNameFailedMessage").addClass("nodisp");
        $("#accountFirstName").removeClass("sog-red-border");
        $("#accountFirstNameValidationIcon").addClass("nodisp");
        return true;
    }
};

Account.prototype.verifyAccountLastName = function () {
    if ($.trim($("#accountLastName").val()).length === 0) {
        $("#accountLastNameFailedMessage").html($sog.messages.invalidLastName);
        $("#accountLastName").addClass("sog-red-border");
        $("#accountLastNameValidationIcon").removeClass("nodisp");
        $("#accountLastNameFailedMessage").removeClass("nodisp");
        $("#accountLastNameMessage").addClass("nodisp");
        return false;
    } else {
        $("#accountLastNameMessage").removeClass("nodisp");
        $("#accountLastNameFailedMessage").addClass("nodisp");
        $("#accountLastName").removeClass("sog-red-border");
        $("#accountLastNameValidationIcon").addClass("nodisp");
        return true;
    }
};

Account.prototype.verifyCompanyName = function () {
    if ($.trim($("#companyName").val()).length === 0) {
        $("#companyNameFailedMessage").html($sog.messages.invalidCompanyName);
        $("#companyName").addClass("sog-red-border");
        $("#companyNameValidationIcon").removeClass("nodisp");
        $("#companyNameFailedMessage").removeClass("nodisp");
        $("#companyNameMessage").addClass("nodisp");
        return false;
    } else {
        $("#companyNameMessage").removeClass("nodisp");
        $("#companyNameFailedMessage").addClass("nodisp");
        $("#companyName").removeClass("sog-red-border");
        $("#companyNameValidationIcon").addClass("nodisp");
        return true;
    }
};

Account.prototype.verifyIndustry = function () {
    if ($.trim($("#industry").val()).length === 0) {
        $("#industryFailedMessage").html($sog.messages.invalidIndustry);
        $("#industry").addClass("sog-red-border");
        $("#industryValidationIcon").removeClass("nodisp");
        $("#industryFailedMessage").removeClass("nodisp");
        $("#industryMessage").addClass("nodisp");
        return false;
    } else {
        $("#industryMessage").removeClass("nodisp");
        $("#industryFailedMessage").addClass("nodisp");
        $("#industry").removeClass("sog-red-border");
        $("#industryValidationIcon").addClass("nodisp");
        return true;
    }
};

Account.prototype.initializeIntegrations = function () {
    var app = $sog.getUrlParameterByKey("app");
    if (app === "salesforce") {
        var code = $sog.getUrlParameterByKey("code");
        var redirectUri = window.location.href;
        var tempUrl = $sog.getTempUrl();
        var designGuid = $sog.getUrlParameterByKey("guid", (new URL(tempUrl)).search);
        $.ajax({
            method: "POST",
            beforeSend: function (request) {
                request.setRequestHeader("Authorization", "bearer " + $sog.getAccountToken());
            },
            url: "/survey/verifysalesforce",
            data: JSON.stringify({ code: code, guid: designGuid, redirectUri: redirectUri }),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json'
        }).done(function (result) {
            if (result && result.flag) {
                if (result.successful) {
                    $sog.removeTempUrl();
                    window.location.href = tempUrl;
                } else {
                    //TODO
                }
            } else {
                //TODO
            }
        });
    } else if (app === "hubspot") {
        var code = $sog.getUrlParameterByKey("code");
        var redirectUri = $sog.getDomain() + "/integrations?app=hubspot";
        var tempUrl = $sog.getTempUrl();
        var designGuid = $sog.getUrlParameterByKey("guid", (new URL(tempUrl)).search);
        //console.log(designGuid);
        $.ajax({
            method: "POST",
            beforeSend: function (request) {
                request.setRequestHeader("Authorization", "bearer " + $sog.getAccountToken());
            },
            url: "/survey/verifyhubspot",
            data: JSON.stringify({ code: code, guid: designGuid, redirectUri: redirectUri }),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json'
        }).done(function (result) {
            if (result && result.flag) {
                if (!result.successful) {
                    $sog.setTransferredMessage("Could not connect with HubSpot. Please try again.");
                } else {
                    if (designGuid === "") {
                        $sog.setAccountHubspotRefreshToken(true);
                    }
                }
            } else {
                $sog.setTransferredMessage("Could not connect with HubSpot.");
            }
            $sog.removeTempUrl();
            window.location.href = tempUrl;
        });
    }
};

Account.prototype.requestQuote = function () {
    var firstName = $.trim($("#accountFirstName").val());
    var lastName = $.trim($("#accountLastName").val());
    var companyName = $.trim($("#companyName").val());
    var industry = $.trim($("#industry").val());
    var email = $.trim($("#accountEmail").val());
    var phone = $.trim($("#quotePhone").val());
    var requirements = $.trim($("#quoteRequirements").val());
    if (firstName && lastName && companyName && email && phone && requirements && self === top) {
        var loader = new Loader();
        loader.setMethod("requestQuote", JSON.stringify({ email: $("#accountEmail").val() }));
        loader.init();
        $.ajax({
            method: "POST",
            url: "/account/requestquote",
            data: JSON.stringify({
                firstName: firstName, lastName: lastName, companyName: companyName, industry: industry,
                email: email, phone: phone, requirements: requirements
            }),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json'
        }).done(function (result) {
            if (result && result.flag) {
                if (!result.status) {
                    //TODO: requires registration (yes, no, I will register shortly)
                    //TODO: add "continue to register" and "continue to sign in", invalid email handler
                    $(".quote-form").addClass("nodisp");
                    $(".quote-message").html($sog.messages.quoteRequested).removeClass("nodisp");
                    $logbrite.addMajorActivityTracking("requests quote as " + email);
                }
            } else {
                $logbrite.addErrorActivityTracking("could not request quote");
            }
        }).fail(function () {
            $logbrite.addErrorActivityTracking("fails to request quote");
        }).always(function () {
            loader.finish();
        });
    } else {
        if (!requirements) {
            $("#quoteRequirementsFailedMessage").html($sog.messages.invalidRequirements);
            $("#quoteRequirements").addClass("sog-red-border");
            $("#quoteRequirementsValidationIcon").removeClass("nodisp");
            $("#quoteRequirementsFailedMessage").removeClass("nodisp");
            $("#quoteRequirementsMessage").addClass("nodisp");
            $("#quoteRequirements").focus();
        }
        if (!phone) {
            $("#quotePhoneFailedMessage").html($sog.messages.invalidPhone);
            $("#quotePhone").addClass("sog-red-border");
            $("#quotePhoneValidationIcon").removeClass("nodisp");
            $("#quotePhoneFailedMessage").removeClass("nodisp");
            $("#quotePhoneMessage").addClass("nodisp");
            $("#quotePhone").focus();
        }
        if (!industry) {
            $("#industryFailedMessage").html($sog.messages.invalidIndustry);
            $("#industry").addClass("sog-red-border");
            $("#industryValidationIcon").removeClass("nodisp");
            $("#industryFailedMessage").removeClass("nodisp");
            $("#industryMessage").addClass("nodisp");
            $("#industry").focus();
        }
        if (!companyName) {
            $("#companyNameFailedMessage").html($sog.messages.invalidCompanyName);
            $("#companyName").addClass("sog-red-border");
            $("#companyNameValidationIcon").removeClass("nodisp");
            $("#companyNameFailedMessage").removeClass("nodisp");
            $("#companyNameMessage").addClass("nodisp");
            $("#companyName").focus();
        }
        if (!lastName) {
            $("#accountLastNameFailedMessage").html($sog.messages.invalidLastName);
            $("#accountLastName").addClass("sog-red-border");
            $("#accountLastNameValidationIcon").removeClass("nodisp");
            $("#accountLastNameFailedMessage").removeClass("nodisp");
            $("#accountLastNameMessage").addClass("nodisp");
            $("#accountLastName").focus();
        }
        if (!firstName) {
            $("#accountFirstNameFailedMessage").html($sog.messages.invalidFirstName);
            $("#accountFirstName").addClass("sog-red-border");
            $("#accountFirstNameValidationIcon").removeClass("nodisp");
            $("#accountFirstNameFailedMessage").removeClass("nodisp");
            $("#accountFirstNameMessage").addClass("nodisp");
            $("#accountFirstName").focus();
        }
        if (!email) {
            $("#accountEmailFailedMessage").html($sog.messages.invalidEmail);
            $("#accountEmail").addClass("sog-red-border");
            $("#accountEmailValidationIcon").removeClass("nodisp");
            $("#accountEmailFailedMessage").removeClass("nodisp");
            $("#accountEmailMessage").addClass("nodisp");
            $("#accountEmail").focus();
        }
        if (self !== top) {
            $sog.logError("Quote form embedded");
            window.location.href = "/";
        }
    }
};

Account.prototype.saveApiToken = function (segment, fnCallback) {
    var guid = segment.attr("data-guid");
    var expiredDate = segment.find(".token-expired-date").val();
    if (expiredDate) {
        $.ajax({
            method: "POST",
            beforeSend: function (request) {
                request.setRequestHeader("Authorization", "bearer " + $sog.getAccountToken());
            },
            url: "/account/saveApiToken",
            data: JSON.stringify({
                guid: guid, expiredDate: expiredDate
            }),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json'
        }).done(function (result) {
            if (result && result.flag) {
                $account.listApiTokens();
                if (fnCallback) {
                    fnCallback();
                }
            }
        });
    }
};

Account.prototype.deleteApiToken = function (segment, fnCallback) {
    var guid = segment.attr("data-guid");
    var expirationDate = segment.find(".token-expiration-date").val();
    $.ajax({
        method: "POST",
        beforeSend: function (request) {
            request.setRequestHeader("Authorization", "bearer " + $sog.getAccountToken());
        },
        url: "/account/deleteApiToken",
        data: JSON.stringify({
            guid: guid
        }),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag) {
            $account.listApiTokens();
            if (fnCallback) {
                fnCallback();
            }
        }
    });
};

Account.prototype.listApiTokens = function () {
    $.ajax({
        method: "GET",
        beforeSend: function (request) {
            request.setRequestHeader("Authorization", "bearer " + $sog.getAccountToken());
        },
        url: "/account/getApiTokens",
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag) {
            if (result.valid) {
                var sec = $("#apiSecretTokensSection");
                sec.find(".secret-tokens").empty();
                if (result.apiTokens.length > 0) {
                    for (var i = 0; i < result.apiTokens.length; i++) {
                        var token = result.apiTokens[i];
                        var seg = $("#templateArea .secret-token").clone();
                        seg.attr("data-guid", token.guid);
                        seg.find(".token-string").text(token.secretToken);
                        var expiredDate = token.expiredDate.split("T")[0];
                        seg.find(".token-expired-date").text(expiredDate);
                        sec.find(".secret-tokens").append(seg);
                    }
                }
            }
        }
    });
};

var $account = new Account();
// Copyright @ SurveyOL.com. All rights reserved.
$(function () {
    $("#accountEmail").on("input", function () {
        if ($account.hasInitialSubmission) {
            $account.verifyAccountEmail();
        }
    });
    $("#accountPassword").on("input", function () {
        if ($account.hasInitialSubmission) {
            $account.verifyAccountPassword();
        }
    });
    $("#accountPassword").on("keyup", function (e) {
        if (e.keyCode === 13) {
            $(".btn-sign-in").click();
        }
    });
    $(".btn-sign-in").on("touchstart click", function (e) {
        e.preventDefault();
        $account.signIn($(this));
    });
    $(".view-password").on("click", function () {
        if ($(this).prop("checked")) {
            $("#accountPassword").attr("type", "text");
        } else {
            $("#accountPassword").attr("type", "password");
        }
    });
    $(".not-you").on("click", function (e) {
        e.preventDefault();
        $sog.removeBrowserEmail();
        $(this).addClass("nodisp");
        $(".already-signed-in").addClass("nodisp");
        $("#accountEmail").val("");
        $("#accountEmail").focus();
    });
    $(".validation-icon").on("mouseenter", function () {
        var container = $(this).closest(".field-container");
        container.find(".field-message").addClass("nodisp");
        container.find(".field-failed-message").removeClass("nodisp");
    }).on("mouseleave", function () {
        var container = $(this).closest(".field-container");
        container.find(".field-message").removeClass("nodisp");
        container.find(".field-failed-message").addClass("nodisp");
    });
});
var $social = $social || {};

window.fbAsyncInit = function () {
    FB.init({
        appId: '550671755848569',
        cookie: true,
        xfbml: true,
        version: 'v6.0'
    });
    FB.AppEvents.logPageView();
};
(function (d, s, id) {
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) { return; }
    js = d.createElement(s); js.id = id;
    js.src = "https://connect.facebook.net/en_US/sdk.js";
    fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));

$(document).on("click", "#facebookLogIn", function () {
    var firstName, lastName, email, idToken;
    FB.login(function (response) {
        if (response.authResponse) {
            idToken = response.authResponse.accessToken;
            FB.api('/me', { locale: 'en_US', fields: 'name, email, first_name, last_name' }, function (response) {
                email = response.email;
                firstName = response.first_name;
                lastName = response.last_name;
                $social.oAuthSignIn(email, idToken, firstName, lastName, "facebook");
            });
        } else {
            $sog.showMessage($sog.messages.couldNotSignInWithSocialAccount.replace("{0}", "Facebook"), null, 5000);
            console.log('User cancelled login or did not fully authorize.');
        }
    }, { scope: 'public_profile,email' });
});

$(document).on("click", "#twitterSignIn", function () {
    // Store social portal page to storage
    var portal = { url: window.location.href, landing: $("#templateSurveyGuid").length > 0 };
    $sog.setBrowserSocialPortal(JSON.stringify(portal));
    window.location.href = "/socialsignin?type=twitter";
    return false;
});

$(document).on("click", "#linkedInSignIn", function () {
    // Store social portal page to storage
    var portal = { url: window.location.href, landing: $("#templateSurveyGuid").length > 0 };
    $sog.setBrowserSocialPortal(JSON.stringify(portal));
    window.location.href = "/socialsignin?type=linkedin";
    return false;
});

function onLoadGoogleCallback() {
    gapi.load('auth2', function () {
        auth2 = gapi.auth2.init({
            client_id: '979654752712-b7umtbfp720feodgvcrfl1k42o940ji7.apps.googleusercontent.com',
            cookiepolicy: 'single_host_origin',
            scope: 'profile email'
        });
        auth2.attachClickHandler(element, {},
            function (googleUser) {
                $social.googleSignIn(googleUser);
            }, function (error) {
                $sog.showMessage($sog.messages.couldNotSignInWithSocialAccount.replace("{0}", "Google"), null, 5000);
                console.log('Sign-in error', error);
            }
        );
    });
    element = document.getElementById('googleSignIn');
}

$social.googleSignIn = function (googleUser) {
    var profile = googleUser.getBasicProfile();
    var firstName = profile.getGivenName();
    var lastName = profile.getFamilyName();
    var email = profile.getEmail();
    var idToken = googleUser.getAuthResponse().id_token;
    $social.oAuthSignIn(email, idToken, firstName, lastName, "google");
};

$social.initializeSocialSignIn = function () {
    // Authorization
    var type = $sog.getUrlParameterByKey("type");
    var redirectUri = $sog.getUrlWithoutParameter().toLowerCase();
    if (type === "twitter") {
        // Get oAuth token
        $.ajax({
            method: "POST",
            url: "/account/gettwitteroauthtoken",
            contentType: 'application/json; charset=utf-8',
            data: JSON.stringify({
                redirectUri: redirectUri
            }),
            dataType: 'json'
        }).done(function (result) {
            if (result && result.flag) {
                window.location.href = "https://api.twitter.com/oauth/authenticate?oauth_token=" + result.token;
                return false;
            }
        });
    } else if (type === "linkedin") {
        var stateGuid = encodeURI($sog.getUuid());
        $sog.setBrowserLinkedInState(stateGuid);
        var target = "https://www.linkedin.com/oauth/v2/authorization?response_type=code" +
            "&client_id=78e61inlc9nfq6&state=" + stateGuid + "&scope=r_liteprofile%20r_emailaddress" +
            "&redirect_uri=" + encodeURI(redirectUri);
        window.location.href = target;
    } 
};

$social.processSocialSignIn = function () {
    // Process sign in
    var oAuthToken = $sog.getUrlParameterByKey("oauth_token"); // Twitter
    var oAuthVerifier = $sog.getUrlParameterByKey("oauth_verifier"); // Twitter
    var denied = $sog.getUrlParameterByKey("denied"); // Twitter
    var code = $sog.getUrlParameterByKey("code"); // LinkedIn
    var state = $sog.getUrlParameterByKey("state"); // LinkedIn
    var error = $sog.getUrlParameterByKey("error"); // LinkedIn
    var redirectUri = $sog.getUrlWithoutParameter().toLowerCase();
    var timezone = parseFloat(-(new Date()).stdTimezoneOffset() / 60);
    var portal;
    if (oAuthToken && oAuthVerifier) {
        $social.signInWithTwitter(oAuthToken, oAuthVerifier, redirectUri, timezone);
    } else if (code && state && $social.isLinkedInAuthorizationValid(state, error)) {
        $social.signInWithLinkedIn(code, state, redirectUri, timezone);
    } else if (denied) {
        $sog.setTransferredMessage($sog.messages.couldNotSignInWithSocialAccount.replace("{0}", "Twitter"));
        if ($sog.getBrowserSocialPortal()) {
            portal = JSON.parse($sog.getBrowserSocialPortal());
            window.location.href = portal.url;
            return false;
        }
    } else if (error) {
        $sog.setTransferredMessage($sog.messages.couldNotSignInWithSocialAccount.replace("{0}", "LinkedIn"));
        if ($sog.getBrowserSocialPortal()) {
            portal = JSON.parse($sog.getBrowserSocialPortal());
            window.location.href = portal.url;
            return false;
        }
    }
};

$social.signInWithTwitter = function (oAuthToken, oAuthVerifier, redirectUri, timezone) {
    var provider = "twitter";
    var loader = new Loader();
    loader.setMethod("signinwithtwitter");
    loader.init();
    var portal;
    var type = $sog.getBrowserAccountType();
    var logReferrer = $sog.getLogReferrer();
    var rootReferrer = logReferrer !== undefined && logReferrer.rootReferrer !== undefined ? logReferrer.rootReferrer.url : null;
    $.ajax({
        method: "POST",
        url: "/account/signinwithtwitter",
        data: JSON.stringify({
            oAuthToken: oAuthToken,
            oAuthVerifier: oAuthVerifier,
            redirectUri: redirectUri,
            timezone: timezone,
            provider: provider,
            type: type,
            rootReferrer: rootReferrer
        }),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag) {
            if (!result.status) {
                $sog.setAccountProfile(result.account, result.token, provider);
                $logbrite.addMajorActivityTracking("sign in with " + provider + " as " + result.email);
                if (window.location.href !== $social.getSignedInPageUrl()) {
                    window.location.href = $social.getSignedInPageUrl();
                    return false;
                } else {
                    window.location.reload();
                }
            } else {
                $sog.setTransferredMessage($sog.messages.couldNotSignInWithSocialAccount.replace("{0}", "Twitter"));
                $logbrite.addMinorActivityTracking("could not sign in with " + provider + ": " + result.status);
                // Redirect to social portal page
                if ($sog.getBrowserSocialPortal()) {
                    portal = JSON.parse($sog.getBrowserSocialPortal());
                    window.location.href = portal.url;
                    return false;
                }
            }
        } else {
            $sog.setTransferredMessage($sog.messages.couldNotSignInWithSocialAccount.replace("{0}", "Twitter"));
            $logbrite.addErrorActivityTracking("could not sign in with " + provider);
            // Redirect to social portal page
            if ($sog.getBrowserSocialPortal()) {
                portal = JSON.parse($sog.getBrowserSocialPortal());
                window.location.href = portal.url;
                return false;
            }
        }
    }).fail(function (xhr) {
        $sog.setTransferredMessage($sog.messages.couldNotSignInWithSocialAccount.replace("{0}", "Twitter"));
        $logbrite.addErrorActivityTracking("fails to sign in with " + provider);
        $sog.logError(xhr.responseText);
        // Redirect to social portal page
        if ($sog.getBrowserSocialPortal()) {
            var portal = JSON.parse($sog.getBrowserSocialPortal());
            window.location.href = portal.url;
            return false;
        }
    }).always(function () {
        loader.finish();
    });
};

$social.signInWithLinkedIn = function (code, state, redirectUri, timezone) {
    var provider = "linkedin";
    var loader = new Loader();
    loader.setMethod("signinwithlinkedin");
    loader.init();
    var portal;
    var type = $sog.getBrowserAccountType();
    var logReferrer = $sog.getLogReferrer();
    var rootReferrer = logReferrer !== undefined && logReferrer.rootReferrer !== undefined ? logReferrer.rootReferrer.url : null;
    $.ajax({
        method: "POST",
        url: "/account/signinwithlinkedin",
        data: JSON.stringify({
            code: code,
            state: state,
            redirectUri: redirectUri,
            timezone: timezone,
            provider: provider,
            type: type,
            rootReferrer: rootReferrer
        }),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag) {
            if (!result.status) {
                $sog.setAccountProfile(result.account, result.token, provider);
                $logbrite.addMajorActivityTracking("sign in with " + provider + " as " + result.account.email);
                if (window.location.href !== $social.getSignedInPageUrl()) {
                    window.location.href = $social.getSignedInPageUrl();
                    return false;
                } else {
                    window.location.reload();
                }
            } else {
                $sog.setTransferredMessage($sog.messages.couldNotSignInWithSocialAccount.replace("{0}", "LinkedIn"));
                $logbrite.addMinorActivityTracking("could not sign in with " + provider + ": " + result.status);
                // Redirect to social portal page
                if ($sog.getBrowserSocialPortal()) {
                    portal = JSON.parse($sog.getBrowserSocialPortal());
                    window.location.href = portal.url;
                    return false;
                }
            }
        } else {
            $sog.setTransferredMessage($sog.messages.couldNotSignInWithSocialAccount.replace("{0}", "LinkedIn"));
            $logbrite.addErrorActivityTracking("could not sign in with " + provider);
            // Redirect to social portal page
            if ($sog.getBrowserSocialPortal()) {
                portal = JSON.parse($sog.getBrowserSocialPortal());
                window.location.href = portal.url;
                return false;
            }
        }
    }).fail(function (xhr) {
        $sog.setTransferredMessage($sog.messages.couldNotSignInWithSocialAccount.replace("{0}", "LinkedIn"));
        $logbrite.addErrorActivityTracking("fails to sign in with " + provider);
        $sog.logError(xhr.responseText);
    }).always(function () {
        loader.finish();
    });
};

$social.getSignedInPageUrl = function () {
    var url = "/dashboard";
    var invitationKey = $sog.getUrlParameterByKey("invitationKey");
    if (invitationKey) {
        url = "/dashboard?invitationKey=" + invitationKey;
    }
    if ($sog.getBrowserAccountType() === $sog.sources.pro) {
        $sog.removeBrowserAccountType();
        url = "/subscription";
    } else if ($("#templateSurveyGuid").val()) {
        // Landing page (Google/Facebook)
        url = window.location.href;
    } else if ($sog.getBrowserSocialPortal()) {
        portal = JSON.parse($sog.getBrowserSocialPortal());
        if (portal.landing) {
            // Landing page (Twitter/LinkedIn)
            url = portal.url;
        }
    }
    return url;
};

$social.isLinkedInAuthorizationValid = function (state, error) {
    var browserState = $sog.getBrowserLinkedInState();
    return state === browserState && !error;
};

$social.oAuthSignIn = function (email, idToken, firstName, lastName, provider) {
    var loader = new Loader();
    loader.setMethod("signinwithoauth", JSON.stringify({ email: email }));
    loader.init();
    var timezone = parseFloat(-(new Date()).stdTimezoneOffset() / 60);
    var type = $sog.getBrowserAccountType();
    var logReferrer = $sog.getLogReferrer();
    var rootReferrer = logReferrer !== undefined && logReferrer.rootReferrer !== undefined ? logReferrer.rootReferrer.url : null;
    $.ajax({
        method: "POST",
        url: "/account/signinwithoauth",
        data: JSON.stringify({
            email: email,
            idToken: idToken,
            firstName: firstName,
            lastName: lastName,
            timezone: timezone,
            provider: provider,
            type: type,
            rootReferrer: rootReferrer
        }),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'
    }).done(function (result) {
        if (result && result.flag) {
            if (!result.status) {
                $sog.setAccountProfile(result.account, result.token, provider);
                $logbrite.addMajorActivityTracking("sign in with " + provider + " as " + email);
                if (window.location.href !== $social.getSignedInPageUrl()) {
                    window.location.href = $social.getSignedInPageUrl();
                    return false;
                } else {
                    window.location.reload();
                }
            } else {
                $sog.showMessage($sog.messages.couldNotSignInWithSocialAccount.replace("{0}", provider.capitalize()), null, 5000);
                $logbrite.addMinorActivityTracking("could not sign in with " + provider + ": " + result.status);
            }
        } else {
            $sog.showMessage($sog.messages.couldNotSignInWithSocialAccount.replace("{0}", provider.capitalize()), null, 5000);
            $logbrite.addErrorActivityTracking("could not sign in with " + provider);
        }
    }).fail(function (xhr) {
        $sog.showMessage($sog.messages.couldNotSignInWithSocialAccount.replace("{0}", provider.capitalize()), null, 5000);
        $logbrite.addErrorActivityTracking("fails to sign in with " + provider);
        $sog.logError(xhr.responseText);
    }).always(function () {
        loader.finish();
    });
};

