var formVal = new formValidate;

function formValidate(){
  	var errorMess;
  	var allLabels = document.getElementsByTagName('label');

  	var msgs = new Array;
		msgs['number'] = "must be a number";
		msgs['email'] = "must be a valid email address";
		msgs['url'] = "must be a valid URL";
		msgs['required'] = "is required";
		msgs['required_length'] = "must be at least %d-character length";
		msgs['phone'] = "must be a valid phone number";
		msgs['file'] = "file type is not allowed to be uploaded. Valid extensions are: %s";
		msgs['alnum'] = "cannot contain special characters or spaces";	
	
	var eregs = new Array;
		eregs['url'] = /^(https?|ftp):\/\/([a-z0-9._-]+:[a-z0-9._-]+@)?[a-z0-9._\/~% -]+(\?([a-z0-9_-]+(=[a-zA-Z0-9+%?_-]+&?)?)*)?$/i;
		eregs['email'] = /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/i;
		eregs['alnum'] = /^[a-z0-9-_]+$/i;
		eregs['phone'] = /^\+?[0-9\s\(\)\.-]+$/i;

  	this.trim = _trim;
  	this.addErrorMess = addErrorMess;
  	this.check = checkForm;
  	this.getLabel = getFieldLabel;
  	this.highlight = highlightErrorElement;
 
	function _trim(str) {
	  	if(str) {
	    	str = str.replace(/^\s+/, "");
	    	str = str.replace(/\s+$/, "");
		}
		return str;
	}
	
	function addErrorMess(eTitle, msg){  
	  	var args = addErrorMess.arguments;
	  		args = $A(args);
	  	var new_args = new Array;
			args.splice(0,2);
	  	args.each(function(each){
		    new_args.splice(null, null, '"'+each+'"');
		});	  
	
		if(new_args.length > 0){
			mess = eval("sprintf('"+msgs[msg]+"', "+new_args.join(',')+")");
		}else mess = msgs[msg];			
	
		errorMess += '<LI>"' + eTitle + '" ' + mess + "</LI>"; 
		is_error = true;  
	}
	
	function checkForm() {
	  	errorMess = "";
	    var args = checkForm.arguments;
	    var theButton = args[0];
	    var f = args[1];
	    var arr, field, eTitle, eType, minLength, elem, val, cnt, i, j;
	
	    if(document.forms[f]) {
	      	
	        for(i = 2; i < args.length; i++) {
	          	is_error = false;
	            arr = args[i].split(":");
	            field = this.trim(arr[0]);
	                        
	            label = this.getLabel(field);
	            
	            eTitle = label.innerHTML;
	            
	            if(!eTitle) eTitle = field;
	            eType = this.trim(arr[1]);
	            minLength = this.trim(arr[2]);
	            elem = document.forms[f].elements[field];
	           
	            if(elem) {
	   
	                val = this.trim(elem.value);
	
	                if(val != "") {
	                  	switch(eType){
						    case "number":
						    	val = val.replace(",", ".");
	                        	if(isNaN(val)){
								  	this.addErrorMess(eTitle, eType);							  
								}
						    break;
						    
						    case "file":
						    	if(elem.getAttributeNode('exts')){
									var allowedExts = elem.getAttributeNode('exts').value.split(',');
			                      	
			                      	thisFileExt = elem.value.split(".");
			                      	
			                      	thisFileExt = thisFileExt[thisFileExt.length-1].toLowerCase();
			                      	
			  						var allExts = $A(allowedExts);
			  						
									toReturn = false;	
														
									allExts.each(
										function(eachExt){
											if(eachExt==thisFileExt) toReturn=true;										
										}
									);  
									
									if(!toReturn){
									  	this.addErrorMess(eTitle, eType, allowedExts.join(', '));
									}  
								}			    
						    break;
						    
						    default:
						    	if(eregs[eType]){
									if(val.search(eregs[eType]) == -1) addErrorMess(eTitle, eType);
								}							 
						    break;
						}	
	
	                } 
	
	                if(minLength) {
	                    if(elem.length) {
	                        if(elem.options) {
	                            for(j = cnt = 0; j < elem.options.length; j++) {
	                                if(elem.options[j].selected && elem.options[j].value != "") cnt++;
	                            }
	                        }
	                        else for(j = cnt = 0; j < elem.length; j++) {
	                            if(elem[j].checked) cnt++;
	                        }
	                    }
	                    else if(elem.type == "checkbox") cnt = elem.checked ? 1 : 0;
	                    else cnt = val.length;
	                    if(cnt < minLength){
						  	if(cnt < 1){
							    this.addErrorMess(eTitle, 'required');
							}else{
							  	this.addErrorMess(eTitle, 'required_length', minLength);
							}
						}
						
	                }

	            	this.highlight(elem, is_error);
			
	            }
	          
	        }
	
		    if(errorMess!=""){
				top.window.showError("<UL>"+errorMess+"</UL>");
				return false;  
			}
		    else{
		    	theButton.disabled = true;
		    	Element.addClassName(theButton, "disabled");
		    	theButton.value = "Please Wait...";
		    	document.forms[f].submit(); 
		    }
	    }
	
	}
	
	function getFieldLabel(fName){
	  	fName = fName.replace(/\[\]/i, "");
	  	
		for(var i=0; i<allLabels.length; i++){	    
		    if(allLabels[i].getAttributeNode('for').value==fName){
			  	return allLabels[i];
			}		
		}
	}
	
	function highlightErrorElement(form_element, is_error){
		
	    if(!form_element.type){	    	
	    	element = document.getElementsByName(form_element);
		    form_element = element[0];	        
		}
		
		if(form_element){
		  	
			var	theLabel = this.getLabel(form_element.getAttributeNode('name').value);
				  	
			if(is_error) Element.addClassName(theLabel, "labelError");
			else Element.removeClassName(theLabel, "labelError");
			
			var errorClass = "";   	
			
		    	switch (form_element.type)
				 {
					 // Text fields, hidden form elements
					 case 'text':
					 case 'hidden':
					 case 'password':
					 case 'textarea':
					 	errorClass = "textError";
		
					 break;
					 
					 case 'file':
					 	errorClass = "fileError";
					 break;
					 
					 case 'select-one':
					 case 'select-multiple':
					 	errorClass = "selectError";
					 break;
					
					 // Radio buttons
					 case 'radio':
					 case 'checkbox':
					 
					 break;	
				} 
				
				if(is_error) Element.addClassName(form_element, errorClass);
				else Element.removeClassName(form_element, errorClass);	  
		}
		
		
	} 	
}

//--------------------------------------------------------------------------------------------------------
