// PROTOFORM v1.0 (21/05/2008)- F.BURATTI - WWW.CSSREVOLT.COM

REGEX_AUTO_FIELD  = /^[^_]+(_Req)?(_(Tel|Email|Url|Date|Day|Month|Year|Number|Bankaccount))?$/;
REGEX_BLANK       = /^\s*$/;
REGEX_EMAIL       = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-]{2,})+\.)+([a-zA-Z0-9]{2,})+$/;
REGEX_TEL         = /^([0-9]{2,4}\-?\ ?\/?[0-9]{6,8})$/;
REGEX_MOB         = /^([0-9]{2}\-?\ ?\/?[0-9]{8})$/;
REGEX_URL         = /^(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?/;
REGEX_DAY         = /^(0?[1-9]|[1-2][0-9]|3[01])$/;
REGEX_MONTH       = /^(0?[1-9]|1[0-2])$/;
REGEX_YEAR        = /^[0-9]{4}$/;
REGEX_NUMBER      = /^[0-9]{1,3}$/;
REGEX_BANKACCOUNT = /^[0-9]{3,9}$/;
REGEX_TYPED_FIELD = /_(Tel|Email|Url|Date|Day|Month|Year|Number|Bankaccount)$/;
REGEX_CHECK       = 'Check';
REGEX_SELECT      = 'Select';
REGEX_OPTION      = 'Option';    

function sendData (idform) {
    form.submit();
}//sendData

function showLoad () {
	$('box').insert({top:'<p id="working">loading...</p>'});
}

function addFormChecks() {	
	$$('form.validate').each(function(form) {
    	Event.observe(form,'submit',checkForm);	
	});
} // addFormChecks

function checkForm(e) {    
    var form = Event.element(e);
	Event.stop(e);
    var errors = '';
    var faulty = null;
		if ($('response')) {
			$('response').hide();		
			}
	for (var index = 0; index < form.elements.length; ++index) {
		
        var field = form.elements.item(index);                    
        
            if(field.id.match(REGEX_CHECK)){                
                if(field.checked == false){
                    errors += '<li>' + field.title + '</li>';
                    faulty = faulty || field;
                    continue;                
                }
            }  
            
            if(field.id.match(REGEX_SELECT)){                
                if(field.value == "0"){
                    errors += '<li>' + field.title + '</li>';
                    faulty = faulty || field;
                    continue;                
                }
            }                
      
            if(field.id.match(REGEX_OPTION)){                
                if(field.value == ""){
                    continue;                
                }
                else{
                    var type  = "Option";
                    var error = checkTypedField(field.value, type);                    
                    if(error){
                        errors += '<li>' + field.title + '</li>';
                        faulty = faulty || field;                                    
                        continue;                
                    }

                }
            }       
            
            if (!field.id.match(REGEX_AUTO_FIELD)) {
            	continue;
			}
        		
        var value = $F(field);
           
            if (field.id.match(/_Req/) && value.match(REGEX_BLANK)) {
            	errors += '<li>' + field.title + '</li>';
            	faulty = faulty || field;
            	continue;
        	}
		
		var typedfield = field.id.match(REGEX_TYPED_FIELD);		
                   
			if (typedfield  && !value.match(REGEX_BLANK)) {
	    		var type = typedfield[1];
	    		var error = checkTypedField(value, type);
	    		if (error) {
					errors += '<li>' + field.title + '</li>';
					faulty = faulty || field;
	    		}
			}            
	}
		
    if (errors==0) {		        
        form.submit(); // validation passed, send ajax request		
	}
    else{
        if (!$('error')) {    
            $('box').insert({top:'<ul id=\"error\"><strong>Je hebt nog niet alle gegevens (correct) ingevuld.</strong>' + errors + '</ul>'});
        }
        else {
            $('error').replace('<ul id=\"error\"><strong>Je hebt nog niet alle gegevens (correct) ingevuld.</strong>' + errors + '</ul>');    
        }    
        faulty.focus(); 
    }   	
} //checkForm

function checkTypedField(value, type) {

    if ('Tel' == type) {
		var phone= value;
        if (!phone.match(REGEX_TEL)) {
        	return true;
		}     
    }
	
	if ('Email' == type) {
		var address= value;
		if (!address.match(REGEX_EMAIL)) {
        	return true;
		}     
    }
	
	if ('Url' == type) {
		var resource= value;
		if (!resource.match(REGEX_URL)) {
        	return true;
		}     
    }
  
      if ('Date' == type) {
        var comps = value.split('/');
        if (3 != comps.length || !comps[0].match(REGEX_DAY) ||
            !comps[1].match(REGEX_MONTH) ||
            !comps[2].match(REGEX_YEAR))
            return true;
    }
    
      if ('Day' == type) {
        var day = value;
        if (!day.match(REGEX_DAY)) {
            return true;
        } 
    }
    
      if ('Month' == type) {
        var month = value;
        if (!month.match(REGEX_MONTH)) {
            return true;
        } 
    }   
    
      if ('Year' == type) {
        var year = value;
        if (!year.match(REGEX_YEAR)) {
            return true;
        } 
    }     
	
      if ('Number' == type) {
        var number = value;
        if (!number.match(REGEX_NUMBER)) {
            return true;
        } 
    }      
    
      if ('Bankaccount' == type) {
        var bankaccount = value;
        if (!bankaccount.match(REGEX_BANKACCOUNT)) {
            return true;
        } 
    }    
    
    if('Option' == type) {
        var option = value;
        if (!option.match(REGEX_MOB)) {
            return true;
        } 
    }
    
    return null;
} //checkTypedField

function hoverFocus() { 
 	$$('form.validate input','form.validate textarea').each(function(item) {
    	Event.observe(item,'focus',function() {
      		Element.addClassName(this,'hoverfocus');
    	}.bind(item));
    	Event.observe(item,'blur',function() {
      		Element.removeClassName(this,'hoverfocus');
    	}.bind(item));
	});
}//hoverFocus

function validationInit() {	
	hoverFocus();
	addFormChecks();
}

document.observe ('dom:loaded', validationInit, false); 

