
$( document ).ready(function(){
    function checkForm(obj){

        canSubmit = true;

        var missingObjs = $(obj).find(".requiredMissing");
        var passwordObjs = $(obj).find(".requiredPassword");
    
        if(missingObjs.length > 0){
            canSubmit = false;
        }

        if(passwordObjs.length > 0){
            canSubmit = false;
        }


        if(canSubmit){
            $(obj).find("input[type='submit']").removeAttr('disabled');
        }else{
            $(obj).find("input[type='submit']").attr('disabled','disabled');
        }

        return canSubmit;

    }


    function checkAccordian(obj){


        contentContainer = obj.closest('.ui-accordion-content');

        labeledBy = $(contentContainer).attr('aria-labelledby');

        header = $("#" + labeledBy);

        errorObjs = $(contentContainer).find('.requiredMissing, .requiredPassword , .tooLong');

        if(errorObjs.length > 0){
            header.addClass('accordianErrorTab');
        }else{
            header.removeClass('accordianErrorTab');
        }

        
    }

    function checkTab(obj){

        canSubmit = true;

        obj = $(obj);

        if(obj.find(".requiredMissing").length > 0){
            canSubmit = false;
        }


        if(obj.find(".requiredPassword").length > 0){
            canSubmit = false;
        }

        if(obj.find(".tooLong").length > 0){
            canSubmit = false;
        }


        id = obj.attr('id');


        tab = obj.parent().parent().find('a[href="#'+id+'"]' );

        if(canSubmit){
            tab.parent().removeClass('tabFailedValidation');
        }else{
            tab.parent().addClass('tabFailedValidation');
        }


    }

    function checkTabAndAccordiain(obj){

        checkTab(obj.closest('.tab-pane'));

        if( obj.closest('.ui-accordion') ){
            checkAccordian(obj);
        }
    }

    //validation
    $('form').each(function(ind,obj){

        $('form').submit(function(e){

            $(obj).find('input , textarea').each(function(ind,inputObj){

                $(inputObj).keyup();
            });

            if( ! checkForm($(this) ))  {
                e.preventDefault();
            }


        });

        $(obj).find('input.required , textarea.required').each(function(ind,obj){

            if($(obj).val().trim() == ""){

                $(obj).addClass('requiredMissing');
            }

            function check(){

                if($(this).val().trim() == ""){
                    $(this).addClass('requiredMissing style');
                }else{
                    $(this).removeClass('requiredMissing style');
                }

                checkForm($(this).closest('form'));
                checkTabAndAccordiain($(this));

            }

            $(obj).keydown(check);
            $(obj).keyup(check);
            $(obj).change(check);
        });

        $(obj).find('input.maxlengthCheck , textarea.maxlengthCheck').each(function(ind,obj){



            function check(obj){

                obj.parent().find('.maxlengthDisplay').html(obj.val().length);

                if (obj.val().length > obj.attr('maxlength')){
                    obj.addClass('tooLong');
                }else{
                    obj.removeClass('tooLong');
                }

                checkForm($(obj).closest('form'));
                checkTab($(obj).closest('.tab-pane'));
            }


            $(obj).keyup(function(){check($(this))});
            $(obj).keydown(function(){check($(this))});

            check($(obj));



        });


        $(obj).find('input.passwordVerify, input.singlePassword').each(function(ind,passwordObj){

            function check(){

                pairName     = $(passwordObj).data('pairinput');
                pairedObject = $("#"+pairName);

                passwordSpan = $(passwordObj).parent().parent().find('div.passwordResult');
                passwordWarning = $(passwordObj).parent().parent().parent().find('div.passwordWarning');

                if(!passwordSpan){
                    passwordSpan = $(passwordObj).parent().find('div');
                }

                errors = "";

                if($(this).hasClass('singlePassword')){
                    //Do Nothing. We only have a single password
                }else{

                    if($(this).val() != pairedObject.val()){

                        errors += "Passwords do not match <br >";
                    }
                }

                password = $(this).val();

                passwordLen = password.length

                if(passwordLen == 0){



                }else if(passwordLen < 8){
                    errors += "Password is not long enough<br >";
                }

                fields = [];

                $(this).closest('form').find('input').each(function(i,obj){

                    if( $(obj).hasClass('passwordVerify')  ||
                        $(obj).hasClass('passwordVerify')  ||
                        $(obj).hasClass('singlePassword') 
                    ){
                        return ;

                    }

                    if($(obj).val() == 'N' || $(obj).val() == 'Y'){
                        return;
                    }

                    if($(obj).attr('type') == 'submit'){
                        return;
                    }

                    if($(obj).attr('name') == 'csrf'){
                        return;
                    }


                    if($(obj).val() != ''){
                        fields.push($(obj).val());
                    }
                });


                result = zxcvbn(password,fields);


                meter = $(this).closest('.form-group ').find(".password-strength-meter")


                $(meter).attr('value', result.score);

                warnings = "";


                if(result.score < 3 && passwordLen > 0){

                    errors += "Password is not complicated enough<br/>"

                    if(result.feedback.warning){
                        warnings += result.feedback.warning + '<br>';
                    }


                    for(i =0; i<result.feedback.suggestions.length; i++){
                        warnings += result.feedback.suggestions[i] + '<br>';
                    }

                }

                if(warnings == ""){
                    passwordWarning.removeClass('alert alert-warning');

                    passwordWarning.html('');

                    passwordWarning.hide();
                }else{
                    passwordWarning.addClass('alert alert-warning');

                    passwordWarning.html(warnings);

                    passwordWarning.show();
                }

                
                

                if(errors == ""){
                    passwordSpan.removeClass('alert alert-danger');


                    $(this).removeClass('requiredPassword');
                    pairedObject.removeClass('requiredPassword');


                    passwordSpan.html("");

                }else{
                    passwordSpan.addClass('alert alert-danger');

                    $(this).addClass('requiredPassword');
                    pairedObject.addClass('requiredPassword');

                    passwordSpan.html(errors);
                }


                



                checkForm($(this).closest('form'));

                checkTabAndAccordiain($(this));



            }

            $(passwordObj).keydown(check);
            $(passwordObj).keyup(check);



        });


        $(".genPassword").click( function(){

            var formGroup = $(this).closest('.form-group');

            var passwordInputs = formGroup.find('input');


            var passwordInput = null;
            var verifyPasswordInput = null;

            passwordInput = $(passwordInputs[0]);

            if (  passwordInputs.length == 2 ){
                verifyPasswordInput = $(passwordInputs[1]);
            }

            var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
            var string_length = 10;
            var randomstring = '';
            for (var i=0; i<string_length; i++) {
                var rnum = Math.floor(Math.random() * chars.length);
                randomstring += chars.substring(rnum,rnum+1);
            }


            if(passwordInput){
                passwordInput.attr('type','text');
                var iObj = passwordInput.parent().find('i');

                iObj.addClass('fa-eye');
                iObj.removeClass('fa-eye-slash');

                passwordInput.val(randomstring)

                
            }


            if(verifyPasswordInput){
                verifyPasswordInput.attr('type','text');
                var iObj = verifyPasswordInput.parent().find('i');

                iObj.addClass('fa-eye');
                iObj.removeClass('fa-eye-slash');

                verifyPasswordInput.val(randomstring)
            }



            passwordInput.keydown();

        });


        checkForm(obj)

        $(obj).find('.tab-pane').each(function(i,tabObj){
            checkTab($(tabObj));
        });

        window.setTimeout(function(){
            accordians = $(obj).find('.ui-accordion-content');

            accordians.each(function(i, accdObj){
                checkAccordian(accdObj);
            } );

        }, 100);

    });
});