var forms = {

	fieldErrors   : [],
	requiredField : "requiredfields",
	
	/* **********************************************
	this gets the required fields from a hidden input
	name = "requiredfields", php can create 
	********************************************** */
	getRequired : function()
	{
		if(dom.byId(forms.requiredField)){
			return dom.byId(forms.requiredField).value.split(",");
		}
	},
	
	
	/* **********************************************
	
	********************************************** */
	validate : function(e)
	{
		// clear any existing errors
		var errorMsg = "";
		var isError  = false;
		
		forms.fieldErrors = [];
		var frm = dom.getEventElement(e);
		
		//	check for empty form
		var fields = forms.emptyFormCheck(frm);
		if( fields ){
			// check used fields with required fields
			var reqFields = forms.getRequired();
			for(var f = 0; f < fields.length; f++) {
				
				// required field checking
				if( dom.inArray( dom.hasAttr(fields[f], "name", true ), reqFields ) && fields[f].value == ""){
					forms.fieldErrors.push(dom.hasAttr(fields[f], "name", true ));
					// set error
					errorMsg = "All required field(s) will need to be completed";
					isError = true;
					break;
				}
				
				//	email checking
				if( dom.hasAttr(fields[f], "name", true ) == "email" && !forms.checkEmail(fields[f].value) ){
					forms.fieldErrors.push("email");
					errorMsg = "Email address is not of the correct format";
					isError = true;
					fields[f].focus();
					break;
				}
				
				// username checking
				if( dom.hasAttr(fields[f], "name", true ) == "username" ){
					//
					fields[f].select();
				}
				
				// password checking
				if( dom.hasAttr(fields[f], "name", true ) == "password" ){
					//
				}
				
				// password checking
				if( dom.hasAttr(fields[f], "name", true ) == "confirm" && fields[f].value == "" ){
					forms.fieldErrors.push("confirm");
					errorMsg = "Please confirm your password";
					isError = true;
					fields[f].focus();
					fields[f].select();
					break;
				}
				
			}
		}
		// passed an empty form
		else{
			errorMsg = "An empty form can not be submitted, please fill out the form below";
			isError = true;
		}
		
		// parse error
		if(isError){
			forms.formError(errorMsg, frm);
			dom.cancel(e);
			return false;
		}
	},
	
	
	emptyFormCheck : function( postVars )
	{
		// stores usuable fields for testing
		var array = [];
		var f = 0;
		var countEmpty= 0;
		
		for(var i = 0; i < postVars.length; i++) {
			//exclude certain fields from test
			if( postVars[i].tagName.toLowerCase() == "input" ){
				
				if( !dom.inArray( dom.hasAttr(postVars[i], "type", true ), ["hidden", "submit", "image"] )){
					array[f] = postVars[i];
					array[f].value = forms.trim(postVars[i].value);
					if(array[f].value == "" ) countEmpty++;
					f++;
				}
			}
			else{
				array[f] = postVars[i];
				array[f].value = forms.trim(postVars[i].value);
				if(array[f].value == "" ) countEmpty++;
				f++;
			}
		}
		return (array.length != countEmpty) ? array : false;
	},
	
	
	
		
	/* **********************************************
	
	********************************************** */
	checkUsername : function(username, emailUsername, useAjax)
	{
		
		
	},


	/* **********************************************
	
	********************************************** */
	checkPassword : function(password, confirmed)
	{
		
		
	},


	/* **********************************************
	
	********************************************** */
	checkEmail : function(email)
	{
		return ( !email.match( /^[a-z0-9._-]+@([a-z0-9._-]+)\.([a-z0-9_-]){2,3}$/ ) ) ? false : true;		
	},
	
	
	trim : function(str)
	{
		return str.replace(/^\s+|\s+$/g, '');
	},
	

	/* **********************************************
	functionality for generic form error
	********************************************** */
	formError : function( value, frm )
	{
		// display error to user, on the page
		if( dom.byId("alert")){
			dom.byId("alert").innerHTML = value;
		}else{
			var div = dom.create("div");
			div.innerHTML = value;
			div.id = "alert";
			div.className = "error";
			frm.insertBefore(div, frm.firstChild);
		}
		
		// setup required field error
		if( forms.fieldErrors.length > 0 ){
			
			// update labels to show errorred fields
			var labels = dom.byTag("label", frm);
			for(var i = 0; i < labels.length; i++) {
				// get 'for="xxx"', see if its aganist the form erros
				var att = dom.hasAttr(labels[i], "for", true);
				if( att && dom.inArray(dom.hasAttr(labels[i], "for", true), forms.fieldErrors )){
					// set as error if so.
					// brute force change
					dom.addClass(labels[i], "error");
					// force label to change color based on above ALERT id
					var errorColor =  dom.getClassStyle( dom.byId("alert"), "color");
					if( errorColor && errorColor != dom.getClassStyle(labels[i], "color")){
						// force color of alert error 
						labels[i].style.color = errorColor;
					}
				}
				else{
					// reset color
					labels[i].style.color = "";
				}
			}
		}else{
			// reset color
			var labels = dom.byTag("label", frm);
			for(var i = 0; i < labels.length; i++) {
				labels[i].style.color = "";
			}
		}
	}
}