/*
Plugin Name: JACF - Just Another Contact Form
Plugin URI: http://www.klauskomenda.com/code/jacf
Author: Klaus Komenda
Author URI: http://www.klauskomenda.com

File: contact.js
Purpose: validates form input
*/

// Global Variable Declaration
var errormsg = Array();

// Config START
errormsg['empty'] = "Please fill out this required field";
errormsg['email'] = "Please enter a valid email address";
// Config END


// isFilled(field)
//
// checks whether a field is empty or not
// returns: true | false
function isFilled(field) {
  if (field.value.length < 1 || field.value == field.defaultValue) {
    return false;
  } else {
    return true;
  }
}

// isEmail(field)
//
// checks whether the value seems to be a valid email address
// returns: true | false
function isEmail(field) {
  if (field.value.indexOf("@") == -1 || field.value.indexOf(".") == -1) {
    return false;
  } else {
    return true;
  }
}

// validateForm(whichform) 
//
// is called upon submit of a form of page
// returns: true | false
function validateForm(whichform) {
valid = true;
  for (var i=0; i<whichform.elements.length; i++) {
    var element = whichform.elements[i];   
    var elementClassName = element.className; 
    var elementId = element.getAttribute('id');
    var messageDisplayed = false;
    
    isRequired = isRequiredField(element);
    isSpecial = isSpecialField(element);
    
    if (isRequired) {
    	removeErrorMessage(element);
	    if (!isFilled(element)) {
	    	valid = false;
	    	displayErrorMessageInline(element,errormsg['empty'])
	    	messageDisplayed = true;
	   	}
    }
    
    // SPECIAL FIELDS
    // check if it has a special string in id-value (e.g. email) and if an error has
    // not occurred yet, check the value and display an error message, if appropriate
    if (isSpecial && messageDisplayed == false) {
    	removeErrorMessage(element);
    	if (!isEmail(element)) {
	    	valid = false;
	    	displayErrorMessageInline(element,errormsg['email']);
	   	}
    }
     
  }
  
  if (valid == false) {
    return false;
  } else {
    return true;
  }
}

// prepareForms()
//
// loops through all form elements and adds an onblur attribute to
// all required fields. on blur, the field gets checked
function prepareForms() {
	for (var i=0; i<document.forms.length; i++) {
    	var thisform = document.forms[i];
    	thisform.onsubmit = function() {
     		return validateForm(this);
    	}
  	}
	
	for (var i=0;i<document.forms.length; i++) {
		var thisform = document.forms[i];
		for (var x=0;x<thisform.elements.length;x++) {
			var required = false;
			var specialField = false;
			
			required = isRequiredField(thisform.elements[x]);
			specialField = isSpecialField(thisform.elements[x]);

			if (required == true || specialField == true) {
				// set onblur-attribute for this field
				currentEl = thisform.elements[x];
				currentEl.required = required;
				currentEl.specialField = specialField;
				currentEl.onblur = function() {
					checkField(this.getAttribute('id'),this.required,this.specialField);
				}
			}
		}
	}	
}

// isRequiredField(element)
//
// checks whether this input element is required, based on whether
// the string "required" is part of the classname
//
// @element		form element object
function isRequiredField(element) {
	if (element.className.indexOf("required") != -1) {
		// if the string "required" is found in the classname of the field,
		// it will be checked
		return true;
	} else {
		return false;
	}
}

// isSpecialField(element)
//
// checks if this input element is a special field (e.g. email), based
// on whether a certain string, e.g. "email" is part of id-value
//
// @element		form element object
function isSpecialField(element) {
	if (element.getAttribute('id') != null) {
		if (element.getAttribute('id').indexOf('email') != -1) {
			// if "email" is found in the id of the field, it is considered a
			// special field that needs to be validated
			return true;
		} else {
			return false;
		}
	} else {
		return false;
	}
}

// checkField(fieldId, required, specialField)
// 
// validates required and/or special fields (e.g. email address)
//
// @fieldId			id of field to validate
// @required		boolean
// @specialField	boolean
function checkField(fieldId, required, specialField) {
	field = document.getElementById(fieldId);
	removeErrorMessage(field);
	
	var empty = false;
	var valid = true;
	if (required) {
		// must not be empty
		if (!isFilled(field)) {
			empty = true;
		}
	} 
	
	if (specialField) {
		// consider special fields
		// EMAIL-CHECK
		if (fieldId.indexOf('email')!=-1 && !isEmail(field)) {
			valid = false;
		} 
	}
	
	if (empty == true || valid == false) {
		if (empty == true) {
			displayErrorMessageInline(field, errormsg['empty']);
		} else if (valid == false) {
			// consider special fields
			// EMAIL: display appropriate error message
			if (fieldId.indexOf('email')!=-1) {
				displayErrorMessageInline(field, errormsg['email']);
			} 	
		}
	}
}

// findLabel(htmlFor)
//
// finds appropriate label-element within DOM tree
//
// @htmlFor		for-attribute to look for
function findLabel(htmlFor) {
	labels = document.getElementsByTagName('label');
	for (i=0;i<labels.length;i++) {
		//alert(labels[i].getAttribute('for'));
		if (labels[i].getAttribute('for') == htmlFor) {
			return labels[i];
		}
	}	
}

// displayErrorMessageInline(labelfor, message)
//
// displays certain message within label element
//
// @labelfor	for-attribute of label to look for
// @message		message to display
function displayErrorMessageInline(fieldObj, message) {
  	var span = document.createElement("span");
	span.setAttribute("class","feedback");
	var txt = document.createTextNode(message);
	span.appendChild(txt);
	fieldObj.parentNode.appendChild(span);
}

// removeErrorMessage(labelfor)
//
// removes error message (span within label element) from DOM tree
//
// @labelfor	for attribute of label to look for
function removeErrorMessage(fieldObj) {
	par = fieldObj.parentNode;
	if (par.getElementsByTagName('span').length > 0) {
		feedbacknode = par.getElementsByTagName('span');
		par.removeChild(feedbacknode[0]);
	}	
}

// addLoadEvent(func)
//
// Lets you add several functions to be executed upon a 
// new page has loaded
//
// Credit goes to Simon Willison 
// http://simonwillison.net/2004/May/26/addLoadEvent/
function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }
}

addLoadEvent(prepareForms);