var formUtils = {
	// declare global variables
	tgtForm: "",
	fieldType: "",
	imgValid: "http://" + document.domain + "/images/check-yes.png",
	imgInvalid: "http://" + document.domain + "/images/check-no.png",
	imgValidTitle: "Your information is valid.",
	imgInvalidTitle: "Your information is invalid. Please correct this field.",
	fieldArr: new Array(),
	emailArr: new Array(),
	formArr: new Array(),
	tmpArr: new Array(),
	
	init: function() { // set initial values
		this.tgtForm = document.forms[0];
		this.emailArr = getByAttribute("email");
		this.fieldArr = getByAttribute("field");
		
		this.addEmailBlur(this.emailArr);
		this.addFieldBlur(this.fieldArr);
	},
	
	
	
	// TODO: remove this generic validation and incorporate more detailed validation
	validateField: function(_field) {
		var imgNode = _field.id + "-valid";
		
		if(_field.value != "") { // if field was already validated
			this.createImage(_field.parentNode,imgNode,true); // create validation image
			return "valid";
		} else {
			this.createImage(_field.parentNode,imgNode,false);
			return "invalid";
		}
	},
	validateForm: function(_btn)  { // TODO: implement new code concepts!
		var sendForm = true;
		var tmp = getByAttribute("form");
		
		for(var i=0;i<tmp.length;i++) {
			if(tmp[i].getAttribute("validate") == "field") {
				if(this.validateField(tmp[i]) == "invalid") {
					sendForm = false;
				}
			} else if(tmp[i].getAttribute("validate") == "email") {
				if(this.isEmail(tmp[i]) == "invalid") {
					sendForm = false;
				}
			}
		}

		return sendForm; // return true or false to send form
	},
	
	/*================== Field Validations ======================*/
	
	isEmail: function(_field) {
		var _value = _field.value;
		var imgNode = _field.id + "-valid";

		// are regular expressions supported?
		var supported = 0;
		if (window.RegExp) {
			var tempStr = "a";
			var tempReg = new RegExp(tempStr);
			if (tempReg.test(tempStr)) supported = 1;
		}
		
		if (!supported) { return (_value.indexOf(".") > 2) && (str.indexOf("@") > 0); }
		
		var r1 = new RegExp("(@.*@)|(\\.\\.)|(@\\.)|(^\\.)");
		var r2 = new RegExp("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$");
		
		if(!r1.test(_value) && r2.test(_value)) { // is valid
			this.createImage(_field.parentNode,imgNode,true);
		} else { // is invalid
			this.createImage(_field.parentNode,imgNode,false);
		}
	},
	isDate: function() {
		
	},
	isNumber: function(_field) {
		
	},
	isPhone: function() {
		
	},
	isZip: function() {
		
	},
	isState: function() {
		
	},
	
	// create or remove the image element
	createImage: function(_tgt,_id,_valid) {
		var img = this.G(_id);
		if(_valid)	{ var vsrc = this.imgValid; var vtitle = this.imgValidTitle; }
		else { var vsrc = this.imgInvalid; var vtitle = this.imgInvalidTitle; }
		
		if(img) {
			this.removeImage(_tgt,img)
		}
		var iconImage = document.createElement('img');
		iconImage.src = vsrc;
		iconImage.title = vtitle;
		iconImage.id = _id;
		iconImage.style.position = "absolute";
		iconImage.style.right = "-39px";
		iconImage.style.top = "-4px";
		
		_tgt.style.position = "relative";
		_tgt.appendChild(iconImage);
	},
	removeImage: function(_tgt,_el) {
		_tgt.removeChild(_el);
	},
	
	// add fields to validate to an array
	addItem: function(_field) {
		this.fieldArr.push(_field); 
	},
	
	// add events for type of field
	addFieldBlur: function(_arr) {
		for(var i=0;i<_arr.length;i++) {
			_arr[i].onblur = function() { formUtils.validateField(this); };
		}
	},
	
	
	addEmailBlur: function(_arr) {
		for(var i=0;i<_arr.length;i++) {
			_arr[i].onblur = function() { formUtils.isEmail(this); };
		}
	},
	G: function(_obj) {
		return document.getElementById(_obj);
	}
};


function addEvent(elm, evType, fn, useCapture) {
	if (elm.addEventListener) {
		elm.addEventListener(evType, fn, useCapture);
		return true;
	}
	else if (elm.attachEvent) {
		var r = elm.attachEvent('on' + evType, fn);
		return r;
	}
	else {
		elm['on' + evType] = fn;
	}
}



function getElementsByClassName(className, tag, elm){
	var testClass = new RegExp("(^|\\\\s)" + className + "(\\\\s|$)");
	var tag = tag || "*";
	var elm = elm || document;
	var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
	var returnElements = [];
	var current;
	var length = elements.length;
	for(var i=0; i<length; i++){
		current = elements[i];
		if(testClass.test(current.className)){
			returnElements.push(current);
		}
	}
	return returnElements;
}

function getByAttribute(_val) {
	var tmpArr = new Array();
	var tmpForm = document.forms[0];
	
	for(var i=0;i<document.forms[0].length;i++) {
		if(tmpForm.elements[i].getAttribute("validate") == _val) {
			tmpArr.push(tmpForm.elements[i]);
		}  else if(_val == "form" && tmpForm.elements[i].getAttribute("validate") != null) {
			tmpArr.push(tmpForm.elements[i]);	
		}
	}

	return tmpArr;
}
