//Basic concept (and some code) taken from "Beginning Ajax with PHP" by Lee Babin (APRESS)

function imValidate() {
	this.imAjax = new imAjax();
	this.canSubmit = null;
	this.responseDiv = null;
	this.valMap = null;
	this.message = null;
	this.aMessages = new Array();
	var self = this;
	
	this.init = function(subMenu, menuClass, gallery, prodInfo, thumbClass) {
		//if (!this.bInit) {
	}
	
	this.submitForm = function(formName, serverPage, fncName, requirements, responseDiv) {
		this.aMessages["hasValue"] = " cannot be blank";
		this.aMessages["isValidEmail"] = " is not a valid";
		this.aMessages["eitherOr"] = " must be entered";
		this.aMessages["isEqual"] = " does not match";
		this.aMessages["isChecked"] = " must be selected";
		this.aMessages["isNum"] = " must be numeric";
		this.aMessages["isAlpha"] = " must contain alphas only";
		this.canSubmit = true;
		var form = document.getElementById(formName);
		this.responseDiv = document.getElementById(responseDiv);
		//if (goToPage != "") {
		//	this.goToPage = goToPage;
		//}
		var file = serverPage;
		this.valMap = eval (requirements);
		var formData = this.getFormValues(form, fncName);
		
		if (this.canSubmit) {
			this.imAjax.doPost(file, formData, imValidate.showMessage);
		} else {
			this.showMessage(this.message);	
		}
	}
	
	this.exitField = function(serverPage, fncName, requirements, responseDiv) {
		//var form = document.getElementById(formName);
		this.responseDiv = document.getElementById(responseDiv);
		var file = serverPage;
		this.valMap = eval (requirements);
		var fn = eval("this."+fncName);
		if (fncName == 'dbDupCheck') {
			var formData = fn ();
			this.imAjax.doGet(file+formData, imValidate.showMessage);
		} else {
			//
		}
	}
	
	this.deleteRecord = function(serverPage, responseDiv) {
		this.responseDiv = document.getElementById(responseDiv);
		var answer = confirm("Confirm Delete");
		if (answer) {
			this.imAjax.doGet(serverPage, imValidate.showMessage);
		}
	}
	
	this.dbDupCheck = function() {
		var str = "";
		var nl = self.valMap.fields[0].functions[0].fields.length;
		for (var i = 0; i < nl; i++) {
			str += "&" + self.valMap.fields[0].functions[0].fields[i].id + "=" + escape(document.getElementById(self.valMap.fields[0].functions[0].fields[i].id).value) + "&";
		}
		return str;
	}
	
	this.getFormValues = function(form, fncName) {
		var str = "";
		var fn = eval("this."+fncName);
		var nL = form.elements.length;
		for (var i = 0; i < nL; i++) {
			if (fn) {
				if (this.canSubmit) {
					this.canSubmit = fn (form.elements[i]);
				} else {
					break;
				}	
			}
			if ((form.elements[i].type == 'radio') || (form.elements[i].type == 'checkbox')) {
				if (form.elements[i].checked) {
					str += form.elements[i].name + "=" + escape(form.elements[i].value) + "&";		
				}
			} else {
				str += form.elements[i].name + "=" + escape(form.elements[i].value) + "&";
			}
		}
		return str;
	}
	
	this.validateFields = function (el) {
		var canSubmit = false;
		var nL = self.valMap.fields.length;
		for (var i=0; i< nL; i++) {
			if (self.valMap.fields[i].id == el.name) {
				var ln = self.valMap.fields[i].functions.length;
				for (var j=0; j < ln; j++) {
					var fn = eval("self."+self.valMap.fields[i].functions[j].name);
					if (self.valMap.fields[i].functions[j].fields) {
						canSubmit = fn (el.value, self.valMap.fields[i].functions[j].fields);
					} else {
						canSubmit = fn (el.value);
					}
					if (!canSubmit) {
						self.message = self.aMessages[self.valMap.fields[i].functions[j].name];
						break;
					}
				}
				if (!canSubmit) {
					//self.message = self.valMap.fields[i].label + self.message;
					self.message = {"type": "message", "label": ""+self.valMap.fields[i].label + self.message+""};
					break;
				}
			} else {
				canSubmit = true;
			}
		}
		return canSubmit;
	}
	
	this.hasValue = function (val) {
		var retVal = (val == "") ? false : true;
		return retVal;
	}
	
	//.name, form.elements[i].value
//		switch (el.type) {
//			case "checkbox":
//				if (el.checked == true) {
//				
//				}
//				break;
//			case "text":
//				//execute
//				break;
//			case "password":
//				//execute
//				break;
//			case "radio":
//				//execute
//				break;
//		}
		
	this.isValidEmail = function (val) {
		if ((!val.match("@")) || (!val.match("."))) {
			return false;
		} else {
			return true;	
		}
	}
	
	this.eitherOr = function (val, fields) {
		var isNotEmpty = false;
		if (self.hasValue(val)) {
			isNotEmpty = true;
		} else {
			for (var i = 0; i < fields.length; i++) {
				if (self.hasValue(document.getElementById(fields[i].id).value)) {
					isNotEmpty = true;
					break;
				}
			}
		}
		return isNotEmpty;
	}
	
	this.isChecked = function (val, fields) {
		var ischecked = false;
		for (var i = 0; i < fields.length; i++) {
			var flds = document.getElementsByName(fields[i].id);
			var nL = flds.length;
			for (var j=0; j<nL; j++) {
				if (flds[j].checked) {
					ischecked = true;
					break;	
				}
			}
			//if (document.getElementsByName(fields[i].name).checked) {
			//	ischecked = true;
			//	break;
			//}
		}
		return ischecked;
	}

	this.isEqual = function (val, fields) {
		var bEqual = (val == document.getElementById(fields[0].id).value) ? true : false;
		return bEqual;
	}
	
	this.isNum = function (val) {
		var retVal = (isNaN(val)) ? false : true;
		return retVal;	
	}
	
	this.isAlpha = function (val) {
		return isNaN(val);	
	}
	
	this.showMessage = function(result) {
		var loc = '';
		var result = (result.type) ? result : eval('(' + result + ')');
		
		if (result.type == 'message') {
			self.responseDiv.innerHTML = result.label;
		} else if (result.type == 'continue') {
			loc += result.label;
			var nL = result.params.length;
			if (result.params) {
				loc += '?';
				var nL = result.params.length;
				for (var i = 0; i < nL; i++) {
					loc += result.params[i].name + '=' + result.params[i].value;
					if (i < (nL-1)) {
					loc += '&';	
					}
				}
			}
			location.href = loc;
		}
		//if (message == 'continue') {
		//	location.href = self.goToPage;	
		//} else {
		//	self.responseDiv.innerHTML = message;
		//}
	}
	
}
var imValidate = new imValidate();

function bindCallBack(fn) {
  var args = [];
  for (var n = 1; n < arguments.length; n++)
    args.push(arguments[n]);
  return function () { return fn.apply(imValidate, args); };
}