function moveTo(input) {
    var targetOffset = input.offset().top - 40;
    $('html,body').animate({scrollTop: targetOffset}, 200 );
    input.get(0).focus();
}

function showErrorOn(input){
    $(input).addClass('error');
    $(input).parent().siblings('.iferror').show();
}

function addErrorMessage(input, msg){
    $(input).parent().siblings('.iferror').html(msg);
}

function isEmpty(input){
    if($(input).hasClass('required')){
        var value = $(input).val().replace(/^\s+|\s+$/g, '');
        if (value.length == 0){
            addErrorMessage(input, 'Required');
            return true;
        }
    }
    return false;
}

function isValid(input){
    valid = true;
    classes = $(input).attr('class').split(' ');
    $.each(classes, function(i, val){  
        switch(val){
            case 'verifyEmail':
                if ($(input).val().length > 0){
                    var emailFilter=/^.+@.+\..{2,}$/;
                    var illegalChars= /[\(\)\<\>\,\;\:\\\/\"\[\]]/
                    if (!(emailFilter.test($(input).val())) || $(input).val().match(illegalChars)) {
                        addErrorMessage(input, 'Not a valid email address');
                        valid = false;
                    }else{
                        $(input).val($(input).val().toLowerCase());
                    }
                }
            break;
            
            case 'verifyPhone':
                phone = $(input).val().replace(/[\(\)\.\-\ ]/g, '');
                if (phone.length > 0){
                    if (isNaN(parseInt(phone))){
                        addErrorMessage(input, 'Phone is not valid');
                        valid = false;
                    }else if (!(phone.length == 10)){
                        addErrorMessage(input, 'Phone is not the correct length. Please make sure you include the area code.');
                        valid = false;
                    }else{
                        $(input).val(phone.slice(0,3)+'-'+phone.slice(3,6)+'-'+phone.slice(6,10));
                    }
                }
            break;
        }
    });
    return valid;
}

function checkForm(){
    errors = false;
    
    inputs = $('form').find('input[class*=verify], input.required, textarea.required, select.required');
    $.each(inputs, function(i, input){
        switch($(input).attr('type')){
            case 'text':
            case 'textarea':
                if (isEmpty(input) || !isValid(input)){
                    showErrorOn(input);
                }
            break;
            case 'select-one':
                if (isEmpty(input)){
                    showErrorOn(input);
                }
            break;
        }
        if($('form').find('.error').length > 0){
            errors = true;
        }
    });
    return errors;
}

$(document).ready(function(){
    $('.proper').keyup(function(){
        $(this).val($(this).val().slice(0,1).toUpperCase() + $(this).val().slice(1).toLowerCase());
    });
    $('.proper').blur(function(){
        $(this).val($(this).val().slice(0,1).toUpperCase() + $(this).val().slice(1).toLowerCase());
    });

    $('.lower').keyup(function(){
        $(this).val($(this).val().slice(0).toLowerCase());
    });
    
    $('.lower').blur(function(){
        $(this).val($(this).val().slice(0).toLowerCase());
    });
    
    //get all input/textareas/selects
    $('form').submit(function(){
        $('form').find('input[class*=verify], input.required, textarea.required, select.required').removeClass('error');
        $('.iferror').html('').hide();
        
        if ($('input[name=cardnumber]').length > 0){
            $('input[name=cardnumber]').val($('input[name=cardnumber]').val().replace(/[-' ']/g,''));
            if(!checkCreditCard($('input[name=cardnumber]').val(), $('select[name=cardtype]').val())){
                addErrorMessage($('input[name=cardnumber]'), ccErrors[ccErrorNo]);
                showErrorOn($('input[name=cardnumber]'));
            }else{
                $('input[name=cardnumber]').parent().siblings('.iferror').html('');
                $('input[name=cardnumber]').parent().siblings('.iferror').hide();
                $('input[name=cardnumber]').removeClass('error');
            }
        }
        
        if(checkForm()){
            moveTo($('form').find('.error:first'));
            return false;
        }else{
            return true;
        }
    });            
});