function validateFbudForm( el_frm, dosubmit ) {
    //var el_frm = document.getElementById( frm_id );
    var s_class = "";
    var el = null;
    var s_tmp = "";
    var s_msg = "";
    var s_type = "";
    var arr_classes = new Array();
    if( el_frm ) {
        for( var i = 0; i < el_frm.elements.length; i++ ) {
            arr_classes = new Array();
            el = el_frm.elements[i];
            setBorder( el, 'success' );
            s_type = el.type;
            s_class = el.getAttribute('class');
            if( s_class == null ) {
                s_class = el.getAttribute('className');
            }   
            if( s_class != null && s_type != 'hidden' && el.style.display != 'none' ) {
                arr_classes = s_class.split( " " );
                for( var c = 0; c < arr_classes.length; c++ ) {
                    s_tmp = validateTrim( arr_classes[c] );
                    s_msg += processClass( s_tmp, el );
                }
                
            }
            //if( i >= 5 ) { break; }
        }
    }   
    if( s_msg == "" ) {  
        if( typeof( dosubmit ) == 'undefined' || dosubmit == true ) {
            el_frm.submit();
        } else {
            return true;
        }
        //alert( "submit here" );
    } else {
        alert( s_msg );
    }
    return false;
}

function processClass( s_class, el ) {
    
    var s_msg = "";
    var s_value = el.value;
    var s_title = el.title;
    var s_regex = "";
    
    
    var s_year = "";
    var s_tmp = "";
    
    // when validating a cc date the class will look something like this
    // validate-cc-exp-ccsave_expiration_year
    // the last '-' delimited element is the id of the expiration year
    // select. The value needs to be stripped out and processed before
    // continuing with validation.
    if( s_class.indexOf( 'fb-validate-cc-exp' ) != -1 ) {
        s_value = validateTrim( el.options[el.selectedIndex].value );
        var arr_tmp = s_class.split('-');
        // id of cc-exp-year input will be last arr element
        var year_id = arr_tmp[ arr_tmp.length - 1 ];
        var el_year = document.getElementById( year_id );
        if( el_year ) {
            s_year =  validateTrim( el_year.options[el_year.selectedIndex].value );   
        }
        s_tmp = "";
        for( var i = 0; i < arr_tmp.length - 1; i++ ) {
            if( s_tmp != "" ) {
                s_tmp += "-";
            }
            s_tmp += arr_tmp[i];
        }
        s_class = s_tmp;
    }
    
    // process passed in class
    switch( s_class ) {
        case 'fb-input-text': {
            return "";
        }
        case 'fb-required-entry': {
            //get element type
            //validate inputw
            s_value = validateTrim( s_value );
            if( s_value < 1 ) {
                s_msg = s_title + " is a required field";
            } else {
                el.value = s_value;
            }
            break;
        } 
        case 'fb-validate-phoneStrict': {
            s_regex = /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/;
            if( s_value.length == 10 ) {
                s_value = s_value.substr( 0,3 ) + "-" + s_value.substr( 3,3 ) + "-" + s_value.substr( 6,4 );
            }
            if( s_regex.test( s_value ) != true ) {
                s_msg = "Please enter a valid phone number.\n\tFor example (123) 456-7890 or 123-456-7890.";
            } else {
                el.value = s_value;
            }
            break;
        }
        case 'fb-validate-email': {
            s_regex = /^[a-z0-9,!\#\$%&'\*\+/=\?\^_`\{\|}~-]+(\.[a-z0-9,!#\$%&'\*\+/=\?\^_`\{\|}~-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*\.([a-z]{2,})/i;
            
            if( s_regex.test( s_value ) != true ) {
                s_msg = "Please enter a valid email address.";
            }
            break;
        }
        case 'fb-validate-password': {
            if( s_value.length < 6 ) {
                s_msg = "Password must be 6 characters or more";
            }
            break;
        }
        case 'fb-select-empty': {
            s_value = validateTrim( el.options[el.selectedIndex].value );
            if( s_value == "" ) {
                s_msg = s_title + " requires a selection";
            }
            break;
        }
        case 'fb-validate-zip': {
            //alert( s_value );
            if( s_value == "00000" ) {
                break;
            }
            break;
            s_regex = /(^\d{5}$)|(^\d{5}-\d{4}$)/;
            s_regex = /(^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}[A-Z,1-9]{1}$)/;
            if( s_regex.test( s_value  ) != true ) {
                s_msg = "Please enter a valid zip code";
            }
            break;
        }
        case 'fb-validate-cc-number': {
            // remove non-numerics
            s_value = removeDelimiters( s_value );

                var v = "0123456789";
                var w = "";
                for (i=0; i < s_value.length; i++) {
                    x = s_value.charAt(i);
                    if (v.indexOf(x,0) != -1)
                    w += x;
                }
                // validate number
                j = w.length / 2;
                k = Math.floor(j);
                m = Math.ceil(j) - k;
                c = 0;
                for (i=0; i<k; i++) {
                    a = w.charAt(i*2+m) * 2;
                    c += a > 9 ? Math.floor(a/10 + a%10) : a;
                }
                for (i=0; i<k+m; i++) c += w.charAt(i*2+1-m) * 1;
                if( c%10 != 0 || s_value == '' ) {
                    s_msg = "Please enter a valid Credit Card Number";
                }     
            break;
        }
        case 'fb-validate-cc-exp': {
            if( s_value == '' || s_year == '' ) {
                s_msg = "Please enter a valid expiration date";
            } else {
                var ccExpMonth   = s_value;
                var ccExpYear    = s_year;
                var currentTime  = new Date();
                var currentMonth = currentTime.getMonth() + 1;
                var currentYear  = currentTime.getFullYear();
                if (ccExpMonth < currentMonth && ccExpYear == currentYear) {
                    s_msg = "Please enter a valid expiration date";
                }
            }
            break;
        }
        case 'fb-validate-cc-cvn': {
            if( s_value.length != 3 && s_value.length != 4 ) {
                s_msg = "Please enter a valid Credit Card CVN";
            }
            break;
        }
        default: {
            return "";
        }
            
    }
    s_msg = validateTrim( s_msg );
    //alert( s_class + "\n" + el.value );
    if( s_msg != "" ) {
        setBorder( el, 'error' );  
        return s_msg + "\n";
    }
    setBorder( el, 'success' ); 
    return "";
}

function setBorder( el, state ) {
    try {
        if( state == "error" ) {
            el.style.backgroundColor = "#f6e8ce";
            //el.style.border = '1px dashed #cc003d';
        } else {
            el.style.backgroundColor = "#ffffff";
            //el.style.border = '1px solid #b6b6b6';
        }
    } catch( err ) {}
}
        
// short string trim function
// this function is optimized for short
// strings, longer strings will be very slow
function validateTrim(str) {
    return str.replace(/^\s*([\S\s]*)\b\s*$/, '$1');
}

function removeDelimiters (str) {
    str = str.replace(/\s/g, '');
    str = str.replace(/\-/g, '');
    return str;
}

function formatPhoneNumber( el, ev ) {
    var s_value = el.value; 
    s_value = removeDelimiters( s_value );        
    if (window.event) {
        var keycode = window.event.keyCode;
    } else if( ev ) {
        var keycode = ev.which;
    } else {
        return true;
    }
    // backspace or delete just carry one
    if( keycode == 8 || keycode == 46 ) {
        return;
    }
    //alert( keycode );
    if( keycode == 32 || keycode == 109 || keycode == 189 ) {      
        s_value = s_value.substr(0, s_value.length );
        el.value = s_value;
    } else if( ( keycode < 48 || ( keycode > 57 && keycode < 96 ) || keycode > 105 ) ) {
        s_value = s_value.substr(0, s_value.length - 1);
        el.value = s_value;
    }
    //alert( s_value.length );
    if( s_value.length > 10 ) {
        s_value = s_value.substr(0, 10);
    }
    if( s_value.length >= 6 ) {
        s_value = s_value.substr( 0,3 ) + "-" + s_value.substr( 3,3 ) + "-" + s_value.substr( 6,4 ); 
        el.value = s_value;  
    } else if ( s_value.length >= 3 ) {
        s_value = s_value.substr( 0,3 ) + "-" + s_value.substr( 3,3 )
        el.value = s_value;  
    }
    
}

function textCounter(field, count_container, maxlimit) {
    var temp_string = field.value.replace(/\r\n/g, "");     
    var temp_string = temp_string.replace(/\n/g, "");
    var temp_string = temp_string.replace(/\r/g, "");  
    //alert( temp_string.length );
    var nl_dif = field.value.length - temp_string.length;
    //alert( field.value.length );
    //alert( nl_dif );
    if (temp_string.length + nl_dif > maxlimit  ) { // if too long...trim it!
        field.value = field.value.substring(0, maxlimit);
    // otherwise, update 'characters left' counter
    } else { 
        count_container.innerHTML = maxlimit - field.value.length;
    }
}