val = {
    'mailinglist': {
        'mailinglist_email': function(form, value) {
			return validateEMail(value) && (
            	validateNotEmpty(form.find('.mailinglist_mobile')[0].value)
            	|| validateNotEmpty(value))
		},
        'mailinglist_mobile': function(form, value) {
        	return validatePhone(value) && (
            	validateNotEmpty(form.find('.mailinglist_email')[0].value)
            	|| validateNotEmpty(value))
		}
    },
    'submission_question': {
        'everyone': function(form, value) {
            authors = form.find('.author input[type="checkbox"]')
            for(var i = 0; i < authors.length; i++) {
                if(authors[i].checked) {
                    return true
                }
            }
            return $('#everyone')[0].checked
		},
		'submission_email': function(form, value) { return validateEMail(value) && validateNotEmpty(value) },
		'submission_question': function(form, value) { return validateNotEmpty(value) },
		'submission_terms': function(form, value) { return $('#submission_terms')[0].checked }
    },
    'email_form': {
        'email_to': function(form, value) { return validateEMail(value) && validateNotEmpty(value) },
        'email_from': function(form, value) { return validateEMail(value) && validateNotEmpty(value) }        
    },
    'submission': {
        'submission_firstname': function(form, value) { return validateNotEmpty(value) },
        'submission_email': function(form, value) { return validateEMail(value) && validateNotEmpty(value) },
        'photoUploadFile': function(form, value) { return validateNotEmpty(value)&& validatePhotoFile(value)},
        'uploadFile': function(form, value) { return validateNotEmpty(value)&& validateFile(value)},
        'submission_live_venue': function(form, value) { return !$('#submission_isliveshow')[0].checked || validateNotEmpty(value) },
        'submission_live_date': function(form, value) { return !$('#submission_isliveshow')[0].checked || (validateNotEmpty(value) && validateDate(value))},
        'submission_live_city': function(form, value) { return !$('#submission_isliveshow')[0].checked || validateNotEmpty(value) },
        'submission_live_state': function(form, value) { return !$('#submission_isliveshow')[0].checked || validateNotEmpty(value) },
        'submission_live_country': function(form, value) { return !$('#submission_isliveshow')[0].checked || validateNotEmpty(value) },
        'submission_terms': function(form, value) { return $('#submission_terms')[0].checked }
    },
    'contactus': {
        'reason': function(form, value) { return validateNotEmpty(value) },
        'sender': function(form, value) { return validateEMail(value) && validateNotEmpty(value) },
        'message': function(form, value) { return validateNotEmpty(value) },
        'agree': function(form, value) { return form.find('#agree')[0].checked }        
    },
    'comment': {
        'author': function(form, value) { return validateNotEmpty(value) },
        'email': function(form, value) { return validateEMail(value) && validateNotEmpty(value) },
        'comment': function(form, value) { return validateNotEmpty(value) }
    }
}

function validateNotEmpty(value) {
	return value.length > 0
}

function validateFile(value) {

	var dot = value.lastIndexOf("."); 
	if( dot == -1 ) return false; 
	var extension = value.substr(dot,value.length); 
	if(extension.toLowerCase()!=".avi"&& extension.toLowerCase()!=".mpeg" && extension.toLowerCase()!=".mov"){
		return false;
	}
 	return true;
}

function validatePhotoFile(value) {

	var dot = value.lastIndexOf("."); 
	if( dot == -1 ) return false; 
	var extension = value.substr(dot,value.length); 
	if(extension.toLowerCase()!=".jpeg" &&extension.toLowerCase()!=".jpg" &&extension.toLowerCase()!=".gif" ){
		return false;
	}
 	return true;
}

function validateDate(value) {
	var RegExPattern = /^(?=\d)(?:(?:(?:(?:(?:0?[13578]|1[02])(\/)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})|(?:0?2(\/)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))(\/)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2}))($|\ (?=\d)))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$/;
    return value.length == 0 || value.match(RegExPattern);
    
}

function validatePhone(value) {
    return value.length == 0 || value.match(/^[2-9]\d{2}[-\/]?\d{3}[-\/]?\d{4}$/)
}

function validateEMail(value) {
    /* Regex taken from http://www.quirksmode.org/js/mailcheck.html */
    return value.length == 0 || value.match(/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/)
}

function validate(form, rules) {
    
    $('.main_error').hide()
    form.find('.error').hide()
    form.find('.invalid').removeClass('invalid')
    
    valid = true
	inputs = form.find(':input')
	for(var i = 0; i < inputs.length; i++) {
	    
	    //skip fields without validation rules
	    if(val[rules][inputs[i].name] == null) { continue }
	    
	    if(!val[rules][inputs[i].name](form, inputs[i].value)) {
	    	form.find('.' + inputs[i].name).focus()
	    	form.find('.' + inputs[i].name + '_error').show()
	        $(inputs[i]).addClass('invalid')
	        valid = false
	    }
	}
	
	if(!valid && rules != 'mailinglist') {
	    $('.main_error').show()
	}
	
	return valid
}