/**********************************************************************************
 * 
 * LastChangedDate:		$Date: 2006-06-21 09:48:22 +0200 (Wed, 21 Jun 2006) $
 * LastChangedRevision	$Rev: 23 $
 * LastChangedBy:		$Author: $
 * HeadURL:				$URL: http://linux/cd/digitalcities/trunk/js/form.js $
 * ID:					$Id: form.js 23 2006-06-21 07:48:22Z  $
 * 
/**********************************************************************************/

// Create namespace
if ( ! window.nl.xd.util ) {
	window.nl.xd.util = {} ;
} ;

nl.xd.util.Form = function() {
	var form ;
	
	return {
		send: function( name ) {
			this.form = document.forms[ name ] ;
			return this.check() ;
		} ,
		check: function() {
			var check = true ;
			var inputs = this.form.getElementsByTagName( 'input' ) ;
			
			var selects = this.form.getElementsByTagName( 'select' ) ;
			var textareas = this.form.getElementsByTagName( 'textarea' ) ;
			
			for ( var i = 0; i < textareas.length; i++ ) {
				if ( ! this.checkTextarea( textareas[ i ] ) ) {
					check = false ;
				} ;
			} ;
			
			for ( var i = 0; i < selects.length; i++ ) {
				if ( ! this.checkSelect( selects[ i ] ) ) {
					check = false ;
				} ;
			} ;
			
			for ( var i = 0; i < inputs.length; i++ ) {
				switch ( inputs[i].type ) {
					case 'password' :
					case 'text' :
						if ( ! this.checkText( inputs[ i ] ) ) {
							check = false ;
						} ;
						break ;
					case 'radio' :
						if ( ! this.checkRadio( inputs[ i ] , inputs ) ) {
							check = false ;
						} ;
						break ;
				} ;
			} ;
			
			return check ;
		} ,
		checkRadio: function( element , elements ) {
			var parent = element.parentNode.parentNode.parentNode ;
			var key = parent.childNodes[ 0 ] ;
			
			for ( var i = 0; i < parent.childNodes.length; i++ ) {
				if ( parent.childNodes[ i ].nodeType == 1 ) {
					if ( parent.childNodes[ i ].innerHTML.search( /\*/ ) ) {
						for ( var p = 0; p < elements.length; p++ ) {
							if ( elements[ p ].name == element.name && elements[ p ].checked ) {
								return true ;
							} ;
						} ;
						
						return false ;
					} else {
						return true ;
					} ;
				} ;
			} ;
		} ,
		checkText: function( element ) {
			var parent = element.parentNode.parentNode ;
			var key = parent.childNodes[ 0 ] ;
			var checkLabelName = '';
			
			for ( var i = 0; i < parent.childNodes.length; i++ ) {
				if ( parent.childNodes[ i ].nodeType == 1 ) {
					if ( parent.childNodes[ i ].innerHTML.search( /\*/ ) != -1 && element.value == '' ) {
						nl.xd.util.DOM.addClass( parent.childNodes[ i ] , 'error' ) ;
						
						return false ;
					} else {
						check = true;
						checkLabelName = nl.xd.util.StringFunctions.Trim(parent.childNodes[ i ].innerHTML);
						if (parent.childNodes[ i ].innerHTML.indexOf( '(' ) > -1) {
							checkLabelName = nl.xd.util.StringFunctions.Trim(nl.xd.util.StringFunctions.Left(parent.childNodes[ i ].innerHTML, parent.childNodes[ i ].innerHTML.indexOf( '(' )));
						}
						switch(checkLabelName) {
							case 'Postcode*':
								check = this.checkValueWithRegExp(parent.childNodes[ i ], element, "^[0-9][0-9][0-9][0-9] ?[A-Z][A-Z]$" ,"ongeldig!");
							break;
							case 'Geb. datum*':
								check = this.checkValueWithRegExp(parent.childNodes[ i ], element, "^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\\d\\d$","ongeldige datum!");
							break;
							case 'E-mail adres*':
								check = this.checkValueWithRegExp(parent.childNodes[ i ], element, "^([-a-z0-9._]+@[-a-z0-9_]+(.[-a-z0-9_]+)+)*$", "ongeldig!");
							break;
							case 'E-mail*':
								check = this.checkValueWithRegExp(parent.childNodes[ i ], element, "^([-a-z0-9._]+@[-a-z0-9_]+(.[-a-z0-9_]+)+)*$", "ongeldig!");							
							break;
							case 'Telefoon*':
								check = this.checkValueWithRegExp(parent.childNodes[ i ], element, "^[-0-9+() ]*$", "ongeldig!");
							break;
						}
						if (check) {
							nl.xd.util.DOM.removeClass( parent.childNodes[ i ] , 'error' ) ;
						} 												
						
						return check ;
					} ;
				} ;
			} ;
		} ,
		checkSelect: function( element ) {
			var parent = element.parentNode.parentNode ;
			var key = parent.childNodes[ 0 ] ;
			
			for ( var i = 0; i < parent.childNodes.length; i++ ) {
				if ( parent.childNodes[ i ].nodeType == 1 ) {
					if ( parent.childNodes[ i ].innerHTML.search( /\*/ ) != -1 && ( element.options[ element.selectedIndex ].value == '' || element.options[ element.selectedIndex ].value == 0 ) ) {
						nl.xd.util.DOM.addClass( parent.childNodes[ i ] , 'error' ) ;
						
						return false ;
					} else {
						nl.xd.util.DOM.removeClass( parent.childNodes[ i ] , 'error' ) ;
						
						return true ;
					} ;
				} ;
			} ;
		} ,
		checkTextarea: function( element ) {
			var parent = element.parentNode.parentNode ;
			var key = parent.childNodes[ 0 ] ;
			
			for ( var i = 0; i < parent.childNodes.length; i++ ) {
				if ( parent.childNodes[ i ].nodeType == 1 ) {
					if ( parent.childNodes[ i ].innerHTML.search( /\*/ ) != -1 && element.value == '' ) {
						nl.xd.util.DOM.addClass( parent.childNodes[ i ] , 'error' ) ;
						
						return false ;
					} else {
						nl.xd.util.DOM.removeClass( parent.childNodes[ i ] , 'error' ) ;
						
						return true ;
					} ;
				} ;
			} ;
		},		
		checkValueWithRegExp: function(_label, element, regExpressie, errMsg) {
			if(window.RegExp) {
				var re=RegExp(regExpressie,"gi");
				if(!re.test(element.value)){
					nl.xd.util.DOM.addClass( _label , 'error' );
					//reset text to original
					if (_label.innerHTML.indexOf( '(' ) > -1) {
						_label.innerHTML = nl.xd.util.StringFunctions.Left(_label.innerHTML, _label.innerHTML.indexOf( '(' ));
					}
					_label.innerHTML = _label.innerHTML+ ' (' + errMsg + ')';
					return false;
				} else {
					//reset text to original
					if (_label.innerHTML.indexOf( '(' ) > -1) {
						_label.innerHTML = nl.xd.util.StringFunctions.Left(_label.innerHTML, _label.innerHTML.indexOf( '(' ));
					}
					return true;
				}
			}
			return true;
		}
	} ;
} () ;
