/*
 * These are the criterias to validate the form fields
 *  Each criteria consist of the key, Default Message
 *  and the regular expression against which the field value is to be compared
 */
var comparison_criterias = new Array();
comparison_criterias[1] = new criteria('Non Numeric input',/(^\d+$)|(^\d+\.\d+$)/);//var anum=/(^\d+$)|(^\d+\.\d+$)/
comparison_criterias[2] = new criteria('invalid email',/^([a-zA-Z0-9-_.-;&amp;\+])+@([a-zA-Z0-9_.-])+\.([a-zA-Z])+([a-zA-Z])+/);//var pattern=/^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-])+\.([a-zA-Z])+([a-zA-Z])+/;
comparison_criterias[3] = new criteria('invalid time format',/^(([0]?[0-5][0-9]|[0-9]):([0-5][0-9]))$/);
comparison_criterias[4] = new criteria('invalid zipcode',/^\d{5}([\-]\d{4})?$/);
comparison_criterias[5] = new criteria('Date format needs to be mm/dd/year', /^\d{1,2}\/\d{1,2}\/\d{4}$/);

function criteria(imessage,iregex){    
    this.message = imessage;
    this.regex = iregex;
}

/*
 * This is the main function that runs the validation of the forms
 */
function validatefields(form,fields){
    var validate = true;
    for(var i in fields){
        var value = "";
        var field = fields[i];
        var fieldid = field.id;

        if(field.type == "custom"){
            
            switch(field.id){
                case("0"):
                    if(!custom_0())
                        validate = false;
                    break;
                case("1"):
                    if(!custom_1())
                        validate = false;
                    break;
                case("2"):
                    if(!custom_2())
                        validate = false;
                    break;
                case("3"):
                    if(!custom_3())
                        validate = false;
                    break;
                case("4"):
                    if(!custom_4())
                        validate = false;
                    break;
                case("5"):
                    if(!custom_5())
                        validate = false;
                    break;                  
                default:
                    fn = field.id;
                    fn = (typeof fn == "function") ? fn : window[fn]
                    if(!fn.apply())
                        validate = false;
                    break;
            }
                       
            continue;
        }


        if(field.type == "checkbox"){
            if(jQuery("input#"+fieldid).is(":checked")){
                value="checked";

            }
        }else{
            value = jQuery('#'+fieldid).val();
        }
        
        jQuery('#'+fieldid).removeClass('errorfield');
        jQuery('#'+fieldid+"_error").html("");
        var criterias = field.criteria;

        for(var j = 0; j < criterias.length; j++){
            if(criterias[j] == '0'){
                var message = (field.errmsg)?field.errmsg:"This is a required field";
                if(value==null||value==""){
                    displayErrorMessage(fieldid,message);
                    validate = false;
                }
            }else{
                var criteria = comparison_criterias[criterias[j]];
                var message = (field.errmsg)?field.errmsg:criteria.message;
                var regex = criteria.regex;                
                if(value && !regex.test(value)){
                    displayErrorMessage(fieldid,message);
                    validate = false;
                }
            }
            
        }
    }
    return validate;
}

/*Object field*/
function field(itype,iid,ierrmsg,icriteria){
    this.type = itype;
    this.id = iid;
    this.criteria = icriteria;
    this.errmsg = ierrmsg;
}

/*To validate single field*/
function validateSingleField(itype,iid,ierrmsg,icriteria){
    var fields = new Array();
    fields[0] = new field(itype,iid,ierrmsg,icriteria);
    return validatefields(null,fields);
}

/*
 * Renders the message
 */
function displayErrorMessage(fieldid,message){
    if(jQuery('#'+fieldid+'_error').length == 0){        
        var html = '<div class=errorbox id="'+fieldid+'_error">'+message+'</div>';
        var parent = jQuery('#'+fieldid).parent();
        parent.append(html);
        jQuery('#'+fieldid).val('');        
    }else{        
        jQuery('#'+fieldid+'_error').html(message);
    }
    jQuery('#'+fieldid).addClass('errorfield');
}

function validate(id){
    thisform = jQuery('#'+id);
    var children = getAllChildren(thisform);
    var fields = new Array();
    var j = 0;
    for(var i=0; i< children.length; i++){
        elem = children[i];
        var criterias = elem.attr('validate');
        if(criterias){
            if(criterias == "custom"){
                fields[j++] = new field("custom",elem.val());
            }else{
                var criterias1 = criterias.split(" ");
                var criteria_params = new Array();
                for(var k=0; k < criterias1.length; k++){
                    switch(criterias1[k]){
                        case('required'):
                            criteria_params[k] = '0';
                            break;
                        case('numeric'):
                            criteria_params[k] = '1';
                            break;
                        case('email'):
                            criteria_params[k] = '2';
                            break;
                        case('date'):
                            criteria_params[k] = '3';
                            break;
                        case('zipcode'):
                            criteria_params[k] = '4';
                            break;
                        case('date1'):
                            criteria_params[k] = '5';
                            break;
                    }
                }
                fields[j++] = new field("",elem.attr('id'),'', criteria_params);
            }
        }
    }
    return validatefields(thisform,fields);
}

function getAllChildren(element){
    var children = new Array();
    getChildren(element,children);
    return children;
}

function getChildren(element,children){
    element.children().each(function() {
        var child = jQuery(this);
        children.push(child);
        getChildren(child,children);
    });
}

var back = -1;
jQuery(document).ready(function(){
    jQuery('#back').click(function(){
        back = 1;
    });
    jQuery('#next').click(function(){
        back = 0;
    });
    jQuery('.validation_required').submit(function(){        
        var loadingmsg = jQuery(this).attr('loadingmsg');
        if(back == 1 || jQuery(this).hasClass('skipValidation')) {
            return true;
        }        
        var valid = validate(jQuery(this).attr('id'));        
        if(valid){
            if(loadingmsg){
                jQuery.blockUI({
                    message:'<p>'+loadingmsg+'</p><img src="/skin/frontend/default/shelfreliance/images/parties/ajax-loader-bar.gif" />'
                });
            }
        }
        return valid;
    });
});
