﻿jQuery(document).ready(function () {

    // REQUIRED FOR JQUERY 1.3.2
    jQuery.extend({
        parseJSON: function (data) {
            if (typeof data !== "string" || !data) {
                return null;
            }
            data = jQuery.trim(data);
            if (/^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) {
                return window.JSON && window.JSON.parse ? window.JSON.parse(data) : (new Function("return " + data))();
            } else {
                jQuery.error("Invalid JSON: " + data);
            }
        }
    });

    SuuntopassTypes = function () { }
    SuuntopassTypes.displayOption = { login: 1, register: 2 };

    SuuntopassConstants = function () { }
    SuuntopassConstants.JSONLogOnForm = "https://{0}/FormsService/LogOnForm?callback=?&service=";
    SuuntopassConstants.LogOnFormUrl = "&url=http://{0}.s3.amazonaws.com/suuntoPassLogin.htm";
    SuuntopassConstants.JSONRegisterForm = "https://{0}/FormsService/LogOnForm?callback=?&service=";
    SuuntopassConstants.RegisterFormUrl = "&url=http://{0}.s3.amazonaws.com/suuntoPassRegister.htm"
    SuuntopassConstants.JSONAuthenticate = "https://{0}/UserAuthorityService/?callback=?&";
    SuuntopassConstants.JSONRegister = "https://{0}/UserAuthorityService/Register?callback=?&";
    SuuntopassConstants.CorrectImage = "http://{0}.s3.amazonaws.com/images/correct.png";
    SuuntopassConstants.ErrorImage = "http://{0}.s3.amazonaws.com/images/error.png";

    Suuntopass = function () { }

    Suuntopass.initialiseJSONUrl = function (environment, secure) {
        SuuntopassConstants.JSONLogOnForm = SuuntopassConstants.JSONLogOnForm.replace('{0}', environment);
        SuuntopassConstants.JSONRegisterForm = SuuntopassConstants.JSONRegisterForm.replace('{0}', environment);
        SuuntopassConstants.JSONAuthenticate = SuuntopassConstants.JSONAuthenticate.replace('{0}', environment);
        SuuntopassConstants.JSONRegister = SuuntopassConstants.JSONRegister.replace('{0}', environment);

        if (!secure) {
            SuuntopassConstants.JSONLogOnForm = SuuntopassConstants.JSONLogOnForm.replace('https', 'http');
            SuuntopassConstants.JSONRegisterForm = SuuntopassConstants.JSONRegisterForm.replace('https', 'http');
            SuuntopassConstants.JSONAuthenticate = SuuntopassConstants.JSONAuthenticate.replace('https', 'http');
            SuuntopassConstants.JSONRegister = SuuntopassConstants.JSONRegister.replace('https', 'http');
        }
    }

    Suuntopass.initialiseCDNUrl = function (environment) {
        SuuntopassConstants.LogOnFormUrl = SuuntopassConstants.LogOnFormUrl.replace('{0}', environment);
        SuuntopassConstants.RegisterFormUrl = SuuntopassConstants.RegisterFormUrl.replace('{0}', environment);
        SuuntopassConstants.CorrectImage = SuuntopassConstants.CorrectImage.replace('{0}', environment);
        SuuntopassConstants.ErrorImage = SuuntopassConstants.ErrorImage.replace('{0}', environment);
    }

    //this function includes all necessary js files for the application
    Suuntopass.include = function (file) {
        var script = document.createElement('script');
        script.src = file;
        script.type = 'text/javascript';
        script.defer = true;
        document.getElementsByTagName('head').item(0).appendChild(script);
    }

    Suuntopass.showPopupAfterHtmlLoad = function (element) {
        element.toggle(false).fadeIn()
        Suuntopass.centerPopup(element);
    }

    var popupStatus = 0;
    Suuntopass.loadPopup = function (element) {
        //loads popup only if it is disabled
        if (popupStatus == 0) {
            Suuntopass.centerPopup(element);
            popupStatus = 1;
        }
    }

    Suuntopass.disablePopup = function (element) {
        //disables popup only if it is enabled
        if (popupStatus == 1) {
            jQuery("#backgroundPopup").fadeOut("slow");
            element.fadeOut("slow");
            popupStatus = 0;
        }
    }

    Suuntopass.centerPopup = function (element) {
        //request data for centering
        var windowWidth = document.documentElement.clientWidth;
        var windowHeight = document.documentElement.clientHeight;
        var popupHeight = element.height();
        var popupWidth = element.width();
        //centering
        element.css({
            "position": "absolute",
            "top": windowHeight / 2 - popupHeight / 2,
            "left": windowWidth / 2 - popupWidth / 2
        });
        //only need force for IE6

        jQuery("#backgroundPopup").css({
            "height": windowHeight
        });
    }

    Suuntopass.initializeRegBase = function (element) {
        jQuery("#sprCloseButton, #sprBackgroundPopup").bind('click', function () {
            Suuntopass.disablePopup(element);
        });
    }

    Suuntopass.initializeLogBase = function (element) {
        jQuery("#splCloseButton, #splBackgroundPopup").bind('click', function () {
            Suuntopass.disablePopup(element);
        });
    }

    Suuntopass.registerErrorString = function (data) {
        var errorText;

        switch (data) {
            case 0: errorText = ""; break;
            case 1: errorText = "This doesn't look like an email address"; break;
            case 2: errorText = "Emails do not match"; break;
            case 3: errorText = "Email is previously registered"; break;
            case 4: errorText = "Minimum 6 characters"; break;
            case 5: errorText = "The passwords do not match"; break;
            case 6: errorText = "4-20 letters or numbers, no spaces or special symbols"; break;
            case 7: errorText = "Sorry, this username is already taken. Try something else!"; break;
            case 8: errorText = "Error creating user"; break;
            case 9: errorText = "Invalid service"; break;
            default: errorText = "Error creating user";
        }

        return errorText;
    }

    Suuntopass.showImage = function (element) {
        var imageElement = "#spr" + element + "OkImage";
        jQuery(imageElement).css('display', 'inline');
        jQuery(imageElement).show("fast");
    }

    Suuntopass.resetErrors = function (element) {
        var errorImageElement = "#spr" + element + "OkImage";
        var errorMessageElement = "#spr" + element + "ErrorMessage";

        jQuery(errorImageElement).hide("");
        jQuery(errorImageElement).attr("src", SuuntopassConstants.CorrectImage);        
        jQuery(errorMessageElement).css('color', '#555555');
        jQuery(errorMessageElement).text("");
    }

    Suuntopass.registerErrorShow = function (element, errorText) {
        var errorImageElement = "#spr" + element + "OkImage";
        var errorMessageElement = "#spr" + element + "ErrorMessage";

        jQuery(errorImageElement).hide("");
        jQuery(errorImageElement).attr("src", SuuntopassConstants.ErrorImage);
        jQuery(errorMessageElement).css('color', '#ed1c24');
        jQuery(errorMessageElement).text(errorText);
        jQuery(errorMessageElement).fadeIn("slow");
    }

    Suuntopass.registerError = function (data, options) {

        Suuntopass.resetErrors("Email");
        Suuntopass.resetErrors("ReEmail");
        Suuntopass.resetErrors("Password");
        Suuntopass.resetErrors("RePassword");
        Suuntopass.resetErrors("Username");
        jQuery('#sprFailure').text("");
        jQuery('#sprFailure').hide("");

        for (var index in data.list) {
            var errorText = Suuntopass.registerErrorString(data.list[index]);

            switch (data.list[index]) {
                case 1: Suuntopass.registerErrorShow("Email", errorText); break;
                case 2: Suuntopass.registerErrorShow("ReEmail", errorText); break;
                case 3: Suuntopass.registerErrorShow("Email", errorText); break;
                case 4: Suuntopass.registerErrorShow("Password", errorText); break;
                case 5: Suuntopass.registerErrorShow("RePassword", errorText); break;
                case 6: Suuntopass.registerErrorShow("Username", errorText); break;
                case 7: Suuntopass.registerErrorShow("Username", errorText); break;
                case 8: Suuntopass.registerErrorShow("Username", errorText); break;
                default:
                    {
                        jQuery('#sprFailure').text(errorText);
                        jQuery('#sprFailure').show("fast");
                    }
            }
        }

        Suuntopass.showImage("Email");
        Suuntopass.showImage("ReEmail");
        Suuntopass.showImage("Password");
        Suuntopass.showImage("RePassword");
        Suuntopass.showImage("Username");

        if (jQuery.isFunction(options.onFailure)) {
            options.onFailure(data.ErrorCode);
        }

    }

    Suuntopass.initializeRegister = function (element, options) {

        // Fetch the register form
        jQuery.getJSON(SuuntopassConstants.JSONRegisterForm + options.servicename + SuuntopassConstants.RegisterFormUrl,
				function (data) {

				    element.html(data);
				    Suuntopass.showPopupAfterHtmlLoad(element);
				    Suuntopass.initializeRegBase(element);
				    jQuery('html, body').animate({ scrollTop: 0 }, 'fast');
				    jQuery('input#sprEmail').focus();

				    jQuery('#sprRegisterButton').bind('click', function () {
				        jQuery('#splFailure').text("");
				        jQuery('#sprFailure').text("");
				        var errorText;

				        var email = jQuery("#sprEmail").val();
				        var reEmail = jQuery("#sprReEmail").val();
				        var password = jQuery("#sprPassword").val();
				        var RePassword = jQuery("#sprRePassword").val();
				        var username = jQuery("#sprUsername").val();
				        var data = { service: options.servicename, emailAddress: email, emailAddressConfirm: reEmail, password: password, passwordConfirm: RePassword, username: username };

				        var result = decodeURIComponent(jQuery.param(data));

				        jQuery.getJSON(SuuntopassConstants.JSONRegister + result, function (data) {
				            if (data.list == 0) {
				                jQuery('#sprFailure').text("User created successfully").css('color', 'blue');
				                Suuntopass.disablePopup(element);
				                if (jQuery.isFunction(options.onSuccess)) {
				                    options.onSuccess(email, password);
				                }
				            } else {
				                Suuntopass.registerError(data, options);
				            }
				        });

				    });

				});

    }

    Suuntopass.initializeLogin = function (element, options) {

        // Fetch the login form
        jQuery.getJSON(SuuntopassConstants.JSONLogOnForm + options.servicename + SuuntopassConstants.LogOnFormUrl,
				function (data) {
				    element.html(data);
				    Suuntopass.showPopupAfterHtmlLoad(element);
				    Suuntopass.initializeLogBase(element);
				    jQuery('html, body').animate({ scrollTop: 0 }, 'fast');
				    jQuery('input#splEmail').focus();
				    jQuery('#splFailure').text("");

				    jQuery('input#splEmail,input#splPassword').bind('keypress', function (e) {
				        if (e.keyCode == 13) {
				            e.preventDefault();
				            if (jQuery("#splEmail").val() && jQuery("#splPassword").val()) { jQuery('#splLoginButton').click(); }
				        }
				    });

				    jQuery('#splRegisterButton').bind('click', function () {
				        element.empty();
				        Suuntopass.disablePopup(element);
				        var registerElement = jQuery('#' + options.registerElement);
				        Suuntopass.initializeRegister(registerElement, options);
				        Suuntopass.loadPopup(registerElement);
				    });

				    jQuery('#splLoginButton').bind('click', function () {
				        jQuery('#splFailure').text("");
				        var email = jQuery("#splEmail").val();
				        var password = jQuery("#splPassword").val();

				        var data = { service: options.servicename, emailAddress: email, password: password };
				        var result = decodeURIComponent(jQuery.param(data));
				        jQuery.getJSON(SuuntopassConstants.JSONAuthenticate + result, function (data) {
				            if (data) {
				                jQuery('#splFailure').text("Login successful").css('color', 'blue');
				                Suuntopass.disablePopup(element);
				                if (jQuery.isFunction(options.onSuccess)) {
				                    options.onSuccess(data);
				                }
				            } else {
				                jQuery('#splFailure').text("Invalid Email address or password, Login failed").css('color', 'red');
				                if (jQuery.isFunction(options.onFailure)) {
				                    options.onFailure(data.ErrorCode);
				                }
				            }
				        });
				    });

				});

    };

    (function ($) {
        $.fn.suuntoPass = function (options) {
            //Set the default values
            var defaults = {
                servicename: 'defaultService',
                displayOption: SuuntopassTypes.displayOption.login,
                environment: 'servicegate.suunto.com',
                registerElement: '',
                cdnEnvironment: 'suuntopass',
                secure: true
            };
            var options = jQuery.extend(defaults, options);
            return this.each(function () {
                var options = jQuery.extend(defaults, options);
                Suuntopass.initialiseJSONUrl(options.environment, options.secure);
                Suuntopass.initialiseCDNUrl(options.cdnEnvironment);
                if (options.displayOption == SuuntopassTypes.displayOption.register) {
                    Suuntopass.initializeRegister(jQuery(this), options);
                    Suuntopass.loadPopup(jQuery(this));
                }
                else {
                    Suuntopass.initializeLogin(jQuery(this), options);
                    Suuntopass.loadPopup(jQuery(this));
                }
            });
            return this;
        };
    })(jQuery);

});
