/*
name: Class Behaviour || update: 20050118 || author: Frank van Rooijen, Maurice van Creij
info: http://www.woollymittens.nl/content/details.asp?id=20040805133501

3. Add display:none; on parse
   class="hideThisNode"   class="showThisNode"
15 Triggers all validateInput class behaviours within a node after the onsubmit event.
   class="validateAllInput"
*/
	// primary functions - functionality
		// returns a string of parameters found in the classname which can be [eval]uated
		function getClassParameter(objNode,strClassNameHint){
			// get the className
			var arrClassNames = objNode.className.split(' '); var strClass; var intClass = 0;
			while(strClass==null && intClass<arrClassNames.length){
				strClass = (arrClassNames[intClass].indexOf(strClassNameHint)>-1) ? arrClassNames[intClass] : null;
				intClass += 1;
			}
			// get class parameters
			var arrClassParams = strClass.split('_'); var evalParams = '';
			for(var intParam=1; intParam<arrClassParams.length; intParam++){
				evalParams += "var " + arrClassParams[intParam].substr(0,2) + "= '" + arrClassParams[intParam].substr(2) + "';";
			}
			return evalParams;
		}
	// secondary function - constructors
		function parseForClasses(){
			var strClass, arrClass
			// get all elements
			var objAll = (document.all) ? document.all : document.getElementsByTagName("*");
			// for all elements
			for(var intA=0; intA<objAll.length; intA++){
				// get the element's class attribute
				strClass = objAll[intA].className;
				// if there is a class
				if(strClass!=null){	
					// split the class attribute into classes
					arrClass = strClass.split(' ');
					// for all sub-classes
					for(var intB=0; intB<arrClass.length; intB++){
						// choose known classes
						switch(arrClass[intB].toLowerCase()){
							// add display='none'; on parse
							case "hidethisnode" : 
								/*event*/;
								objAll[intA].style.display = 'none';
								break;

							// Triggers all validateInput class behaviours within a node after the onsubmit event.',
							case "validateallinput" :
								objAll[intA].onsubmit = validateAllInput;
								break;
								;
						}
						// check for parsable classes
						if(arrClass[intB].toLowerCase().indexOf("validateinput")>-1) objAll[intA].onblur = validateInput;
					}
				}
			}
		}

// Form Checking...		
		function validateAllInput(that){
			var objNode = (typeof(this.nodeName)=='undefined') ? that : this ;
			var booPassed = true;
			// get all subnodes
			var objSubNodes = (objNode.all) ? objNode.all : objNode.getElementsByTagName("*") ;
			// for all nodes
			for(var intA=0; intA<objSubNodes.length; intA++){
				// Does this node have the validateInput put class? Invoke the validator function upon it.
				if(objSubNodes[intA].className.toLowerCase().indexOf('validateinput')>-1) booPassed = (validateInput(objSubNodes[intA]) && booPassed);
			}
			// is the form valid enough?
			return booPassed;
		}
		function validateInput(that){
			var objNode = (typeof(this.nodeName)=='undefined') ? that : this ;
			// default validator values
			var booEmptyTest,booBooValidator,booRegExpValidator, regExpValidator,booFuncValidator;
			// get the warning message
			var objWarningNode = (objNode.nextSibling.nodeName.indexOf("text")<0) ? objNode.nextSibling : objNode.nextSibling.nextSibling ;
			// get the type of validation required			
			eval(getClassParameter(objNode,'validateInput'));
			strValidatorName	= (typeof(TY)!='undefined') ? TY : '' ;
			intAllowEmpty		= (typeof(AE)!='undefined') ? parseInt(AE) : 0 ;
			// empty test
			booEmptyTest = (intAllowEmpty==1 && objNode.value=='') ? true : false ;
			// boolean test
			switch(strValidatorName){
// TODO: need to check all radio buttons in one family
				case 'isradiochecked' : 
					booBooValidator = true;
				default :
					booBooValidator = true;
			}
			// regular expression test
			if(navigator.appVersion.indexOf('MSIE 5.0')>-1 && strValidatorName=='money') strValidatorName = null;
			switch(strValidatorName){
				case 'email' : 
					booRegExpValidator = (objNode.value.match(/^[\w\.\-\,\+]+@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$/)!=null);
					break;
				case 'phone' : 
					booRegExpValidator = (objNode.value.match(/(^\+[0-9]{2}|^\+[0-9]{2}\(0\)|^\(\+[0-9]{2}\)\(0\)|^00[0-9]{2}|^0)([0-9]{9}$|[0-9\-\s]{10}$)/)!=null); 
					break;
				case 'dutchzipcode' : 
					booRegExpValidator = (objNode.value.match(/^[0-9]{4}\s{0,1}[a-zA-Z]{2}$/)!=null); 
					break;
				case 'date' : 
					booRegExpValidator = (objNode.value.match(/^\d{4}\-\d{1,2}\-\d{1,2}$/)!=null);
					break;
				case 'memberid' : 
					booRegExpValidator = (objNode.value.match(/^[0-9]+$/)!=null); 
					break;
				case 'money' :
					regExpValidator = new RegExp('^(?!\u00a2)(?!0,?\d)(\d{1,3}(\.\d{3})*|(\d+))(\,\d{2})?$');
					booRegExpValidator = (objNode.value.match(regExpValidator)!=null);
					break;
				case 'alphanumeric' :
					booRegExpValidator = (objNode.value.match(/^[a-zA-Z0-9]/)!=null);
				default :
					booRegExpValidator = true;
			}
			// custom test
			switch(strValidatorName){
				case 'bankaccount' :
					booFuncValidator = validate_bankaccount(objNode);
					break;
				case 'notempty' :
					booFuncValidator = (objNode.value!="");
					break;
				default :
					booFuncValidator = true;
			}
			// close the error message by default
			objWarningNode.style.display = 'none';
			// show or hide the warning message based on the validator's match
			if(!booEmptyTest)objWarningNode.style.display = (booBooValidator && booRegExpValidator && booFuncValidator) ? 'none' : 'block' ;
			// return a pass of fail boolean to whoever may want to know the results of the test
			return !(objWarningNode.style.display=='block');
		}
		function addQueryToClassName(that){
			var objNode = (typeof(this.nodeName)=='undefined') ? that : this ;
			// get the query parameter
			var strQueryParameter = getQueryParameter("class");
			// add to front of classNames
			if(strQueryParameter!=null) objNode.className = strQueryParameter + ' ' + objNode.className;
		}
		function addQueryToSrc(that){
			var objNode = (typeof(this.nodeName)=='undefined') ? that : this ;
			// get the query parameter
			var strQueryParameter = getQueryParameter("src")
			// add to front of classNames
			if(strQueryParameter!=null) objNode.src = objNode.src.replace('.','_'+strQueryParameter+'.');
		}
		
	// onload = parseForClasses;
		parseForClasses();

