/*
Form Validator
Author: Peter Tornstrand <peter[at]tornstrand[dot]com>
Homepage: http://www.tornstrand.com/scripts/javascript-form-validation/
Date: 2006-07-02
Version: 1.21
*/

/*
Set to false if you don't want the error messages
*/
var err = true;

/*
Set to true if you want modal javascript dialogues instead of DOM messages
*/
var modal = false;

/*
The type of container to create for the error message
*/
var errContainer = 'div';
var errorbgcolor = '#261a09';
var validbgcolor = 'white';
var theForm = getFormId();

/*
Browser detect, need's a little work
*/
var ie;
if (navigator.appVersion.indexOf("MSIE")!=-1) {
	ie = true; 
} else {
	ie = false;
}

function getFormId() {
	var totalforms = 0;
	var frms = document.getElementsByTagName('form');
	for (var i=0; i<frms.length; i++) {
		if (frms[i].className.indexOf('validate') != -1) {
			var totalforms = totalforms + 1;
			var formtovalidate = frms[i].id;
		}
	}
	if (totalforms > 1) {
		alert('Too many forms to validate!');
	} else {
		return document.getElementById(formtovalidate);
	}
}

function getElementId(type) {
	var frm = getFormId();
	var total = 0;
	var el = frm.elements;
	for (var i=0; i<el.length; i++) {
    	if (el[i].className.indexOf(type) != -1) {
			total = total + 1;
			theElement = el[i].id;
		} 
	}
	if (total == 1) {
		return document.getElementById(theElement);
	} else {
		return document.getElementById(theElement);
	}

}

function getOtherElements(frm) {
	var objInput = frm.elements;
	var others = new Array();
	for (var iCounter=0; iCounter<objInput.length; iCounter++) {
		if (objInput[iCounter].className.indexOf('other') != -1) {
					others.push(objInput[iCounter].id);
		}
	}
	return others;
}

function changeClass(el,elclass) {
				resetbg(el);
				el.className = elclass;
}

var addBlursandHighlights = function() {

			var objInput = document.getElementsByTagName('input');
			for (var iCounter=0; iCounter<objInput.length; iCounter++) {
				objInput[iCounter].onkeyup = function(){return validateSingle(this);}
				if ((objInput[iCounter].className.indexOf('req') != -1) || (objInput[iCounter].className.indexOf('code') != -1)) {
					changeLabelState(objInput[iCounter],'highlight');
				}
			}
			var objInput = document.getElementsByTagName('textarea');
			for (var iCounter=0; iCounter<objInput.length; iCounter++) {
				objInput[iCounter].onkeyup = function(){return validateSingle(this);}
				if (objInput[iCounter].className.indexOf('req') != -1) {
					changeLabelState(objInput[iCounter],'highlight');
				}
			}
			var objInput = document.getElementsByTagName('select');
			for (var iCounter=0; iCounter<objInput.length; iCounter++) {
				objInput[iCounter].onchange = function(){return validateSingle(this);}
				if (objInput[iCounter].className.indexOf('req') != -1) {
					changeLabelState(objInput[iCounter],'highlight');
				}
			}
			
}


var changeLabelState = function(el,msg) {
   
    var labels = document.getElementsByTagName('label');
       
    if (msg == 'error') {
		if (el.className.indexOf('fade') == -1) {
			el.className = el.className + ' fade';
		}
		for (var i = 0; i<labels.length; i++) {
            if (labels[i].htmlFor==el.id) {
				labels[i].className = labels[i].className.replace('warning','');
				labels[i].className = labels[i].className.replace('checkmark','');
				labels[i].className = labels[i].className.replace('question','');
				labels[i].className = labels[i].className.replace('highlight','');
                labels[i].className = labels[i].className + ' warning';
            }
        }
	} else if (msg == 'valid') {
		if (el.className.indexOf('fade') != -1) {
			el.className = el.className.replace('fade','');
		}
		if (el.className.indexOf('error') != -1) {
			Fat.fade_error_out(el.id, 30, 500, errorbgcolor, validbgcolor);
		}
		for (var i = 0; i<labels.length; i++) {
            if (labels[i].htmlFor==el.id) {
				labels[i].className = labels[i].className.replace('warning','');
				labels[i].className = labels[i].className.replace('checkmark','');
				labels[i].className = labels[i].className.replace('question','');
				labels[i].className = labels[i].className.replace('highlight','');
                labels[i].className = labels[i].className + ' checkmark';
            }
        }
	} else if (msg == 'question') {
		if (el.className.indexOf('fade') != -1) {
			el.className = el.className.replace('fade','');
		}
		if (el.className.indexOf('error') != -1) {
			Fat.fade_error_out(el.id, 30, 500, errorbgcolor, validbgcolor);
		}
		for (var i = 0; i<labels.length; i++) {
            if (labels[i].htmlFor==el.id) {
				labels[i].className = labels[i].className.replace('warning','');
				labels[i].className = labels[i].className.replace('checkmark','');
				labels[i].className = labels[i].className.replace('question','');
				labels[i].className = labels[i].className.replace('highlight','');
                labels[i].className = labels[i].className + ' question';
            }
        }
	} else {
		for (var i = 0; i<labels.length; i++) {
            if (labels[i].htmlFor==el.id) {
                labels[i].className = labels[i].className.replace('warning','');
				labels[i].className = labels[i].className.replace('checkmark','');
				labels[i].className = labels[i].className.replace('question','');
				labels[i].className = labels[i].className.replace('highlight','');
				if ((el.className.indexOf('req') != -1) || (el.className.indexOf('code') != -1)) {
					labels[i].className = labels[i].className + ' highlight';
				}
            }
        }
	}
}

/**
* Function called to validate form elements.
* @param frm [Object HTMLFormElement] The form to validate
* @return [Boolean] Did the form validate or not
**/
var validate = function(frm) {

	var el = frm.elements;
	for (var i=0; i<el.length; i++) {
		el[i].className = el[i].className.replace('error','');
		validateSingle(el[i]);
	}
	for (var i=0; i<el.length; i++) {
    	if (el[i].className.indexOf('req') != -1 && el[i].className.indexOf('email') == -1) {
			
			// Text, Textarea, File
			if (el[i].type=='text'||el[i].type=='textarea'||el[i].type=='file') {
				if (el[i].value=="") {
					resetbg(el[i]);
					el[i].className = el[i].className + ' error';
 					err == true ? displayErrorMessage(frm, el[i]) : null;
					return false;
 				} else {
					resetbg(el[i]);
					el[i].className = el[i].className.replace('error','');
				}

			}

			
			// Radio
			else if (el[i].type=='radio') {
				var radiogroup = el[el[i].name];
		        var itemchecked = false;
		        for(var j = 0 ; j < radiogroup.length ; ++j) {
					if(radiogroup[j].checked) {
						itemchecked = true;
						break;
					}
		        }
		        if(!itemchecked) { 
					resetbg(el[i]);
					el[i].className = el[i].className + ' error';
 					err == true ? displayErrorMessage(frm, el[i]) : null;
					return false;
		        }
			}
			
			// Checkbox
			else if (el[i].type=='checkbox') {
				var itemchecked = false;
		        var elems = document.getElementsByTagName("input");
		        for(var j=0; j<elems.length; j++) {
					if(elems[j].type=='checkbox'&&elems[j].name==el[i].name) {
		        		if(elems[j].checked) {
		        			itemchecked = true;
		        			break;
		        		}
		        	}
		        }
		        if(!itemchecked) {
					resetbg(el[i]);
					el[i].className = el[i].className + ' error';
 					err == true ? displayErrorMessage(frm, el[i]) : null;
					return false;
				}
			}
			
			// Select-one
			else if (el[i].type=='select-one') {
				if (el[i].selectedIndex==0) {
					resetbg(el[i]);
					el[i].className = el[i].className + ' error';
 					err == true ? displayErrorMessage(frm, el[i]) : null;
					return false;
		        } else {
					resetbg(el[i]);
		        	el[i].className = el[i].className.replace('error','');
		        }
			}
			
			// Select-multiple
			else if (el[i].type=='select-multiple') {
				var optionselected = false;
		      	for(var j=0;j<el[i].options.length; ++j) {
		      		if (el[i].options[j].selected) {
		      			optionselected = true;
		      			break;
		      		}
		      	}
		      	if (!optionselected) {
					resetbg(el[i]);
					el[i].className = el[i].className + ' error';
 					err == true ? displayErrorMessage(frm, el[i]) : null;
					return false;
		        } else {
					resetbg(el[i]);
		        	el[i].className = el[i].className.replace('error','');
		        }
			}
		} 
		//email
		else if (el[i].className.indexOf('email') != -1) {
			if (el[i].className.indexOf('req') != -1) {
				if (el[i].type=='text') {
					var email=/^[A-Za-z0-9]+([_\.-][A-Za-z0-9]+)*@[A-Za-z0-9]+([_\.-][A-Za-z0-9]+)*\.([A-Za-z]){2,4}$/i;
					if (!email.test(el[i].value) || el[i].value == '') {
						resetbg(el[i]);
						el[i].className = el[i].className + ' error';
						err == true ? displayErrorMessage(frm, el[i]) : null;
						return false;
					} else {
						resetbg(el[i]);
						el[i].className = el[i].className.replace('error','');
					}
	
				}
			} else {
				if (el[i].type=='text') {
					var email=/^[A-Za-z0-9]+([_\.-][A-Za-z0-9]+)*@[A-Za-z0-9]+([_\.-][A-Za-z0-9]+)*\.([A-Za-z]){2,4}$/i;
					if (!email.test(el[i].value) && el[i].value != '') {
						resetbg(el[i]);
						el[i].className = el[i].className + ' error';
						err == true ? displayErrorMessage(frm, el[i]) : null;
						return false;
					} else {
						resetbg(el[i]);
						el[i].className = el[i].className.replace('error','');
					}
	
				}
			}
		}
	}
	return true;
}

var validateSingle = function(el) {
	
    	if (el.className.indexOf('req') != -1 && el.className.indexOf('email') == -1) {
			
			// Text, Textarea, File
			if (el.type=='text'||el.type=='textarea'||el.type=='file') {
				if (el.value=="") {
 					changeLabelState(el,'error');
					return false;
 				} else {
					changeLabelState(el,'valid');
				}

			}

			
			// Radio
			else if (el.type=='radio') {
				var radiogroup = el[el.name];
		        var itemchecked = false;
		        for(var j = 0 ; j < radiogroup.length ; ++j) {
					if(radiogroup[j].checked) {
						itemchecked = true;
						break;
					}
		        }
		        if(!itemchecked) { 
					changeLabelState(el,'error');
					return false;
 				} else {
					changeLabelState(el,'valid');
				}
			}
			
			// Checkbox
			else if (el.type=='checkbox') {
				var itemchecked = false;
		        var elems = document.getElementsByTagName("input");
		        for(var j=0; j<elems.length; j++) {
					if(elems[j].type=='checkbox'&&elems[j].name==el.name) {
		        		if(elems[j].checked) {
		        			itemchecked = true;
		        			break;
		        		}
		        	}
		        }
		        if(!itemchecked) { 
					changeLabelState(el,'error');
					return false;
 				} else {
					changeLabelState(el,'valid');
				}
			}
			
			// Select-one
			else if (el.type=='select-one') {
				if (el.selectedIndex==0) {
					changeLabelState(el,'error');
					return false;
 				} else {
					changeLabelState(el,'valid');
				}
			}
			
			// Select-multiple
			else if (el[i].type=='select-multiple') {
				var optionselected = false;
		      	for(var j=0;j<el.options.length; ++j) {
		      		if (el.options[j].selected) {
		      			optionselected = true;
		      			break;
		      		}
		      	}
		      	if (!optionselected) {
					changeLabelState(el,'error');
					return false;
 				} else {
					changeLabelState(el,'valid');
				}
			}
		} 
		//email
		else if (el.className.indexOf('email') != -1) {
			if (el.type=='text') {
				var email=/^[A-Za-z0-9]+([_\.-][A-Za-z0-9]+)*@[A-Za-z0-9]+([_\.-][A-Za-z0-9]+)*\.([A-Za-z]){2,4}$/i;
				if (email.test(el.value)) {
					
						changeLabelState(el,'valid');
						
 				} else if (el.className.indexOf('req') != -1) {
						changeLabelState(el,'error');
						return false;
				} else if (!el.value=='') {
						changeLabelState(el,'error');
						return false;
				}

			}
		} else {
			if (el.type=='text'||el.type=='textarea'||el.type=='file') {
				if (el.value=="") {
 					changeLabelState(el,'question');
					return false;
 				} else {
					changeLabelState(el,'valid');
				}

			}
		}
	
	return true;
}



/*
AJAXify
*/

if (ie) {
	window.attachEvent("onload", addBlursandHighlights, false);
} else {
	window.addEventListener("load", addBlursandHighlights, false);
}
/*addEvent(window, 'load',ajaxContact, false);
addEvent(window,'unload',EventCache.flush, false);*/



