
var isFormValid = true;
var orFieldsValid = true;

var error_state = function(el)
{
    iva = el.data('valArray');
    
    var errState = true;
    
    for (i in iva) {                
        if (!iva[i]) {
            errState = false;
            isFormValid = false;
            break;
        }
    }
    
    if (iva.val_mustmatch != null/* && !iva.val_mustmatch*/) {		
        var mmArray = get_mustmatch_fields(el);        
        elMM = mmArray[0];
        elCompare = mmArray[1];
        
        pecMM = elMM.parents('.errorContainer');
        //pecCompare =  elCompare.parents('.errorContainer');
        
        pecMM.data('isValid',errState);
        error_toggle(pecMM);
        //pecCompare.data('isValid',errState);
        //error_toggle(pecCompare);
        
    } else {
        pec = el.parents('.errorContainer');	
        
        pec.data('isValid',errState);
        error_toggle(pec);
    }

}

var error_toggle = function(pec) 
{    
    if (!pec.data('isValid')) {
        pec.addClass('errorOn');
    } else {         
        pec.removeClass('errorOn');
    } 

}

var get_ifselected_fields = function(el)
{   
    ifClass = el.attr('className').match(/val_ifselected_[a-zA-Z0-9]+/);    
    strClass = new String(ifClass);
    ifGroup = strClass.replace(/val_ifselected_/,'');
    
    thenRequiredClass = 'val_thenrequired_' + ifGroup;	
    
    ifArray = new Array();		
    ifArray.push($('*.' + ifClass));
    ifArray.push($('*.' + thenRequiredClass));
    
    return ifArray;
}
        
var get_mustmatch_fields = function(el)
{   
    mmClass = el.attr('className').match(/val_mustmatch_[a-zA-Z0-9]+/);
    
    strClass = new String(mmClass);
    mmGroup = strClass.replace(/val_mustmatch_/,'');
    
    mmCompareClass = 'val_compare_' + mmGroup;	
    
    mmArray = new Array();		
    mmArray.push($('*.' + mmClass));
    mmArray.push($('*.' + mmCompareClass));
    
    return mmArray;
}

var get_allrequired_fields = function(el)
{   
    arClass = el.attr('className').match(/val_allrequired_[a-zA-Z0-9]+/);
      
    arArray = new Array();		
    arArray = $('*.' + arClass);
    
    return arArray;
}

var get_ph_fields = function(el) 
{
    //return phArray;
}

var val_phone = function()
{
    lenClass = $(this).attr('className').match(/val_phone_[0-9]/);
    len = new String(lenClass);
    len = len.replace(/[^0-9]/g, '');
    
    var v = $(this).val();
    var isValid = (v.length == len && v.match(/^[0-9]+$/)) ? true : false;
    
    return isValid;
}


var cancel_form = function()
{
    $('input[type=text]').each(function() {
        $(this).val('');
    });        
    $('select').each(function() {
        $(this).val('--');
    });        
    $('input[type=checkbox]').each(function() {
        if ($(this).attr('checked') == true) {
            $(this).removeAttr('checked');
            $(this).val('N');
        }
    });        
   
    $('input[type=radio]').each(function() {
        if ($(this).attr('checked') == true) {
            $(this).removeAttr('checked');
        }
    });        
}

var phone_complete_submit = function() {
//    if ($(this).parents('.errorOn').length == 0) {
    
        var phones = $('.phone_3:visible, .phone_4:visible').not('input.phone_ext');
        var phoneStarted = false;
        var phoneEmpty = false;
        var extStarted = false;
        
        //extVal = $('input[name="frm_c_phoneext"]').val();
        extVal = $('input.phone_ext').val();
        
        $(phones).each(function() {
            if ($(this).val() != '' && $(this).val() != null && $(this).val() != 'undefined') {
                phoneStarted = true;           
            }
            if (extVal != '' && extVal != null && extVal != 'undefined') {
                extStarted = true;           
            }
            if ($(this).val() == '' || $(this).val() == null || $(this).val() == 'undefined') {
               phoneEmpty = true;   
            } 
        });                               
        
        if(phoneStarted && phoneEmpty) {                    
            $('.phone_3').parents('.errorContainer_allvalid').addClass('errorOn');
            return false;
        } else if(phoneEmpty && extStarted) {                    
            $('.phone_3').parents('.errorContainer_allvalid').addClass('errorOn');
            return false;
        } else {
            $('.phone_3').parents('.errorContainer_allvalid').removeClass('errorOn');
            return true;
        };       
//    }
}

var validate_form = function()
{
    isFormValid = true;
    
    $('.errorContainer input.val_required:visible, ' +
        '.errorContainer input.val_notrequired:visible, ' +
        '.errorContainer textarea.val_required:visible, ' +
        '.errorContainer select:visible, ' +
        '.errorContainer .radio:visible, ' +
        '.errorContainer .checkbox:visible').each($(this).validate_field);        

    var isPhoneValid = true;
    
    $('.errorContainer_allvalid').each(function() {
        errKids = $(this).find('.errorOn');
        if (errKids.length > 0) {
            $(this).addClass('errorOn');
            isPhoneValid = false;
        } else {
            $(this).removeClass('errorOn');
            isPhoneValid = phone_complete_submit();             
        }

        //alert(errKids.length);
    });
        
    if (!isFormValid || !isPhoneValid) {
        var firstErrMsg = $('.errorOn')[0];
        var os = $(firstErrMsg).offset();
        if (os.top > 0) $('html, body').animate({scrollTop:os.top-10}, 'slow');
        return false;
    } else {
        $('.error_msg').css('display','none');
        return true;
    }		
}

var validate_init = function() 
{       
        
    jQuery.fn.val_required = function()
    {      
        //alert($(this).val());
        var isValid = ($(this).val()=="") ? false : true; 		
        return isValid;	
    }
    
    jQuery.fn.val_singlecheck = function()
    {      
        var grpName = this[0].name;
        var grpChkLen = $("input[name='" + grpName + "']:checked").length;	        
        
        var isValid = (grpChkLen==0) ? false : true; 	
        return isValid;	
    }
        
    jQuery.fn.val_radio_required = function()
    {      
        var grpName = this[0].name;
        var grpChkLen = $("input[name='" + grpName + "']:checked").length;	
        
        var isValid = (grpChkLen==0) ? false : true; 
        return isValid;	
    }
           
    jQuery.fn.val_select_required = function()
    {      
        var isValid = ($(this).val()=="" || $(this).val()=="--") ? false : true; 		
        return isValid;	
    }
    
    jQuery.fn.val_email = function() 
    {
        var isValid = ($(this).val().match(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}/i) || $(this).val()=='') ? true : false;	// allows for blank entry (let val_required take care of that)	
        return isValid;
    }
    
    jQuery.fn.val_numeric = function() 
    {
        lenClass = $(this).attr('className').match(/val_numeric_[0-9]/);
        len = new String(lenClass);
        len = len.replace(/[^0-9]/g, '');
        
        var v = $(this).val();
        var isValid = (v.length == len && v.match(/^[0-9]+$/) || v=='') ? true : false;

        return isValid;
    }
    
    jQuery.fn.val_numeric_any = function() 
    {
        var isValid = ($(this).val().match(/^[0-9]+$/) || $(this).val()=='') ? true : false;    // allows field to be blank
        
        return isValid;
    }    

    jQuery.fn.val_max = function() 
    {
        maxClass = $(this).attr('className').match(/val_max_[0-9]+/);
        max = new String(maxClass);
        max = max.replace(/[^0-9]/g, '');
        
        var v = $(this).val();
        var isValid = (v <= max && v.match(/^[0-9]+$/)) ? true : false;
        
        return isValid;
    }

    jQuery.fn.val_min = function() 
    {
        minClass = $(this).attr('className').match(/val_min_[0-9]+/);
        min = new String(minClass);
        min = min.replace(/[^0-9]/g, '');
        
        var v = $(this).val();
        var isValid = (v >= min && v.match(/^[0-9]+$/)) ? true : false;
        
        return isValid;
    }
    
    jQuery.fn.val_mustmatch = function()
    {
        var mmArray = get_mustmatch_fields($(this));	
        
        var isValid = (mmArray[0].val() != mmArray[1].val()) ? false : true;		
        return isValid;
    }	
    
    jQuery.fn.val_allrequired = function()
    {
        var arArray = get_allrequired_fields($(this));	
        
        var isValid = true;
        
        for (i=1; i<arArray.length; i++) {
            if ($(arArray[i]).val() == "") {
                isValid = false;
                break;
            }
        }
		
        return isValid;
    }	    

    jQuery.fn.val_ifselected = function()
    {
        var ifArray = get_ifselected_fields($(this));	
        var isValid = true;
        
        //x = $(ifArray[0]).is(':checked');
        //y = (ifArray[1].val() != '') ? true : false;	
        if ($(ifArray[0]).is(':checked')) {
            isValid = (ifArray[1].val() != '') ? true : false;	
        }
        	
        return isValid;
    }
    
    jQuery.fn.validate_field = function()
    {
    
        el = $(this);		
        obj = new Object();
                    
        if (el.attr('type')=='radio') {
            obj['val_required'] = el.val_radio_required();
        } else if (el.is("select")) {
            obj['val_required'] = el.val_select_required();
        } else if (el.hasClass('val_notrequired')) {       
            obj['val_notrequired'] = true;
        } else {
            obj['val_required'] = el.val_required();
        }
        
        if (el.hasClass('val_email')) {                 // checks for email format
            obj['val_email'] = el.val_email();
        }			
        
        if (el.attr('class').match(/val_numeric_[0-9]/)) {    // checks for numeric characters only and with a specified length (eg. val_numeric_5 for use zip code) 
            obj['val_numeric'] = el.val_numeric();
        }   
        
        if (el.hasClass('val_numeric_any')) {    // checks for numeric characters only 
            obj['val_numeric_any'] = el.val_numeric_any();
        }   
        
        if (el.attr('class').match(/val_mustmatch/)) {  // checks two fields that must match (eg. val_mustmatch_email is compared against val_compare_email)
            obj['val_mustmatch'] = el.val_mustmatch();
            obj['val_compare'] = obj['val_mustmatch'];
        }
        
        if (el.attr('class').match(/val_allrequired/)) { // checks that all fields with same class have all been filled out
            obj['val_allrequired'] = el.val_allrequired();
        }   

        if (el.attr('class').match(/val_max/)) {    // checks for numeric characters only and a value that is less than or equal to a maximum value
            obj['val_max'] = el.val_max();
        }  

        if (el.attr('class').match(/val_min/)) {    // checks for numeric characters only and a value that is greater than or equal to a minimum value 
            obj['val_min'] = el.val_min();
        }  
        
        if (el.hasClass('val_singlecheck')) {                 // checks for single required checkbox (eg, I agree ...)
            obj['val_singlecheck'] = el.val_singlecheck();
        }  
        
        if (el.attr('class').match(/val_ifselected_/)) {                 // checks for one field being valid if another is chosen (eg, Other radio button and associated text field)
            obj['val_ifselected'] = el.val_ifselected();
        }          
        
        el.data('valArray', obj);		
        error_state(el);		
    }
    
    $('.errorContainer .val_required').keyup(function(e) {
        if ($(this).parents('.errorContainer').hasClass('errorOn')) {
            if (!$(this).attr('class').match(/val_mustmatch/) && !$(this).attr('class').match(/val_compare/)) { // prevents immediate comparison of inputs which must match
                if (e.keyCode != 9) $(this).validate_field();
            }
        }
    });  
/*    
    $('.errorContainer_allvalid .val_required').keyup(function(e) {        
        errKids = $(this).parents('.errorContainer_allvalid').find('.errorOn');
        if (errKids.length > 0) {
            //if (e.keyCode != 9) $(this).parents('.errorContainer').addClass('errorOn');
        } else {
            if (e.keyCode != 9) $(this).parents('.errorContainer').removeClass('errorOn');
            if (e.keyCode != 9) $(this).parents('.errorContainer_allvalid').removeClass('errorOn');
        }        
    });    
*/    
    $('.errorContainer_allvalid .val_required').keyup(function(e) {        
        errKids = $(this).parents('.errorContainer_allvalid').find('.errorOn');
        if (errKids.length > 0) {
            //if (e.keyCode != 9) $(this).parents('.errorContainer').addClass('errorOn');
        } else {
            if (e.keyCode != 9) $(this).parents('.errorContainer').removeClass('errorOn');
            if (e.keyCode != 9) $(this).parents('.errorContainer_allvalid').removeClass('errorOn');
        }        
    });    

    
 //   $('.errorContainer .val_required').blur(
    $('.errorContainer input[class*=val_]')
        .not('.errorContainer input.val_skip_onblur')
        .blur(
            $(this).validate_field
        );
/*
    $('.errorContainer_allvalid .val_required').blur(function(e) {        
        errKids = $(this).parents('.errorContainer_allvalid').find('.errorOn');
        if (errKids.length > 0) {
            //$(this).parents('.errorContainer').addClass('errorOn');
        } else {
            $(this).parents('.errorContainer').removeClass('errorOn');
            $(this).parents('.errorContainer_allvalid').removeClass('errorOn');
        }        
    }); 
*/
    $('.errorContainer_allvalid .val_required').blur(function(e) {        
        errKids = $(this).parents('.errorContainer_allvalid').find('.errorOn');
        if (errKids.length > 0) {
            //$(this).parents('.errorContainer').addClass('errorOn');
        } else {
            $(this).parents('.errorContainer').removeClass('errorOn');
            $(this).parents('.errorContainer_allvalid').removeClass('errorOn');
        }        
    }); 
    
    
    $('.errorContainer select').change(
        $(this).validate_field
    );
    
    $('.errorContainer_allvalid select').change(function(e) {        
        errKids = $(this).parents('.errorContainer_allvalid').find('.errorOn');
        if (errKids.length > 0) {
            $(this).parents('.errorContainer_allvalid').addClass('errorOn');
        } else {
            $(this).parents('.errorContainer_allvalid').removeClass('errorOn');
        }        
    });      
    
    $('.errorContainer input:radio, .errorContainer input:checkbox')
        .not('.errorContainer input.val_skip_onblur')
        .click(function() {
            $(this).blur();
            $(this).focus();
            $(this).validate_field;
        });

    $('input[name="frm_op_phone1"],'+
        'input[name="frm_op_phone2"],'+
        'input[name="frm_op_phone3"],').blur(function(e) { 
        
            var phones = $('.phone_3:visible, .phone_4:visible').not('input.phone_ext');
            var phoneEmpty = false;
            var phoneAllValid = true;
            
            $(phones).each(function() {
                if ($(this).val() == '' || $(this).val() == null || $(this).val() == 'undefined') {
                   phoneEmpty = true;   
                } 
                if ($(this).parent().hasClass('errorOn')) phoneAllValid = false;
            });                               
            
            if (!phoneAllValid) {
                $(this).parents('.errorContainer_allvalid').addClass('errorOn');
            } else if(phoneEmpty || phoneAllValid) {                    
                $(this).parents('.errorContainer_allvalid').removeClass('errorOn');
            }        
        //}
    }); 

    $('input[name="frm_op_phone3"],').blur(function(e) { 
        
        var phones = $('.phone_3:visible, .phone_4:visible').not('input.phone_ext');
        var phoneStarted = false;
        var phoneEmpty = false;
        var phoneAllValid = true;
        
        $(phones).each(function() {
            if ($(this).val() != '' && $(this).val() != null && $(this).val() != 'undefined') {
                phoneStarted = true;           
            }  
            if ($(this).val() == '' || $(this).val() == null || $(this).val() == 'undefined') {
               phoneEmpty = true;   
            } 
            if ($(this).parent().hasClass('errorOn')) phoneAllValid = false;
        });                               
        
        if(phoneStarted && phoneEmpty) {  
            $(this).parents('.errorContainer_allvalid').addClass('errorOn');
        } else if (!phoneAllValid) {
            $(this).parents('.errorContainer_allvalid').addClass('errorOn');
        } else {
            $(this).parents('.errorContainer_allvalid').removeClass('errorOn');
        }        
    });   

}


