/*
this code originally by  	 Justin Cook : http://www.justincook.sytes.net
which didn't really work and was adapted from there to work by nathan kelly : http://www.nathfy.com

*/
var do_alert=false;
var strMessage = '';

// use onsubmit="return checkform( this.form );" in your form tag
function checkform() { 
//initial vars
f=this;
strMessage = 'Please correct the following:\n\n';
var objarray; 
var objTemp; 
var strName = '';
var elem_length = f.elements.length;

//now begins the loop which takes all the form elements and tests them
is_error=false;

//remove all form error nodes
set_form_error_message_off();

for ( var i = 0; i < elem_length; i++ ) {
	//strMessage += i+'\n'
	
	objarray= f.elements;
	objTemp = objarray[i];
	
	if(objarray[i].type){
			
		strName = objTemp.name;
		strID = objTemp.id;
		str_type=objTemp.type
		
		objlength = f.elements[strName].length;
		
		if(str_type != 'hidden'){
			//see if this form element is in a hidden layer
			//if so ignore it as it isn't relavant
			/*
			hidden_details_div=strID+"_details";
			parent_div=document.getElementById(hidden_details_div);
			
			if(parent_div){
				parent_hidden=parent_div.style.visibility;
				//alert(parent_hidden+ " "+hidden_details_div);
			}	
			*/
			if(test_parent_node_recurse(objTemp)){
				//if(parent_div && parent_hidden!='visible'){
				//don;t check as this is not visible
				//alert("not visible "+ objTemp.id);
				
			}else{
				if ( strName.substr( strName.length - 4 ) == '_req' ) {
					
					// first see if it's required
					//if required, parse the name
					strName = strName.replace( /data_/, '' );
					strName = strName.replace( /_req/, '' );
					str_no_space = strName.replace( /_/g, ' ' );
					strName = strName.toLowerCase();
					if ( objTemp.value == '') {
						
						//if field is empty 
						//add the hidden field message and set elem_length to --1
						set_form_error_message_text(objTemp);
						is_error=true;
						elem_length-=1;
					
					} else if ( objTemp.type == 'radio' ) {
						//this is a radio button
						//so check to see if checked
						//weird radio thing, in that a radio group of 1 has no length.
						
						if(! objlength){
							//do object length so this object is it
							
							if ( objTemp.checked == false) {
								radio_checked=false;
							}else{
								radio_checked=true;
							}
							
						}else{
							for ( var j = 0; j <= objlength; j++ ) {
								checkbox_obj = eval("f."+objTemp.name+"["+j+"]");
								radio_checked=false;
								if ( checkbox_obj ) {
									if ( checkbox_obj.checked ) {
										radio_checked=true;
										break;
										//found check ok so break
									}
								}
								
							}
						}
						//no check so set the message 
						
						if(radio_checked==false){
							
							set_form_error_message_text(objTemp);
							is_error=true;
						}
						elem_length-=1;
						
					}else if(strName.indexOf('email')!= -1){
						
						email_error=check_email_address(objTemp);
						if(email_error !=''){
							modify_form_error_message_text(strName,email_error);
							is_error=true;
						}
						elem_length-=1;
					} else if ( objTemp.type == 'checkbox' ) {
						//this is a radio button
						//so check to see if checked
						//checkbox_obj = eval("document.forms[0].product_on_req[1]");
						
						//do alert for checked
						for ( var j = 0; j < objlength; j++ ) {
							checkbox_obj = eval("f."+objTemp.name+"["+j+"]");
							checked=false;
							if ( checkbox_obj.checked ) {
								checked=true;
								break;
								//found check ok so break
							}
						}
						//no check so set the message 
						//alert("checkbox obj_length = "+ objlength+" checked ="+checked);
						if(checked==false){
							set_form_error_message_text(objTemp);
							is_error=true;
						}
						elem_length-=1;
					}
				}
			}
		}
	}
	}
	if ( is_error ) {
		//If true alert user via CSS or if off via alert
		f_do_alert( strMessage );
		return false;
	} else {
		
		return true;
		//return false;
			
	}
}

function test_parent_node_recurse(current_element){
	the_parent=current_element.parentNode;
	
	for(i=1;;i++){
		current_style=the_parent.style;
		
		//alert(getElementStyle(the_parent,'visibility','visibility'));
		
		if( getElementStyle(the_parent,'visibility','visibility') =='hidden'){
			//alert("the id = "+current_element.id+ " is hidden ")
			return true;
		}else{
			if(the_parent.nodeName == 'BODY' ){
				//return false;
				//alert('found BODY');
				return false;
			}else{
				//alert('the parent node is '+the_parent.nodeName+' the visiblity is '+the_parent.style.visibility);
				the_parent=the_parent.parentNode;
			}
		}
	}
	
	
}

function getElementStyle(current_elem, IEStyleProp, CSSStyleProp) {
    var elem = current_elem;
    if (elem.currentStyle) {
        return elem.currentStyle[IEStyleProp];
    } else if (window.getComputedStyle) {
        var compStyle = window.getComputedStyle(elem, "");
        return compStyle.getPropertyValue(CSSStyleProp);
    }
    return "";
}

function set_form_error_message_text(div_element) {
	
	if(do_alert==true){
		
		alert(div_element.alt);
		strMessage += div_element.alt+'\n';
	}else{
		var newPara = document.createElement("div");
		newPara.className="form_error";
		var newText = document.createTextNode(div_element.alt);
		newPara.appendChild(newText);
		the_parent=div_element.parentNode;
		
		if(the_parent){
			the_parent.appendChild(newPara);
		}
	
	}
}

function modify_form_error_message_text(div_id,email_error) {
	
	if(do_alert==true){
		
		alert(div_element.alt);
		strMessage += email_error+'\n';
	}else{
		var newPara = document.createElement("div");
		newPara.className="form_error";
		var newText = document.createTextNode(email_error);
		newPara.appendChild(newText);
		the_parent=div_element.parentNode;
		
		if(the_parent){
			the_parent.appendChild(newPara);
		}
	
	}
}

function set_form_error_message_off() {

	//remove all form error nodes
	
	class_list=getElementbyClass('form_error');

	
	class_list_len=class_list.length;
	//remove em
	for (i=0; i<class_list_len; i++){
		if(class_list[i].parentNode){
			class_list[i].parentNode.removeChild(class_list[i]);
		}
	}
	
}

function f_do_alert(the_message) {
	
	
	if(do_alert==true){
		
		alert( the_message );
		
	}else{
		alert( "You have errors on the form which have been highlighted, please correct.");
	}
}
//below is the form validate as it is typed in:

addEvent(window, "load", add_event_handlers_form_init);

function add_event_handlers_form_init(){
	// Find all buttons/links with id numeric_only and make them work
	//alert("adding the events");
	if(document.forms[0]){
    	the_length=document.forms[0].elements.length;
    	
    	if(document.forms[0].id == 'check_form' || document.forms[0].className == 'check_form'){
    			
    			document.forms[0].onsubmit = checkform;
    		}
    	
    	for(i=0;i<the_length;i++){
    		current_element=document.forms[0].elements[i];
    		
    		if(current_element.id == 'numeric_only' || current_element.className == 'numeric_only'){
    			
    			current_element.onkeypress = checkInt;
    		}
    		
    	}
    	

    }
}

//this is just for interger fields
//this code originally by Justin Cook : http://www.justincook.sytes.net
function checkInt(e) {
// <input type="text" name="age_required" onkeypress="return checkInt(event)" />
e = (e) ? e : event;
var charCode = (e.intCode) ? e.intCode : 
((e.keyCode) ? e.keyCode : 
((e.which) ? e.which : 0));
if(charCode > 31 && (charCode < 48 || charCode > 57) && charCode != 46) {
	alert("Numbers only please!.");
	return false;
}
return true;
}

function checkvalue(the_input,min_value){
	
	if( the_input.value != ''){
		if( the_input.value<min_value ){
			alert("You must enter a number greater than "+min_value);
			the_input.value=min_value;
		}
	}
	
}

function lettersOnly(evt) {
    evt = (evt) ? evt : event;
    var charCode = (evt.charCode) ? evt.charCode : ((evt.keyCode) ? evt.keyCode : 
        ((evt.which) ? evt.which : 0));
    if (charCode > 31 && (charCode < 65 || charCode > 90) && 
        (charCode < 97 || charCode > 122)) {
        alert("Enter letters only.");
        return false;
    }
    return true;
}

// validates that the entry is formatted as an email address
function check_email_address(elem) {
    var str = elem.value;
	string_domain="Verify the domain portion of the email address (The bit after the '@')";
	string_username="Verify the user name portion of the email address (the bit before the '@')";
    str = str.toLowerCase( );
    if (str.indexOf("@") > 1) {
        var addr = str.substring(0, str.indexOf("@"));
        var domain = str.substring(str.indexOf("@") + 1, str.length);
        // at least one top level domain required
        if (domain.indexOf(".") == -1) {
           
            return string_domain;
        }
        // parse address portion first, character by character
        for (var i = 0; i < addr.length; i++) {
            oneChar = addr.charAt(i).charCodeAt(0);
            // dot or hyphen not allowed in first position; dot in last
            if ((i == 0 && (oneChar == 45 || oneChar == 46))  || 
                (i == addr.length - 1 && oneChar == 46)) {
              
                return string_username;
            }
            // acceptable characters (- . _ 0-9 a-z)
            if (oneChar == 45 || oneChar == 46 || oneChar == 95 || 
                (oneChar > 47 && oneChar < 58) || (oneChar > 96 && oneChar < 123)) {
                continue;
            } else {
               
                return string_username;
            }
        }
        for (i = 0; i < domain.length; i++) {
            oneChar = domain.charAt(i).charCodeAt(0);
            if ((i == 0 && (oneChar == 45 || oneChar == 46)) || 
                ((i == domain.length - 1  || i == domain.length - 2) && oneChar == 46)) {
               
                return string_domain;
            }
            if (oneChar == 45 || oneChar == 46 || oneChar == 95 || 
                (oneChar > 47 && oneChar < 58) || (oneChar > 96 && oneChar < 123)) {
                continue;
            } else {
                
                return string_domain;
            }
        }
        return '';
    }
    return "The email address may not be formatted correctly. Please verify.";
}

function addEvent(elm, evType, fn, useCapture)
// addEvent and removeEvent
// cross-browser event handling for IE5+,  NS6 and Mozilla
// By Scott Andrew
{
  if (elm.addEventListener){
    elm.addEventListener(evType, fn, useCapture);
    return true;
  } else if (elm.attachEvent){
    var r = elm.attachEvent("on"+evType, fn);
    return r;
  } else {
    alert("Handler could not be removed");
  }
} 

function getElementbyClass(classname){
	var inc=0;
	var alltags=document.all? document.all : document.getElementsByTagName("*");
	
	customcollection=new Array();
	
	for (i=0; i<alltags.length; i++){
		if (alltags[i].className==classname){
			customcollection[inc++]=alltags[i];
		}
	}
	return customcollection;
}




