
/*


qf-validation.js - (C) 2007 dFacts Network

! Not for redistribution !


Description: client side / js validation hints for pear quickform renderer 
Version: 1.2
Author: Gerhard Koch (C) dFacts.de

*/


/*
 *
 * beforeUnload für Bestell-Formular Abgänge // ersetzt durch cookie&php
 *
 */

/*

function doBeforeUnload() {
   
   
   if(!PROCESS_UNLOAD) return; // Let the page unload
	
	PROCESS_UNLOAD = false;
	return "";
}


if(window.body)
   window.body.onbeforeunload = doBeforeUnload; // IE
else
   window.onbeforeunload = doBeforeUnload; // FX
   
var maxpage = 0;
 
*/


/*
 *	some regex for classname checkups
 */

var required = /required/;
var error = /error/;


/*
 *	getElements by Tag + Classes
 */


function getElementsByClassName(oElm, strTagName, strClassName){
	var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	strClassName = strClassName.replace(/\-/g, "\\-");
	var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
	var oElement;
	for(var i=0; i<arrElements.length; i++){
		oElement = arrElements[i];		
		if(oRegExp.test(oElement.className)){
			arrReturnElements.push(oElement);
		}	
	}
	return (arrReturnElements)
}



function validateTextInput(inputObject){
	rel_filter = inputObject.getAttribute("rel");
	if(inputObject.parentNode.getElementsByTagName('input').length==1){
		if((!rel_filter  && inputObject.value) || validate(inputObject.value, rel_filter)) {
			inputObject.parentNode.className = " valid";
			validateFieldSet(inputObject.parentNode.parentNode.parentNode.parentNode);
		} else {
			inputObject.parentNode.parentNode.parentNode.parentNode.className = " error";
			inputObject.parentNode.className = " error";
		}
	} else {
		if(validateGroup(inputObject.parentNode)){
			if(BrowserDetect && (BrowserDetect.browser == 'Firefox') && (BrowserDetect.version > 1)){
				inputObject.parentNode.setAttribute('id',"qf_group_"+inputObject.id);
				setInterval("document.getElementById('qf_group_"+inputObject.id+"').setAttribute('class', 'valid')", 500);
			} else {			
				inputObject.parentNode.className = "valid";
			}
			validateFieldSet(inputObject.parentNode.parentNode.parentNode.parentNode);

		} else {
			inputObject.parentNode.parentNode.parentNode.parentNode.className = " error";
			inputObject.parentNode.className = " error";
		}		
	}
}

/*
 *	check all nested div for validity befor marking entire fieldset as valid
 */

function validateGroup(groupObject) {

	group_valid = true;
	if(!groupObject) return false;
	group_input = groupObject.getElementsByTagName("input");
	if(group_input&&group_input.length){
		for(var group_ii=group_input.length-1;group_ii>=0;group_ii--){	
			group_el = document.getElementById(group_input[group_ii].id);
			if(group_el){
				rel_filter = group_el.getAttribute("rel");
				if(rel_filter.length){
					el_value = group_el.value;
				 	if(validate(el_value, rel_filter) == false) {
						group_valid = false;
						return false;
					}
				}	
			}
		}
	}
	return group_valid;
}

function validateFieldSet(fieldSetObject){
	// do we have a nested date select field? -> dont set state to ok
	if(fieldSetObject){
		divs = fieldSetObject.getElementsByTagName('div');
		if(divs&&divs.length){
			state = true;
			for(var dd=divs.length-1;dd>=0;dd--){
				if(error.test(divs[dd].className)) {
					state = false;
					return false;
				}
			}
			if(state) fieldSetObject.className = "";
		}
	}
	return true;
}

/*
 *	check all nested selects (eg date fields) for validity befor marking parent div as valid
 */

function validateFieldSelectSet(fieldSetObject){
	if(!fieldSetObject) return false;
	// do we have a nested date select field? -> dont set state to ok
	select = fieldSetObject.getElementsByTagName('select');
	state=true;
	if(select&&select.length){
		for(var ss=select.length-1;ss>=0;ss--){
			options = getElementsByClassName(select[ss], "option", "");
			if(options && options.length){
				for(var oo=options.length-1;oo>=0;oo--){
					if(options[oo].selected && !options[oo].value) {
					 	state=false;
					 	return false;
					 }
				}
			}
		}
	}
	return state;
}


/*	
 *	Give required fields with non zero input a validated icon
 */



	forms= getElementsByClassName(document, "div", "required");
	if(forms&&forms.length){
		for(var ff=forms.length-1;ff>=0;ff--){
			input = getElementsByClassName(forms[ff], "input", "");

			if(input&&input.length){
				state = false;
				for(var ii=input.length-1;ii>=0;ii--){
					if(name != input[ii].name || input[ii].type == "radio" || input[ii].type == "checkbox"){
						if(input[ii].type == "text" && input[ii].value  && !error.test(input[ii].parentNode.className)) state=true;
						if(input[ii].type == "radio") {
							if(input[ii].checked)  state=true;
						}
						if(input[ii].type == "checkbox") {
							if(input[ii].checked)  state=true;
						}
					}
					name = input[ii].name;
				}
			 	if(state) forms[ff].className += " valid";
			 }

			select = getElementsByClassName(forms[ff], "select", "");

			if(select&&select.length){
				state = false;
				for(var ss=select.length-1;ss>=0;ss--){
					options = getElementsByClassName(select[ss], "option", "");
					if(options && options.length){
						for(var oo=options.length-1;oo>=0;oo--){
							if(options[oo].selected && options[oo].value)  state=true;
						}
					}
				}
			 	if(state) forms[ff].className += " valid";
			 }


			textarea = getElementsByClassName(forms[ff], "textarea", "");

			if(textarea&&textarea.length){
				state = false;
				for(var tt=textarea.length-1;tt>=0;tt--){
					if(textarea[tt].value) state=true;
				}
			 	if(state) forms[ff].className += " valid";
			 }


		}	
	}
	
/*	
 *	Set class of fieldset with error divs to "error" too
 */
	
	forms= getElementsByClassName(document, "div", "error");
	if(forms&&forms.length){
		for(var ff=forms.length-1;ff>=0;ff--){
			
			forms[ff].parentNode.parentNode.parentNode.className += " error";
			fehlermeldung = document.getElementById('formerrorbox');
			if(fehlermeldung) fehlermeldung.style.display = "block";
		}
	}	

/*
 *	Set some onChange/ onKeyDown handlers for instant visual feedback
 */
	input = document.getElementsByTagName("input");
	if(input&&input.length){

		for(var ii=input.length-1;ii>=0;ii--){	
			if(input[ii].parentNode && input[ii].parentNode.className && error.test(input[ii].parentNode.className)){
				el = document.getElementById(input[ii].id);
				if(el){
					el.onkeypress = function(){
						validateTextInput(this);
					} 
				}
			}
		}
	}	
	select = document.getElementsByTagName("select");
	if(select&&select.length){
		for(var ss=select.length-1;ss>=0;ss--){
			if(select[ss].parentNode && select[ss].parentNode.className && error.test(select[ss].parentNode.className)){

				select[ss].onchange = function(){ 
					options = getElementsByClassName(this, "option", "");
					state=false;
					if(options && options.length){
						for(var oo=options.length-1;oo>=0;oo--){
							if(options[oo].selected && options[oo].value)  state=true;
						}
					}
					if(state){	
						if (validateFieldSelectSet(this.parentNode.parentNode)) this.parentNode.className = " valid";
						if (validateFieldSelectSet(this.parentNode.parentNode.parentNode)) this.parentNode.parentNode.parentNode.parentNode.className = " valid";
					
					} else { 
						this.parentNode.className = " error";
						this.parentNode.parentNode.parentNode.parentNode.className = " error";
					}	
				 }
			}
		}
	}
	textarea = document.getElementsByTagName("textarea");
	if(textarea&&textarea.length){
		for(var tt=textarea.length-1;tt>=0;tt--){
			if(textarea[tt].parentNode && textarea[tt].parentNode.className && error.test(textarea[tt].parentNode.className)){
				el = document.getElementById(textarea[tt].id);
				if(el){
					el.onkeyup = function(){
						if(this.value) {
							this.parentNode.className = " valid";
							validateFieldSet(this.parentNode.parentNode.parentNode.parentNode);
						} else {
							this.parentNode.parentNode.parentNode.parentNode.className = " error";
							this.parentNode.className = " error";
						}	
					}
				}		
			}
		 }
	}

	form = document.getElementsByTagName("form");
	if(form&&form.length){
		for(var ff=form.length-1;ff>=0;ff--){
					form[ff].setAttribute('onsubmit','PROCESS_UNLOAD=false;');

		}
	}
	
function validate(mystring, myregex)
{	
	if(myregex.length && mystring.length){
		var re  = new RegExp(myregex);
		if (re && re.test(mystring)) {
			return true;
		} else {
			return false;
		}
	} 
	return false;
}


function validate_email_address(adress)
{
	return  validate(adress,'^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$');
}

//-->
