// JavaScript Document
Event.addEvent(window,"load",prepareForm);

var JSFormPreloader = new Image();
JSFormPreloader.src = "js_images/ani_circle_cream.gif";

function prepareForm(){
	var forms = Document.getElementsByClassMatch("JS:Validation");
	forms.each(SetValidation);
	var clickProgress = Document.getElementsByClassMatch("JS:ShowClickProgress");
	clickProgress.each(ShowClickProgress);
}

function SetValidation(element){
	var validationType = Document.getArguments(element,"JS:Validation")[0];
	element.validationType = validationType;
	if(validationType == "interactive"){
		Validation.setInteractivity(element);
	}
	var validation = Validation(element);
}
function Validation(element){
	if(element.className.indexOf("JS:AjaxSubmit") < 0){
		Event.addEvent(element,"submit",Validation.verifySubmission);
	}
	Validation.applyValidation(element, false);
}
Validation.verifySubmission = function(evt){
	var element = Event.getTarget(evt);
	Validation.applyValidation(element, true);
	var numErrors = Validation.getErrors(element);
	if(numErrors > 0){
		var displayNumErrors = (numErrors == 1) ? numErrors +" error" : numErrors +" errors";
		if(element.validationType == "interactive"){
			Validation.showAllInteractivity(element);
		}
		Standard.alert("You have "+ displayNumErrors +", please review all fields and try again");
		Event.preventDefault(evt);
	}
	else{
		try{
			element.submit();
		}
		catch(e){}
	}
}
Validation.applyValidation = function(form, submitted){
	// required fields
	var requiredFields = Document.getElementsByClassMatch("JS:IsRequired",form);
	var maxFields = Document.getElementsByClassMatch("JS:MaxLength",form);
	var minFields = Document.getElementsByClassMatch("JS:MinLength",form);
	var emails = Document.getElementsByClassMatch("JS:IsEmail",form);
	var telephones = Document.getElementsByClassMatch("JS:IsTelephone",form);
	if(submitted == true){
		requiredFields.each(Validation.isRequired);
		maxFields.each(Validation.maxLength);
		minFields.each(Validation.minLength);
		emails.each(Validation.isEmail);
		telephones.each(Validation.isTelephone);
	}
	else{
		requiredFields.each(Validation.setIsRequired);
		maxFields.each(Validation.setMaxLength);
		minFields.each(Validation.setMinLength);
		emails.each(Validation.setIsEmail);
		telephones.each(Validation.setIsTelephone);
	}
}
Validation.getErrors = function(form){
	var errorCount = 0;
	var formElements = Document.getElementsByTagNames("input,textarea,select",form);
	for(var i = 0; i < formElements.length; i ++){
		if(formElements[i].isRequired == "error"){
			errorCount ++;
		}
		if(formElements[i].maxCharLength == "error"){
			errorCount ++;
		}
		if(formElements[i].minCharLength == "error"){
			errorCount ++;
		}
		if(formElements[i].isEmail == "error"){
			errorCount ++;
		}
		if(formElements[i].isTelephone == "error"){
			errorCount ++;
		}
	}
	return errorCount;
}
Validation.getElementErrors = function(element){
	var errorCount = 0;
	if(element.isRequired == "error"){
		errorCount ++;
	}
	if(element.maxCharLength == "error"){
		errorCount ++;
	}
	if(element.minCharLength == "error"){
		errorCount ++;
	}
	if(element.isEmail == "error"){
		errorCount ++;
	}
	if(element.isTelephone == "error"){
		errorCount ++;
	}
	return errorCount;
}
Validation.addError = function(element, message, id){
	var checkExists = document.getElementById(element.name + id);
	if(checkExists == null){
		var parentForm = Document.getParentForm(element);
		var arguments = Document.getArguments(parentForm,"JS:Validation");
		var validationType = parentForm.validationType;
		switch(validationType){
			case "tooltip":
				Validation.displayTooltip(element,message,id,arguments[1],arguments[2]);
				break;
			case "interactive":
				Validation.displayInteractive(element,message,id,arguments[1]);
				break;
			default:
				break;
		}
	}
}
Validation.removeError = function(element, message, id){
	var checkExists = document.getElementById(element.name + id);
	if(checkExists != null){
		var parentForm = Document.getParentForm(element);
		var arguments = Document.getArguments(parentForm,"JS:Validation");
		var validationType = parentForm.validationType;
		switch(validationType){
			case "tooltip":
				Validation.removeTooltip(element,message,id);
				break;
			case "interactive":
				Validation.removeInteractive(element,message,id);
				break;
			default:
				break;
		}
	}
}
Validation.getElementMessage = function(element,collection){
	for(var i = 0 ; i < collection.length; i ++){
		if(element.name == collection[i].title){
			return collection[i];
		}
	}
}
Validation.getElementLabel = function(element){
	var labels = document.getElementsByTagName("label");
	for(var i = 0; i < labels.length; i ++){
		var currentAttribute = (Browser.getBrowser() == "internet explorer") ? labels[i].attributes['for'].nodeValue : labels[i].getAttribute("for");
		if(currentAttribute == element.name){
			return labels[i];
		}
	}
}
Validation.showAllInteractivity = function(form){
	var formElements = Document.getElementsByTagNames("input,textarea,select",form);
	for(var i = 0; i < formElements.length; i ++){
		Validation.addBlur(formElements[i]);
	}
}
Validation.setInteractivity = function(form){
	var formElements = Document.getElementsByTagNames("input,textarea,select",form);
	for(var i = 0; i < formElements.length; i ++){
		Event.addEvent(formElements[i],"focus",Validation.addFocus);
		Event.addEvent(formElements[i],"blur",Validation.addBlur);
	}
}
Validation.addFocus = function(evt){
	var element = (evt.tagName == undefined) ? Event.getTarget(evt) : evt;
	if(element.type != "checkbox" && element.type != "radio" && element.type != "submit"){
		Document.removeClass(element, "js_validation_correct");
		Document.removeClass(element, "js_validation_error");
		Document.addClass(element, "js_validation_focus");
	}
}
Validation.addBlur = function(evt){
	var element = (evt.tagName == undefined) ? Event.getTarget(evt) : evt;
	if(element.type != "checkbox" && element.type != "radio" && element.type != "submit"){
		Document.removeClass(element, "js_validation_correct");
		Document.removeClass(element, "js_validation_error");
		Document.removeClass(element, "js_validation_focus");
		var totalErrors = Validation.getElementErrors(element);
		if(totalErrors > 0){
			Document.addClass(element, "js_validation_error");
		}
		else{
			Document.addClass(element, "js_validation_correct");
		}
	}
}
// IS REQUIRED
Validation.setIsRequired = function(element){
	var currentTag = element.tagName.toLowerCase();
	if(currentTag == "select"){
		Event.addEvent(element,"change",Validation.isRequired);
		Event.addEvent(element,"blur",Validation.isRequired);
	}
	else if(currentTag == "input" && element.type == "checkbox"){
		Event.addEvent(element,"change",Validation.isRequired);
	}
	else{
		Event.addEvent(element,"blur",Validation.isRequired);
	}
}
Validation.isRequired = function(evt){
	var element = (evt.tagName == undefined) ? Event.getTarget(evt) : evt;
	var isValid = false;
	var message = "required, please enter a value";
	var currentTag = element.tagName.toLowerCase();
	switch(currentTag){
		case "select":
			message = "required, please select a value";
			isValid = (element.value.length > 0) ? true : false;
			break;
		case "textarea":
			isValid = (element.value.length > 0) ? true : false;
			break;
		default:
			if(element.type == "checkbox"){
				message = "required, please tick the checkbox";
				isValid = (element.checked == true) ? true : false;
			}
			else if(element.type == "file"){
				message = "required, please select a file";
				isValid = (element.value.length > 0) ? true : false;
			}
			else{
				isValid = (element.value.length > 0) ? true : false;
			}
			break;
	}
	if(isValid){
		element.isRequired = "";
		Validation.removeError(element,message,"isrequired");
	}
	else{
		element.isRequired = "error";
		Validation.addError(element,message,"isrequired");	
	}
}
// MAX LENGTH FIELD
Validation.setMaxLength = function(element){
	Event.addEvent(element,"blur",Validation.maxLength);
}
Validation.maxLength = function(evt){
	var element = (evt.tagName == undefined) ? Event.getTarget(evt) : evt;
	var isValid = false;
	var maxLength = Document.getArguments(element,"JS:MaxLength")[0];
	var message = "exceeded "+ maxLength +" character limit";
	if(element.value.length <= maxLength){
		isValid = true;
	}
	if(isValid){
		element.maxCharLength = "";
		Validation.removeError(element,message,"maxlength");
	}
	else{
		element.maxCharLength = "error";
		Validation.addError(element,message,"maxlength");	
	}
}
// MIN LENGTH FIELD
Validation.setMinLength = function(element){
	Event.addEvent(element,"blur",Validation.minLength);
}
Validation.minLength = function(evt){
	var element = (evt.tagName == undefined) ? Event.getTarget(evt) : evt;
	var isValid = false;
	var minLength = Document.getArguments(element,"JS:MinLength")[0];
	var message = "requires at least "+ minLength +" characters";
	if(element.value.length >= minLength || element.value.length == 0){
		isValid = true;
	}
	if(isValid){
		element.minCharLength = "";
		Validation.removeError(element,message,"minlength");
	}
	else{
		element.minCharLength = "error";
		Validation.addError(element,message,"minlength");	
	}
}
// VALIDATE EMAIL
Validation.setIsEmail = function(element){
	Event.addEvent(element,"blur",Validation.isEmail);
}
Validation.isEmail = function(evt){
	var element = (evt.tagName == undefined) ? Event.getTarget(evt) : evt;
	var isValid = false;
	var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
	var message = "invalid, please enter a valid email";
	var email = element.value;
	if(reg.test(email) == true || email.length == 0){
		isValid = true;
	}
	if(isValid){
		element.isEmail = "";
		Validation.removeError(element,message,"isemail");
	}
	else{
		element.isEmail = "error";
		Validation.addError(element,message,"isemail");	
	}
}
// VALIDATE TELEPHONE
Validation.setIsTelephone = function(element){
	Event.addEvent(element,"blur",Validation.isTelephone);
}
Validation.isTelephone = function(evt){
	var element = (evt.tagName == undefined) ? Event.getTarget(evt) : evt;
	var isValid = true;
	var allowedChars = "0123456789()-+ ";
	var telephone = element.value;
	var message = "invalid, please enter a valid telephone number";
	for(var i = 0; i < telephone.length; i ++){
		if(allowedChars.indexOf(telephone.charAt(i)) < 0){
			isValid = false;
			break;
		}
	}
	if(isValid){
		element.isTelephone = "";
		Validation.removeError(element,message,"istelephone");
	}
	else{
		element.isTelephone = "error";
		Validation.addError(element,message,"istelephone");	
	}
}




// Interactive Creation
Validation.displayInteractive = function(element, message, id, lineBreak){
	var lineBreak = (lineBreak == true) ? true : false;
	if(element.type != "checkbox" || element.type != "radio" || element.type != "submit"){
		Document.removeClass(element, "js_validation_focus");
		Document.removeClass(element, "js_validation_correct");
		Document.addClass(element, "js_validation_error");
	}
	//create message
	var span = document.createElement("span");
	span.setAttribute("class","js_validation_interactive");
	span.setAttribute("className","js_validation_interactive");
	span.setAttribute("title",element.name);
	span.setAttribute("id",element.name + id);
	span.innerHTML = message;
	//position
	var label = Validation.getElementLabel(element);
	var labelX = Document.getX(label);
	var elementX = Document.getX(element);
	//add
	if(labelX > elementX){
		if(lineBreak){
			var br = document.createElement("br");
			br.setAttribute("id",element.name + id + "br");
			Document.insertAfter(br, label);
			Document.insertAfter(span, br);
		}
		else{
			Document.insertAfter(span, label);
		}
	}
	else{
		if(lineBreak){
			var br = document.createElement("br");
			br.setAttribute("id",element.name + id + "br");
			Document.insertAfter(br, element);
			Document.insertAfter(span, br);
		}
		else{
			Document.insertAfter(span, element);
		}
	}
}
Validation.removeInteractive = function(element,message, id){
	if(element.type != "checkbox" || element.type != "radio" || element.type != "submit"){
		Document.removeClass(element, "js_validation_focus");
		Document.removeClass(element, "js_validation_error");
		Document.addClass(element, "js_validation_correct");
	}
	var warning = document.getElementById(element.name + id);
	var br = document.getElementById(element.name + id + "br");
	if(warning){
		warning.parentNode.removeChild(warning);
	}
	if(br){
		br.parentNode.removeChild(br);
	}
}
// Tool Tip Creation
Validation.displayTooltip = function(element,message,id,exLeft,exTop){
	//create tooltip
	var toolTip = document.createElement("div");
	toolTip.setAttribute("class","js_validation_tooltip");
	toolTip.setAttribute("className","js_validation_tooltip");
	toolTip.setAttribute("title",element.name);
	toolTip.setAttribute("id",element.name + id);
	document.getElementsByTagName("body")[0].appendChild(toolTip);
	var toolTipMessage = document.createElement("p");
	toolTipMessage.innerHTML = message;
	toolTip.appendChild(toolTipMessage);
	//position tooltip
	var label = Validation.getElementLabel(element);
	var labelX = Document.getX(label);
	var elementX = Document.getX(element);
	exLeft = (exLeft == undefined) ? 0 : exLeft;
	exTop = (exTop == undefined) ? "top" : exTop;
	if(labelX > elementX){
		var xpos = elementX + element.offsetWidth + exLeft + labelX + label.offsetWidth;
	}
	else{
		var xpos = elementX + element.offsetWidth + exLeft;
	}
	if(exTop == "bottom"){
		var ypos = Document.getY(element) + element.offsetHeight - toolTip.offsetHeight;
	}
	else if(exTop == "middle"){
		var ypos = Document.getY(element) + element.offsetHeight - ((element.offsetHeight / 2) + (toolTip.offsetHeight / 2));
	}
	else{
		var ypos = Document.getY(element);
	}
	toolTip.style.left = xpos + "px";
	toolTip.style.top = ypos + "px";
}
Validation.removeTooltip = function(element,message, id){
	var warning = document.getElementById(element.name + id);
	if(warning){
		warning.parentNode.removeChild(warning);
	}
}

/********* Shows an animated gif after submittion **************/
function ShowClickProgress(element){
	Event.addEvent(element,"click",ShowClickProgress.showProgress);
	var parentForm = Document.getParentForm(element);
	Event.addEvent(parentForm,"submit",ShowClickProgress.showProgress);
}
ShowClickProgress.showProgress = function(evt){
	var element = Event.getTarget(evt);
	Event.preventDefault(evt);
	var form = (element.tagName.toLowerCase() == "form") ? element : Document.getParentForm(element);
	var errors = 0;
	if(form.className.indexOf("JS:Validation") > -1){
		Validation.applyValidation(form, true);
		errors = Validation.getErrors(form);
	}
	if(errors == 0){
		if(element.tagName.toLowerCase() == "form"){
			element = Document.getElementsByClassMatch("JS:ShowClickProgress",element)[0];
		}
		var xpos = Document.getX(element) + 10;
		var ypos = Document.getY(element);
		element.style.visibility = "hidden";
		var preloader = document.createElement("div");
		preloader.style.backgroundImage = 'url('+JSFormPreloader.src+')';
		preloader.style.backgroundRepeat = 'no-repeat';
		preloader.style.position = "absolute";
		preloader.style.zIndex = 1020;
		preloader.style.left = xpos + "px";
		preloader.style.top = ypos + "px";
		preloader.style.width = 100 + "px";
		preloader.style.height = 100 + "px";
		document.getElementsByTagName("body")[0].appendChild(preloader);
		Document.submitParentForm(element);
	}
}
