formVal = {
	fields:{},
	elements:{},
	messages:{},
	warnings:'',
	ns:'http://kieran.ca/code/formValidation',
	nsAlias:'val',
	
	fieldValidate: function (e) {
		// make up for IE's lack of attribute namespace support
		//   incidentally, IE seems to ignore the ns entirely
		if(e.setAttributeNS==null) e.setAttributeNS = function (ns,attr,val){return this.setAttribute(ns+':'+attr,val);}
		if(e.getAttributeNS==null) e.getAttributeNS = function (ns,attr){return this.getAttribute(ns+':'+attr) || this.getAttribute(nsAlias+':'+attr);}
	
		var req = e.getAttributeNS(this.ns,'required') || e.getAttribute('val:required');
		if(e.value.match(req)){
			e.className=e.className.replace(/\binvalid\b/g,'');
			e.className+=" valid"; // accomodate IE
			e.setAttributeNS(this.ns,'valid','valid');
			this.fields[e.name]='valid';
			this.messages[e.name]='';
			this.updateWarnings();
		}else{
			e.setAttributeNS(this.ns,'valid','invalid');
			e.className=e.className.replace(/\bvalid\b/g,'');
			this.fields[e.name]='invalid';
			e.className+=" invalid"; // accomodate IE
			this.messages[e.name] = e.getAttribute('val:msg') || (e.name + ' is invalid');
		}
		this.formValidate();
	},

	isValid: function (e) {
		var req = e.getAttributeNS(this.ns,'required') || e.getAttribute('val:required');
		if(e.value.match(req)) return true;
		return false;
	},

	fieldBlur: function (e) {
		e.value=e.value.replace(/^\s*\b(.*)\b\s*$/g,'$1');
		this.fieldValidate(e);
		this.updateWarnings();
	},
	
	formValidate: function() {return true;
		for(i in document.getElementsByTagName('input')){
			var input = document.getElementsByTagName('input')[i];
			if(typeof(input)!='object') continue;
			if(!input.getAttribute('val:required')) continue;
			alert(this.isValid(input));return;
			//alert(formVal.elements[element]);
			if(!input.getAttributeNS(formVal.ns,'valid')=='valid'){
				formVal.submitButton.disabled=true;
				return true;
			}
		}
		formVal.submitButton.disabled=false;
	},

	updateWarnings: function(){
		this.warnings='';
//		if(this.messages.length>0) this.warnings = '<p>'+this.messages.join('</p>\n<p>')+'<p>';
		for(v in this.messages){
			if(this.messages[v].length>2) this.warnings += '<p>'+this.messages[v]+'</p>';
		}
		if(this.warningDiv){
			if(this.warnings.length>0){
				this.warningDiv.innerHTML = this.warnings.replace(/^\s*\b(.*)\b\s*$/g,'$1');
				this.warningDiv.style.display="block";
				//formVal.submitButton.disabled=true;
				//alert('|'+this.warningDiv.innerHTML+'|');
			}else{
				this.warningDiv.style.display="none";
				//formVal.submitButton.disabled=false;
			}
		}
		//debug(this.warnings);
	},

	init: function(){
		for(i=0;i<document.getElementsByTagName('input').length;i++){
			input = document.getElementsByTagName('input')[i];
			if(input.getAttribute('type')=="submit") formVal.submitButton=input;
		}
		// attach events to INPUTS
		for(i=0;i<document.forms.length;i++){
			var form = document.forms[i];
			inputs = form.getElementsByTagName('input');
			for(j=0;j<inputs.length;j++){
				var input = inputs[j];
				if(!input.getAttribute(this.nsAlias+':required')) continue;
				//formVal.fieldValidate(input);
				input.onkeyup = function(){formVal.fieldValidate(this)};
				input.onblur = function(){formVal.fieldBlur(this)};
				if(input.name)formVal.elements[input.name]=input;
				if(input.value!='') formVal.fieldValidate(input);
			}

		}

		// look for a warning div
		document.getElementsByTagName('div');
		for(i=0;i<document.getElementsByTagName('div').length;i++){
			div = document.getElementsByTagName('div')[i];
//			alert(document.getElementsByTagName('div').length);
			if(div.getAttribute(this.nsAlias+':warning')) {
//				alert('rtsd');
				formVal.warningDiv = div;
				formVal.warningDiv.style.display='none';
			}
		}
	}

};


function debug(msg){
	document.getElementById('debug').innerHTML = msg;
}
function formValInit(){
	formVal.init();
}
var start = "formValInit"; /* STOP EDITING */ if(window.addEventListener){ /* mozilla */ window.addEventListener("load",eval(start),false);}else{ /* ie */ window.attachEvent("onload",eval(start));}

