var logonManager = (function ($) {

    String.prototype.format = function () {
        var s = this,
            i = arguments.length;

        while (i--) {
            s = s.replace(new RegExp('\\{' + i + '\\}', 'gm'), arguments[i]);
        }
        return s;
    }

    return {

        init: function () {
            var me = this;

            function checkValidity(e) {
                var formGroup = $(this).parents('.form-group'),
                    form = formGroup.parents('form'),
                    isValid = me.isValid(this);

                $(form).find('.error-block').hide();
                $(formGroup).toggleClass('has-error', !isValid);
                if (isValid) {
                    $(formGroup).find('.help-block').html('');
                }
            }

            // Logon password form
            $('#logon-username').change(checkValidity);
            $('#logon-password').change(checkValidity);
            $('#logon-submit').click(function (e) {
                e.preventDefault();
                me.logonSubmit();
            });
            $('#logonuser-submit').click(function (e) {
                e.preventDefault();
                me.logonuserSubmit();
            });
            $('#logon-captcha').change(checkValidity);
            $('#logon-captcha-refresh').click(function (e) {
                e.preventDefault();
                me.refreshCaptcha('#logon-captcha');
            });
            $('#logon-captcha-play').click(function (e) {
                e.preventDefault();
                me.playCaptcha('#logon-captcha');
            });

            $('#logon-forgotten-password').click(function (e) {
                if ($(this).attr('href') == '#') {
                    e.preventDefault();
                    $('#resetpassword-username').val('');
                    me.resetPassword(true);
                }
            });

            $('#logon-renew-registration').click(function (e) {
                e.preventDefault();
                me.logonSubmit();
            });
            $('#logon-renew-registration-cancel').click(function (e) {
                e.preventDefault();
                $('#logon-submit').show();
                $('#logon-renew-registration').hide();
                $('#logon-renew-registration-cancel').hide();
            });

            // Reset password form
            $('#resetpassword-username').change(checkValidity);
            $('#resetpassword-mailaddress').change(checkValidity);
            $('#resetpassword-captcha').change(checkValidity);
            $('#resetpassword-captcha-refresh').click(function (e) {
                e.preventDefault();
                me.refreshCaptcha('#resetpassword-captcha');
            });
            $('#resetpassword-captcha-play').click(function (e) {
                e.preventDefault();
                me.playCaptcha('#resetpassword-captcha');
            });
            $('#resetpassword-cancel').click(function (e) {
                e.preventDefault();
                me.logon();
            });
            $('#resetpassword-submit').click(function (e) {
                e.preventDefault();
                me.resetPasswordSubmit();
            });

            // Change password form
            $('#changepassword-oldpassword').change(checkValidity);
            $('#changepassword-newpassword').change(checkValidity);
            $('#changepassword-passwordconfirm').change(checkValidity);
            $('#changepassword-submit').click(function (e) {
                e.preventDefault();
                me.changePasswordSubmit();
            });

            // Link expired form
            $('#resetpassword-linkexpired-submit').click(function (e) {
                e.preventDefault();
                me.resetPassword(false);
            });

            // Link expired form (private role assignment)
            $('#privateroleassignment-linkexpired-submit').click(function (e) {
                e.preventDefault();
                window.location.href = master.baseUrl;
            });

            // select input text on focus
            $('input[type=text], input[type=password]').focus(function () {
                this.select();
            });


            me.doAction(me.action);
        },

        doAction: function (action) {
            var me = this;

            if (action == 'logon' || action == 'renewalregistration') {
                me.logon();
            }
            else if (action == 'resetpassword') {
                me.resetPassword();
            }
            else if (action == 'resetpassword-linkexpired') {
                me.setActiveItem('resetpassword-linkexpired');
            }
            else if (action == 'privateroleassignment-linkexpired') {
                me.setActiveItem('privateroleassignment-linkexpired');
            }
            else if (action == 'changepassword') {
                me.changePassword();
            }
            else if (action == 'privateroleassignment') {
                me.confirmPrivateRoleAssignment();
            }
        },

        setActiveItem: function (item, focusField) {
            var me = this;

            // Hide all items
            $('#logon-form').hide();
            $('#resetpassword-form').hide();
            $('#changepassword-form').hide();
            $('#resetpassword-confirm').hide();
            $('#resetpassword-linkexpired').hide();
            $('#privateroleassignment-confirm').hide();
            $('#privateroleassignment-linkexpired').hide();

            if (item == 'logon') {
                $('#logon-form').show();
                var username = $('#logon-username').val();
                if (username != '')
                    $(focusField || '#logon-password').focus();
                else
                    $(focusField || '#logon-username').focus();
            }
            else if (item == 'resetpassword') {
                $('#resetpassword-form').show();
                $(focusField || '#resetpassword-username').focus();
            }
            else if (item == 'resetpassword-confirm') {
                $('#resetpassword-confirm').show();
            }
            else if (item == 'changepassword') {
                $('#changepassword-form').show();
                var oldpassword = $('#changepassword-oldpassword').val();
                if (oldpassword != '')
                    $(focusField || '#changepassword-newpassword').focus();
                else
                    $(focusField || '#changepassword-oldpassword').focus();
            }
            else if (item == 'resetpassword-linkexpired') {
                $('#resetpassword-linkexpired').show();
            }
            else if (item == 'privateroleassignment') {
                $('#logon-form').show();
                $('#privateroleassignment-confirm').show();
                $(focusField || '#logon-username').focus();
            }
            else if (item == 'privateroleassignment-linkexpired') {
                $('#privateroleassignment-linkexpired').show();
            }
        },

        isValid: function (field) {
            var me = this,
                value = $(field).val(),
                required = $(field).attr('required') == 'required',
                requiredText = $(field).attr('data-requiredText') || me.requiredText,
                regexPattern = $(field).attr('data-regex'),
                regexText = $(field).attr('data-regexText'),
                regex,
                length = $(field).attr('data-length'),
                lengthText = $(field).attr('data-lengthText') || me.lengthText;

            if ($(field).is(':hidden')) return true;

            if (required && !value.length) {
                me.markInvalid(field, requiredText);
                return false;
            }

            if (length) {
                length = parseInt(length);
                if (value.length != length) {
                    me.markInvalid(field, lengthText.format(length));
                    return false;
                }
            }

            if (regexPattern) {
                regex = new RegExp(regexPattern);
                if (!regex.test(value)) {
                    me.markInvalid(field, regexText);
                    return false;
                }
            }

            return true;
        },

        markInvalid: function (field, invalidText) {
            var me = this,
                formGroup = $(field).parents('.form-group'),
                helpEl = formGroup.find('.help-block');

            helpEl.html(invalidText || me.nvalidText);
            formGroup.addClass('has-error');
        },

        clearInvalid: function (form) {
            $(form).find('.has-error').removeClass('has-error');
            $(form).find('.help-block').html('');
        },

        confirmPrivateRoleAssignment: function () {
            var me = this;

            me.clearInvalid('form#logon-form');
            me.setActiveItem('privateroleassignment');
        },

        logon: function () {
            var me = this;

            me.clearInvalid('form#logon-form');
            me.setActiveItem('logon');
        },

        logonuserSubmit: function () {

            var me = this,
                loadingEl = $('#logonuser-loading');
            me.clearInvalid('form#logon-form');
            $(loadingEl).show();
			var url;
			if(typeof(master.instanceWebDirectory) == "undefined"){
				url = 'logon.aspx?returnurl=' + escape(this.redirectUrl);
			}else{
				url = master.instanceWebDirectory + 'logon.aspx?returnurl=' + escape(this.redirectUrl);
			}
            window.location.href = $url;
        },

        logonSubmit: function () {
            var renewRegistration = $('#logon-submit').css('display') == 'none';
            var me = this,
                errorEl = $('#logon-error'),
                loadingEl = $('#logon-loading'),
                usernameField = $('#logon-username'),
                username = usernameField.val(),
                passwordField = $('#logon-password'),
                captchaGroup = $('#logon-captcha-form-group'),
                captcharequired = $('#logon-captcharequired'),
                password = passwordField.val(),
				rememberMe = $('#logon-rememberMe').length == 0 ? false : $('#logon-rememberMe').prop('checked'),
                focusField;

            var data = {
                username: username,
                password: password,
				rememberMe: rememberMe
            };

            if (me.action == 'logon' || me.action == 'renewalregistration' || me.action == 'privateroleassignment') {
                captchaField = $('#logon-captcha');
                checkValueField = $('#logon-captcha-checkvalue');
                data.captcha = captchaField.val();
                data.captchaCheckValue = checkValueField.val();
            }

            var requestKey, groupId;

            if (me.action == 'privateroleassignment') {
                requestKeyField = $('#privateroleassignment-requestkey');
                requestKey = requestKeyField.val();
                groupIdField = $('#privateroleassignment-groupid');
                groupId = groupIdField.val();
                data.requestKey = requestKey;
                data.groupId = groupId;
            }

            $(errorEl).hide();

            if (!me.isValid(usernameField)) {
                focusField = usernameField;
            }

            if (!me.isValid(passwordField) && !focusField) {
                focusField = passwordField;
            }

            if (focusField) {
                $(focusField).focus();
                return;
            }

            $(loadingEl).show();
            $.ajax({
                url: typeof(master.instanceWebDirectory) == "undefined"? 
				'logon.svc/' + (renewRegistration == true ? 'renewregistration' : 'logon') + '?changeUser=true&_dc=' + new Date().getTime():
				master.instanceWebDirectory + 'logon.svc/' + (renewRegistration == true ? 'renewregistration' : 'logon') + '?changeUser=true&_dc=' + new Date().getTime(),
                type: 'POST',
                contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
                data: data,
                success: function (data) {
                    var error;

                    $(loadingEl).hide();
                    if (data && data.success) {
                        if (renewRegistration == true) {
							var url2;
							if(typeof(master.instanceWebDirectory) == "undefined"){
								url2 = 'registersuccess.aspx?State=' + data.d.Status;
							}else{
								url2 = master.instanceWebDirectory + 'registersuccess.aspx?State=' + data.d.Status;
							}
                            window.location.href = url2;
                        }
                        else {
							  if(this.inIframe()){
								  parent.postMessage(
								   {admin:"logon", load:window.location.href},
									"https://pad.philharmoniedeparis.fr");
								  parent.postMessage(
								    {admin:"logon", load:window.location.href},
									 "https://pprd-pad.philharmoniedeparis.fr");
							  }else{
								if (window.location.href.replace(window.location.hash, "") != this.redirectUrl) {
									window.location.href = this.redirectUrl;
								}
								else {
									window.location.reload(true);
								}
							  }
                        }
                    }
                    else if (data && data.errors.length) {
                        error = data.errors[0];

                        if (error.type == 'AccountExpired') {
                            var renewButton = $('#logon-renew-registration');
                            if (renewButton.length == 1) renewButton.show();
                            var renewCancelButton = $('#logon-renew-registration-cancel');
                            if (renewCancelButton.length == 1 && me.action == 'logon') renewCancelButton.show();
                            if (renewButton.length == 1 && renewCancelButton.length == 1) $('#logon-submit').hide();
                        }

                        if (error.type == 'PasswordMustChange' || error.type == 'PasswordExpired') {
                            this.changePassword(error.id);
                        }
                        else if (error.data.doCheckAdditionals) {
                            $(captchaGroup).show();
                            $(captcharequired).show();
                            $(errorEl).find('span').html(error.data.checkAdditionalsResult == false ? me.captchaDoesNotMatchErrorMessage : error.msg);
                            $(errorEl).show();
							if(error.data.checkAdditionalsResult==true) 
							{
                                this.refreshCaptcha('#logon-captcha');
                                $('#logon-captcha').val('');
                            }
                        }
                        else {
                            $(errorEl).find('span').html(error.msg);
                            $(errorEl).show();
                        }

                    }
                },
                error: function () {
                    $(loadingEl).hide();
                    $(errorEl).find('span').html(this.tryAgainLaterErrorMessage);
                    $(errorEl).show();
                },
                context: me
            });
        },
		inIframe : function () {
			try {
				return window.self !== window.top;
			} catch (e) {
				return false;
			}
		},
        refreshCaptcha: function (captchaEl) {
			var url;
			if(typeof(master.instanceWebDirectory) == "undefined"){
				url = 'formService.svc/generateCaptchaValue?length=6&_dc=' + new Date().getTime();
			}else{
				url = master.instanceWebDirectory + 'formService.svc/generateCaptchaValue?length=6&_dc=' + new Date().getTime();
			}
            $.ajax({
                type: 'GET',
                url: typeof(master.instanceWebDirectory) == "undefined" ? 'formService.svc/generateCaptchaValue?length=6&_dc=' + new Date().getTime() : master.instanceWebDirectory + 'formService.svc/generateCaptchaValue?length=6&_dc=' + new Date().getTime(),
                success: function (json) {
                    $(captchaEl + '-checkvalue').attr('value', json.d);
                    $(captchaEl + '-img').attr('src', 'captcha.ashx?checkvalue=' + json.d);
                    $(captchaEl + '-audio').attr('src', 'audiocaptcha.ashx?checkvalue=' + json.d);
                }
            });
        },

        playCaptcha: function (captchaEl) {
            var captchaAudio = $(captchaEl + '-audio').get(0);
            captchaAudio.load();
            captchaAudio.play();
        },

        resetPassword: function (showCancelButton) {
            var me = this,
                form = $('#resetpassword-form'),
                usernameField = $('#resetpassword-username'),
                username = usernameField.val(),
                focusField = !username.length ? $('#resetpassword-username') : $('#resetpassword-mailaddress');

            me.clearInvalid(form);
            if (!username.length) {
                username = $('#logon-username').val();
            }

            if (username.length) {
                $('#resetpassword-username').val(username);
                $('#resetpassword-username').attr('readonly', 'readonly');
                $('#resetpassword-username').attr('disabled', true);
            }
            else {
                $('#resetpassword-username').removeAttr('readonly');
                $('#resetpassword-username').removeAttr('disabled');
            }
            $('#resetpassword-mailaddress').val('');
            $('#resetpassword-captcha').val('');
            $('#resetpassword-cancel').toggle(!!showCancelButton);

            me.setActiveItem('resetpassword', focusField);
        },

        resetPasswordSubmit: function () {

            var me = this,
                form = $('form#resetpassword-form'),
                loadingEl = $('#resetpassword-loading'),
                successEl = $('#resetpassword-confirm'),
                errorEl = $('#resetpassword-error'),
                usernameField = $('#resetpassword-username'),
                username = usernameField.val(),
                mailAddressField = $('#resetpassword-mailaddress'),
                mailAddress = mailAddressField.val(),
                captchaField = $('#resetpassword-captcha'),
                captcha = captchaField.val(),
                checkValueField = $('#resetpassword-captcha-checkvalue'),
                checkValue = checkValueField.val(),
                focusField;

            $(errorEl).hide();

            if (!me.isValid(usernameField)) {
                focusField = usernameField;
            }

            if (!me.isValid(mailAddressField) && !focusField) {
                focusField = mailAddressField;
            }

            if (!me.isValid(captchaField) && !focusField) {
                focusField = captchaField;
            }

            if (focusField) {
                $(focusField).focus();
                return;
            }

            $(loadingEl).show();
            $.ajax({
                url: master.instanceWebDirectory + 'logon.svc/resetpassword?_dc=' + new Date().getTime(),
                type: 'GET',
                data: {
                    username: username,
                    mailaddress: mailAddress,
                    captcha: checkValue + '|' + captcha
                },
                success: function (data) {
                    $(loadingEl).hide();
                    if (data && data.success) {
                        $(successEl).find('h3').html(this.resetPasswordConfirm.format(mailAddress));
                        this.setActiveItem('resetpassword-confirm');
                    }
                    else {
                        this.refreshCaptcha('#resetpassword-captcha');
                        $('#resetpassword-captcha').val('');
                        $(errorEl).find('span').html(data.errors[0].msg);
                        $(errorEl).show();
                    }
                },
                error: function () {
                    $(loadingEl).hide();
                    this.refreshCaptcha('#resetpassword-captcha');
                    $('#resetpassword-captcha').val('');
                    $(errorEl).find('span').html(this.tryAgainLaterErrorMessage);
                    $(errorEl).show();
                },
                context: me
            });
        },

        changePassword: function (requestKey) {
            var me = this,
                form = $('#changepassword-form');

            me.clearInvalid(form);

            if (requestKey) {
                $('#changepassword-username').val($('#logon-username').val());
                $('#changepassword-oldpassword').val($('#logon-password').val());
                $('#changepassword-requestkey').val(requestKey);
            }

            var oldpassword = $('#changepassword-oldpassword').val();
            me.setActiveItem('changepassword', oldpassword != '' ? '#changepassword-newpassword' : '#changepassword-oldpassword');

        },

        changePasswordSubmit: function () {
            var me = this,
                form = $('form#changepassword-form'),
                loadingEl = $('#changepassword-loading'),
                errorEl = $('#changepassword-error'),
                data = form.serialize(),
                newPasswordField = $('#changepassword-newpassword'),
                newPassword = newPasswordField.val(),
                passwordConfirmField = $('#changepassword-passwordconfirm'),
                passwordConfirm = passwordConfirmField.val(),
                focusField;

            $(errorEl).hide();

            if (!me.isValid(newPasswordField)) {
                focusField = newPasswordField;
            }

            if (!me.isValid(passwordConfirmField) && !focusField) {
                focusField = passwordConfirmField;
            }

            if (focusField) {
                $(focusField).focus();
                return;
            }

            if (newPassword != passwordConfirm) {
                $(errorEl).find('span').html(me.passwordsDoNotMatch);
                $(errorEl).show();
                return;
            }

            $(loadingEl).show();
			var url;
			if(typeof(master.instanceWebDirectory) == "undefined"){
				url = 'logon.svc/logon?_dc=' + new Date().getTime();
			}else{
				url = master.instanceWebDirectory + 'logon.svc/logon?_dc=' + new Date().getTime();
			}
            $.ajax({
                url: $url,
                type: 'POST',
                contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
                data: data,
                success: function (data) {
                    $(loadingEl).hide();
                    if (data && data.success) {
                        if (window.location.href.replace(window.location.hash, "") != this.redirectUrl) {
                            window.location.href = this.redirectUrl;
                        }
                        else {
                            window.location.reload(true);
                        }
                    }
                    else {
                        $(errorEl).find('span').html(data.errors[0].msg);
                        $(errorEl).show();
                    }
                },
                error: function () {
                    $(loadingEl).hide();
                    $(errorEl).find('span').html(this.tryAgainLaterErrorMessage);
                    $(errorEl).show();
                },
                context: me
            });
        }

    }
})(jQuery);

$(document).ready(function () {
    logonManager.init()
});