var AJKVerifier = function(dataObj) {
	this.domRootEl = dataObj.rootEl;
	this.domFields = $(this.domRootEl).find(".ajk-verifier-field").get();
	this.domSubmitButton = $(this.domRootEl).find(".ajk-verifier-submit").get()[0];
	this.domTooltipDisplay = $(this.domRootEl).find(".ajk-verifier-tooltip-displayer").get()[0];
	this.domErrorMessage = $(this.domRootEl).find(".ajk-verifier-error-message").get()[0];
	this.defaultErrorMessage = $(this.domErrorMessage).text(); 
	this.submitFunc = dataObj.submitFunc;
	this.objFields = new Array();
	this.domSuccessMessage = $(this.domRootEl).find(".ajk-verifier-success-message").get()[0];
	return this;
}

AJKVerifier.prototype = {
	init: function() {
		var self = this;	
	
		$(this.domRootEl).submit( function() { // Disable form submit
			return false;	
		});
		
		$.each(self.domFields, function() {
			self.objFields.push(new AJKVerifierField({
				domRootEl: this,
				fieldHoverFunc: function(dataObj) {
					self.displayTooltip(dataObj);
				},
				clearAllErrorsAndMessagesFunc: function(dataObj) {
					self.clearAllErrorsAndMessages(dataObj);	
				}	
			}).init());
			
		});
		
		if (!self.domTooltipDisplay) {
			self.displayTooltip	= function() {};
		}
		
		$(self.domSubmitButton).click( function() {
			if (self.verifyFields()) {
				self.submit();
			}
			else {
				self.displayErrorMessage({
					message: self.defaultErrorMessage	
				})
			}
			return false;
		});
		return self;
	},
	displayErrorMessage: function(dataObj) {
		var self = this;
		var message = dataObj.message;
		$(self.domErrorMessage).html(message).css({display:"block"});
	},
	clearAllErrorsAndMessages: function() {
		var self = this;
		$(self.domErrorMessage).css({display:"none"});
		$.each(self.objFields, function() {
			this.clearError();
		});
		$(self.domSuccessMessage).css({display: "none"});
	},
	displayTooltip: function(dataObj) {
		var self = this;
		var tooltipText = dataObj.tooltipText;
		if (tooltipText) {
			$(self.domTooltipDisplay).html(tooltipText).css({ display: "block" });
		}
		else {
			$(self.domTooltipDisplay).html(tooltipText).css({ display: "none" });
		}
	},
	verifyFields: function() {
		var self = this;
		var failedFields = 0;
		$.each(self.objFields, function() {
			if (!this.verify()) {
				failedFields++;
				this.highlightError();
			}
		});
		return (failedFields == 0);
	},
	submit: function() {
		var self = this;
		var fieldData = new Object();
		$.each(self.objFields, function() {
			this.fieldValue = $(this.domControl).val();
			fieldData[this.fieldName] = this.fieldValue;
		});
		self.submitFunc({
			fieldData: fieldData
		});
	},
	clearFields: function() {
		var self = this;
		$.each(self.objFields, function() {
			$(this.domControl).val("")
			this.fieldValue = "";
		});
	}
}

var AJKVerifierField = function(dataObj) {
	this.domRootEl = dataObj.domRootEl;
	this.fieldHoverFunc = dataObj.fieldHoverFunc;
	this.clearAllErrorsAndMessagesFunc = dataObj.clearAllErrorsAndMessagesFunc;
	this.domFormat = "";
	this.domChars = "";
	this.domTooltip = "";
	this.domControl = "";
	this.tooltip = "";
	this.format = "";
	this.chars = "";
	this.defaultValue = "";
	this.controlType = "";
	this.fieldValue = "";
	this.fieldName = "";
	this.defaultValueOkay = "";
	self.valueOptions = "";
	return this;
}

AJKVerifierField.prototype = {
	init: function() {
		var self = this;
		self.domFormat = $(this.domRootEl).find(".ajk-verifier-format");
		self.domChars = $(this.domRootEl).find(".ajk-verifier-chars");
		self.domTooltip = $(this.domRootEl).find(".ajk-verifier-tooltip");
		self.domControl = $(this.domRootEl).find(".ajk-verifier-control");
		self.tooltip = (self.domTooltip.length > 0) ? $(self.domTooltip).text() : "";
		self.format = (self.domFormat.length > 0) ? $(self.domFormat).text() : "";
		self.chars = (self.domChars.length > 0) ? $(self.domChars).text() : "";
		self.domControl = (self.domControl.length > 0) ? $(self.domControl).get()[0] : "";
		
		self.defaultValueOkay = ($(this.domRootEl).find(".ajk-verifier-not-default-value").length > 0) ? false : true;
		
		var domOptionValues = $(this.domRootEl).find(".ajk-verifier-value-options");
		self.valueOptions = (domOptionValues.length > 0) ? $(domOptionValues).text().split() : "";
		
		self.fieldName = $(self.domControl).attr("name");
		
		if (self.chars) {
			var charArray = self.chars.split("-");
			self.chars = {
				minChar: charArray[0],
				maxChar: charArray[1]	
			}
		}
		self.calculateControlType();
		self.setupValueGetterSetter();
		self.setupVerificationFunction();
		self.setupTooltip();
		self.setupFocus();
		self.setupClick();
		return self;
	},
	setupValueGetterSetter: function() {
		var self = this;
		switch (self.controlType) {
			case "span ajk-custom-checkbox":
				self.getValue = function() {
					return $(this.domControl).text();	
				}
				self.setValue = function(dataObj) {
					$(this.domControl).text(dataObj.value);	
				}
			break;
			default:
				self.getValue = function() {
					return $(this.domControl).val();	
				}
				self.setValue = function(dataObj) {
					$(this.domControl).val(dataObj.value);	
				}
			break;
		}
	},
	calculateControlType: function() {
		var self = this;
		var tagName = self.domControl.tagName;
		var type = $(self.domControl).attr("type");
		self.controlType = (tagName+" "+type).toLowerCase();
	},
	setupClick: function() {
		var self = this;
		switch (self.controlType) {
			case "span ajk-custom-checkbox":
			self.fieldValue = self.getValue();
			$(self.domControl).click( function() {
				if (self.fieldValue == "on") {
					self.fieldValue = "off";
					$(this).removeClass("checkbox-selected");	
				}
				else {
					self.fieldValue = "on";
					$(this).addClass("checkbox-selected");	
				}
				self.clearAllErrorsAndMessagesFunc();
				return false;
			});
			break;
			default:
			break;
		}		
	},
	setupFocus: function() {
		var self = this;
		switch (self.controlType) {
			case "input text":
				self.fieldValue = self.defaultValue = $(self.domControl).val();
				$(self.domControl).focus( function() {
					var thisVal = self.getValue();
					if (thisVal == self.defaultValue) {
						self.setValue({value:""});	
					}
					$(self.domRootEl).addClass("ajk-verifier-field-focused");
					self.clearAllErrorsAndMessagesFunc();
					
				}).blur( function() {
					var thisVal = self.getValue();
					if (!thisVal) {
						self.setValue({value:self.defaultValue});	
					}
					self.fieldValue = thisVal;
					$(self.domRootEl).removeClass("ajk-verifier-field-focused");
				});
			break;
			default:
				self.fieldValue = self.defaultValue = $(self.domControl).val();
				$(self.domControl).focus( function() {
					var thisVal = self.getValue();
					if (thisVal == self.defaultValue) {
						self.setValue({value:""});	
					}
					$(self.domRootEl).addClass("ajk-verifier-field-focused");
					self.clearAllErrorsAndMessagesFunc();
					
				}).blur( function() {
					var thisVal = self.getValue();
					if (!thisVal) {
						self.setValue({value:self.defaultValue});	
					}
					self.fieldValue = thisVal;
					$(self.domRootEl).removeClass("ajk-verifier-field-focused");
				});
			break;
		}
	},
	clearError: function() {
		var self = this;
		$(self.domRootEl).removeClass("ajk-verifier-field-error");
	},
	setupTooltip: function() {
		var self = this;
		$(self.domControl).hover( function() {
			self.fieldHoverFunc({
				tooltipText: self.tooltip
			});
		}, function() {
			self.fieldHoverFunc({
				tooltipText: ""
			});
		});	
	},
	setupVerificationFunction: function() {
		var self = this;
		switch (self.format) {
			case "email":
				self.verify = function() {
					var self = this;
					var fieldValue = self.getValue();
					if (!fieldValue || fieldValue == self.defaultValue) {
						return false;	
					}
					return fieldValue.match(/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i);
				}
			break;
			default:
				self.verify = function() {
					if (!self.defaultValueOkay && self.fieldValue == self.defaultValue) {
						return false;	
					}
					return (self.checkFieldCharLength() && self.checkForValueOptions());
				}
			break;	
		}
		
	},
	verify: function() { // This will get overwritten at object creation
			
	},
	highlightError: function() {
		var self = this;
		$(self.domRootEl).addClass("ajk-verifier-field-error");
	},
	checkFieldCharLength: function() {
		var self = this;
		if (!self.chars) {
			return true;	
		}
		var fieldLength = self.fieldValue.length;
		return (fieldLength >= self.chars.minChar && fieldLength <= self.chars.maxChar);
	},
	checkForValueOptions: function() {
		var self = this;
		if (!self.valueOptions) {
			return true;	
		}
		var optionFound = false;
		$.each(self.valueOptions, function() {
			if (self.fieldValue == this) {
				optionFound = true;
			}		
		});
		return optionFound;
	}
}
