function FormValidator(inForm,inSummary) {
	this.id = inForm;
	this.form = document.getElementById(inForm);
	
	if (document.getElementById(inSummary)) {
		this.summary = document.getElementById(inSummary);
	} else {
		if (this.form) {
			this.summary = document.createElement('p');
			errors.id = inSummary;
			errors.className = 'errors';				
			this.form.insertBefore(errors);
		}
	}
	
	this.fields = new Array();
	this.messages = new Array();
	this.lengths = new Array();
	this.numFields = 0;
	this.errors = '';
}

FormValidator.prototype.RequiredField = function(inField,inMessage)  {
	var me = this;
	
	this.fields[this.numFields] = inField;
	this.messages[this.numFields] = inMessage;
	this.numFields++;

	var objField = document.getElementById(inField);
	this.addEvent(objField, "blur", this.LabelError, false);
};

FormValidator.prototype.LimitedField = function(inField,inMax,inMessage)  {
	var me = this;
	
	this.fields[this.numFields] = inField;
	this.messages[this.numFields] = inMessage;
	this.lengths[this.numFields] = inMax;
	this.numFields++;

	//var objField = document.getElementById(inField);
	//this.addEvent(objField, "blur", this.LabelError, false);
};

FormValidator.prototype.RequiredPhoto = function(inField,inHidden,inMessage)  {
	var me = this;
	
	/* hidden field isn't going to change so if it has a value, we don't set validation */
	var objHidden = document.getElementById(inHidden);
	if (objHidden.value == '') {	
		this.fields[this.numFields] = inField;
		this.messages[this.numFields] = inMessage;
		this.numFields++;
		
		var objField = document.getElementById(inField);
		this.addEvent(objField, "blur", this.LabelError, false);
	}
};

FormValidator.prototype.SetValidation = function() {
	var me = this;
	
	this.form.onsubmit = function() {
		me.errors = '';
		
		for (var i=0;i<me.fields.length;i++) {
			var obj = document.getElementById(me.fields[i]);
			
			/* TODO: use obj.type */
			
			if (obj.options) {
				//select
				if (obj.options[obj.selectedIndex].value == '') {
					me.errors += me.messages[i];
					label = me.GetLabel(obj.id);
					if (label) {
						label.defaultClass = label.className;
						label.className = 'errors';
					}
				}
			} else if (obj.value == '') {
				//input
				me.errors += me.messages[i];
				label = me.GetLabel(obj.id);
				if (label) {
					label.defaultClass = label.className;
					label.className = 'errors';
				}
			} else if (me.lengths[i]) {
				//limited textarea
				if (obj.value.length > me.lengths[i]) {
					me.errors += me.messages[i];
					label = me.GetLabel(obj.id);
					if (label) {
						label.defaultClass = label.className;
						label.className = 'errors';
					}
				}
			}
		}
		
		if (me.errors) {
			me.summary.innerHTML = '<p>' + me.errors + '</p>';
			
			return false;
		} else {
			return true;
		}
	};
}

FormValidator.prototype.GetLabel = function(id) {
	var labels = document.getElementsByTagName('label');
	
	for (var i = 0; i < labels.length; i++) {
		if (labels[i].htmlFor == id) {
			return labels[i];
		}
	}

	return null;
};

FormValidator.prototype.LabelError = function (e) {
	var objFV = new FormValidator();
	
	var targ;
	if (!e) var e = window.event;
	if (e.target) targ = e.target;
	else if (e.srcElement) targ = e.srcElement;
	if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;

	var label = objFV.GetLabel(targ.id);
	
	if (targ.value != '') {
		if (label && label.defaultClass) {
			label.className = label.defaultClass;
			
			var test = label.className;
			/*
				if (targ.id == 'uploadphoto') {
					//debug('value: ' + targ.value);
					//debug('label: ' + label.htmlFor);
					debug('label.defaultClass: ' + label.defaultClass);
					debug('label.className: ' + label.className);
				}
			*/			
		}
	} else {
		if (label) {
			/* todo - class property of label error class */
			label.defaultClass = label.className;
			label.className = 'errors';
		}
	}
};

FormValidator.prototype.addEvent = function (obj, evType, fn, useCapture){
	if (obj.addEventListener){
		obj.addEventListener(evType, fn, useCapture);
		return true;
	} else if (obj.attachEvent){
		var r = obj.attachEvent("on"+evType, fn);
		return r;
	} else {
		debug("Handler could not be attached");
	}
};